rune-grab 0.1.11 → 0.1.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/react.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/screenshot.ts","../src/targets/clipboard.ts","../src/targets/app.ts","../src/core/state.ts","../src/core/constants.ts","../src/ui/styles.ts","../src/ui/menu.ts","../src/core/sourcemap.ts","../src/core/frameworks.ts","../src/core/extract.ts","../src/ui/overlay.ts","../src/handlers/keyboard.ts","../src/handlers/inspect.ts","../src/handlers/capture.ts","../src/core/engine.ts","../src/hooks/react.ts"],"sourcesContent":["type CaptureProvider = (rect: DOMRect) => Promise<string | null>;\nlet customProvider: CaptureProvider | null = null;\n\nexport function setCaptureProvider(provider: CaptureProvider): void {\n customProvider = provider;\n}\n\nlet activeStream: MediaStream | null = null;\n\nasync function getStream(): Promise<MediaStream | null> {\n if (activeStream) {\n const tracks = activeStream.getVideoTracks();\n if (tracks.length > 0 && tracks[0].readyState === 'live') {\n return activeStream;\n }\n activeStream = null;\n }\n\n try {\n activeStream = await navigator.mediaDevices.getDisplayMedia({\n video: true,\n preferCurrentTab: true,\n selfBrowserSurface: 'include',\n } as any);\n\n activeStream!.getVideoTracks()[0].addEventListener('ended', () => {\n activeStream = null;\n });\n\n return activeStream;\n } catch {\n return null;\n }\n}\n\nasync function captureFromStream(\n stream: MediaStream,\n rect: DOMRect,\n format: string,\n quality: number,\n): Promise<string> {\n const video = document.createElement('video');\n video.srcObject = stream;\n video.muted = true;\n video.playsInline = true;\n\n await new Promise<void>((resolve, reject) => {\n video.onloadedmetadata = () => { video.play().then(resolve).catch(reject); };\n video.onerror = reject;\n });\n\n if ('requestVideoFrameCallback' in video) {\n await new Promise<void>((r) => (video as any).requestVideoFrameCallback(() => r()));\n } else {\n await new Promise((r) => setTimeout(r, 200));\n }\n\n const videoW = video.videoWidth;\n const videoH = video.videoHeight;\n const scaleX = videoW / window.innerWidth;\n const scaleY = videoH / window.innerHeight;\n\n const sx = rect.left * scaleX;\n const sy = rect.top * scaleY;\n const sw = rect.width * scaleX;\n const sh = rect.height * scaleY;\n\n const dpr = window.devicePixelRatio || 1;\n const canvas = document.createElement('canvas');\n canvas.width = rect.width * dpr;\n canvas.height = rect.height * dpr;\n const ctx = canvas.getContext('2d')!;\n ctx.drawImage(video, sx, sy, sw, sh, 0, 0, canvas.width, canvas.height);\n\n video.pause();\n video.srcObject = null;\n\n return canvas.toDataURL(format, quality);\n}\n\nexport async function captureRect(\n rect: { x: number; y: number; width: number; height: number },\n format: 'image/png' | 'image/jpeg' = 'image/png',\n quality = 0.92,\n): Promise<string | null> {\n if (rect.width === 0 || rect.height === 0) return null;\n\n try {\n const domRect = new DOMRect(rect.x, rect.y, rect.width, rect.height);\n\n if (customProvider) {\n return await customProvider(domRect);\n }\n\n const stream = await getStream();\n if (stream) {\n return await captureFromStream(stream, domRect, format, quality);\n }\n\n console.warn('[rune-grab] Screenshot permission was denied or unavailable. In Electron apps, use setCaptureProvider() instead.');\n return null;\n } catch (err) {\n console.warn('[rune-grab] Screenshot capture failed:', err);\n return null;\n }\n}\n\nexport function releaseStream(): void {\n if (activeStream) {\n activeStream.getTracks().forEach((t) => t.stop());\n activeStream = null;\n }\n}\n","import type { GrabResult } from '../core/types.js';\n\nexport async function copyToClipboard(result: GrabResult): Promise<boolean> {\n try {\n const items: Record<string, Blob> = {};\n\n items['text/plain'] = new Blob([result.text], { type: 'text/plain' });\n\n if (result.image) {\n const response = await fetch(result.image);\n const imageBlob = await response.blob();\n items['image/png'] = imageBlob;\n }\n\n await navigator.clipboard.write([\n new ClipboardItem(items),\n ]);\n return true;\n } catch {\n try {\n await navigator.clipboard.writeText(result.text);\n return true;\n } catch {\n return false;\n }\n }\n}\n","import type { GrabResult, TargetApp } from '../core/types.js';\nimport { copyToClipboard } from './clipboard.js';\n\nconst HELPER_PORT = 19274;\n\nasync function isHelperRunning(): Promise<boolean> {\n try {\n const ac = new AbortController();\n const timer = setTimeout(() => ac.abort(), 500);\n const res = await fetch(`http://127.0.0.1:${HELPER_PORT}/health`, {\n signal: ac.signal,\n });\n clearTimeout(timer);\n return res.ok;\n } catch {\n return false;\n }\n}\n\nasync function sendToHelper(target: TargetApp, result: GrabResult): Promise<boolean> {\n try {\n const res = await fetch(`http://127.0.0.1:${HELPER_PORT}/paste`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n target,\n text: result.text,\n image: result.image ?? null,\n label: result.label,\n }),\n });\n return res.ok;\n } catch {\n return false;\n }\n}\n\nexport const APP_BUNDLE_IDS: Record<TargetApp, string> = {\n claude: 'com.anthropic.claudefordesktop',\n cursor: 'com.todesktop.230313mzl4w4u92',\n codex: 'com.openai.codex',\n 'claude-code': '',\n clipboard: '',\n};\n\nexport const APP_NAMES: Record<TargetApp, string> = {\n claude: 'Claude',\n cursor: 'Cursor',\n codex: 'Codex',\n 'claude-code': 'Claude Code',\n clipboard: 'Clipboard',\n};\n\nexport async function sendToApp(target: TargetApp, result: GrabResult): Promise<{ success: boolean; method: 'auto' | 'clipboard' }> {\n await copyToClipboard(result);\n\n if (target === 'clipboard') {\n return { success: true, method: 'clipboard' };\n }\n\n const helperUp = await isHelperRunning();\n if (helperUp) {\n const ok = await sendToHelper(target, result);\n if (ok) return { success: true, method: 'auto' };\n }\n\n return { success: true, method: 'clipboard' };\n}\n\n","import type { RuneGrabConfig, TargetApp } from './types.js';\n\nconst isMac = typeof navigator !== 'undefined' && /Mac|iPhone|iPad/.test(navigator.platform);\n\nexport const DEFAULTS: Required<RuneGrabConfig> = {\n shortcut: isMac ? 'Meta+Shift+G' : 'Ctrl+Shift+G',\n target: 'clipboard',\n accentColor: '#f5f5f5',\n maxStackDepth: 3,\n onGrab: () => { },\n onToggle: () => { },\n showTargetPicker: true,\n skipComponents: [],\n};\n\nexport const s = {\n initialized: false,\n active: false,\n locked: false,\n promptMode: false,\n menuExpanded: false,\n targetsExpanded: false,\n grabType: 'screenshot' as 'screenshot' | 'reference',\n autoPasteEnabled: false,\n helperAvailable: false,\n helperChecking: false,\n dockedEdge: null as 'top' | 'bottom' | 'left' | 'right' | null,\n selectedElement: null as Element | null,\n mmRAF: 0,\n config: { ...DEFAULTS } as Required<RuneGrabConfig>,\n customSkipSet: undefined as Set<string> | undefined,\n miniMenu: null as HTMLDivElement | null,\n overlay: null as HTMLDivElement | null,\n label: null as HTMLDivElement | null,\n toolbar: null as HTMLDivElement | null,\n cursorStyle: null as HTMLStyleElement | null,\n selectionBox: null as HTMLDivElement | null,\n ssDrawing: false,\n ssStartX: 0,\n ssStartY: 0,\n lastMouseX: 0,\n lastMouseY: 0,\n dragging: false,\n dragPending: false,\n dragStartX: 0,\n dragStartY: 0,\n hasDragged: false,\n dragW: 0,\n dragH: 0,\n dragBaseX: 0,\n dragBaseY: 0,\n dragPointerId: -1,\n dragLastX: 0,\n dragLastY: 0,\n};\n","export const SKIP_PREFIXES = ['_', '$', 'Styled(', 'motion(', 'chakra(', 'withRouter(', 'connect(', 'styled.', 'styled(', 'tw.', 'rc-', '__'];\n\nexport function isLibraryFile(filePath: string): boolean {\n return filePath.includes('node_modules');\n}\n\nexport function isSourceFile(filePath: string): boolean {\n if (!filePath) return false;\n if (isLibraryFile(filePath)) return false;\n if (filePath.startsWith('webpack-internal:///node_modules/')) return false;\n return true;\n}\n\nexport const STYLE_PROPS = [\n 'display', 'position', 'overflow',\n 'width', 'height', 'minWidth', 'minHeight', 'maxWidth', 'maxHeight',\n 'flexDirection', 'flexWrap', 'justifyContent', 'alignItems', 'alignSelf', 'gap',\n 'gridTemplateColumns', 'gridTemplateRows',\n 'padding', 'margin',\n 'fontSize', 'fontWeight', 'fontFamily', 'lineHeight', 'letterSpacing',\n 'textAlign', 'textTransform', 'color',\n 'backgroundColor', 'backgroundImage',\n 'borderRadius', 'boxShadow',\n 'borderWidth', 'borderStyle', 'borderColor',\n 'opacity', 'transform', 'filter', 'backdropFilter',\n 'objectFit',\n];\n\nexport const STYLE_DEFAULTS = new Set([\n 'block', 'inline', 'none', 'normal', 'auto', '0px', 'transparent',\n 'rgba(0, 0, 0, 0)', 'start', 'visible', 'static', 'row', 'stretch',\n '0px 0px 0px 0px', 'baseline',\n]);\n\nexport const KEEP_ATTRS = ['type', 'href', 'src', 'alt', 'role', 'aria-label', 'placeholder', 'name', 'id', 'data-testid'];\n\nexport const Z_OVERLAY = 2147483640;\nexport const Z_TOOLBAR = 2147483641;\n\nexport const OWN_IDS = ['__rune-grab-overlay__', '__rune-grab-label__', '__rune-grab-toolbar__', '__rune-grab-menu__', '__rune-grab-selection__'];\n\nexport const DRAG_THRESHOLD_PX = 4;\n\nexport const HELPER_PORT = 19274;\n\nexport const HEALTH_CHECK_TIMEOUT_MS = 800;\n\nexport const FLASH_VISIBLE_MS = 1000;\n\nexport const FLASH_REMOVE_MS = 1200;\n\nexport const LS_KEY = '__rune-grab-autopaste__';\n","import type { TargetApp } from '../core/types.js';\n\nexport const FONT = `-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif`;\nexport const MONO = `ui-monospace,SFMono-Regular,Menlo,monospace`;\n\nexport const M_BG = '#f5f5f5';\nexport const M_FG = '#171717';\nexport const M_FG_DIM = '#737373';\nexport const M_BORDER = '#e5e5e5';\nexport const M_HOVER = '#ebebeb';\nexport const M_ACTIVE_BG = '#171717';\nexport const M_ACTIVE_FG = '#f5f5f5';\n\nexport const ICON_SS = `<svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"/><circle cx=\"8.5\" cy=\"8.5\" r=\"1.5\"/><polyline points=\"21 15 16 10 5 21\"/></svg>`;\nexport const ICON_REF = `<svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"16 18 22 12 16 6\"/><polyline points=\"8 6 2 12 8 18\"/></svg>`;\nexport const ICON_X = `<svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/></svg>`;\nexport const ICON_CHEVRON_RIGHT = `<svg width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"9 18 15 12 9 6\"/></svg>`;\nexport const ICON_CHEVRON_LEFT = `<svg width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"15 18 9 12 15 6\"/></svg>`;\nexport const ICON_SEND = '<svg width=\"10\" height=\"10\" viewBox=\"0 0 448 512\" fill=\"currentColor\"><path d=\"M34.9 289.5l-22.2-22.2c-9.4-9.4-9.4-24.6 0-33.9L207 39c9.4-9.4 24.6-9.4 33.9 0l194.3 194.3c9.4 9.4 9.4 24.6 0 33.9L413 289.4c-9.5 9.5-25 9.3-34.3-.4L264.5 168.6V456c0 13.3-10.7 24-24 24h-32c-13.3 0-24-10.7-24-24V168.6L70.2 289.1c-9.3 9.8-24.8 10-34.3.4z\"/></svg>';\nexport const ICON_GRIP = `<svg width=\"6\" height=\"10\" viewBox=\"0 0 6 10\" fill=\"currentColor\"><circle cx=\"1\" cy=\"1\" r=\"1\"/><circle cx=\"5\" cy=\"1\" r=\"1\"/><circle cx=\"1\" cy=\"5\" r=\"1\"/><circle cx=\"5\" cy=\"5\" r=\"1\"/><circle cx=\"1\" cy=\"9\" r=\"1\"/><circle cx=\"5\" cy=\"9\" r=\"1\"/></svg>`;\n\nexport const TARGET_LABELS: Record<TargetApp, string> = {\n clipboard: 'Clipboard',\n claude: 'Claude',\n cursor: 'Cursor',\n codex: 'Codex',\n 'claude-code': 'CLI',\n};\n\nexport const TARGETS_CLIPBOARD: TargetApp[] = ['clipboard'];\nexport const TARGETS_APPS: TargetApp[] = ['claude', 'cursor', 'codex', 'claude-code'];\n","import { Z_TOOLBAR, DRAG_THRESHOLD_PX, HELPER_PORT, HEALTH_CHECK_TIMEOUT_MS, LS_KEY } from '../core/constants.js';\nimport { s } from '../core/state.js';\nimport {\n FONT, MONO, M_BG, M_FG, M_FG_DIM, M_BORDER, M_HOVER, M_ACTIVE_BG, M_ACTIVE_FG,\n ICON_SS, ICON_REF, ICON_X, ICON_CHEVRON_RIGHT, ICON_CHEVRON_LEFT, ICON_GRIP,\n TARGET_LABELS, TARGETS_CLIPBOARD, TARGETS_APPS,\n} from './styles.js';\n\ntype ActivateFn = () => void;\ntype DeactivateFn = () => void;\ntype RenderFn = () => void;\n\nlet _activate: ActivateFn;\nlet _deactivate: DeactivateFn;\nlet _renderMiniMenu: RenderFn;\n\nexport function setMenuCallbacks(activate: ActivateFn, deactivate: DeactivateFn): void {\n _activate = activate;\n _deactivate = deactivate;\n}\n\nexport function loadAutoPastePref(): boolean {\n try { return localStorage.getItem(LS_KEY) === '1'; } catch { return false; }\n}\n\nexport function saveAutoPastePref(v: boolean): void {\n try { localStorage.setItem(LS_KEY, v ? '1' : '0'); } catch { }\n}\n\nexport async function checkHelper(): Promise<boolean> {\n try {\n const ac = new AbortController();\n const timer = setTimeout(() => ac.abort(), HEALTH_CHECK_TIMEOUT_MS);\n const res = await fetch(`http://127.0.0.1:${HELPER_PORT}/health`, {\n signal: ac.signal,\n });\n clearTimeout(timer);\n return res.ok;\n } catch { return false; }\n}\n\nasync function onAutoPasteToggle(enabled: boolean): Promise<void> {\n s.autoPasteEnabled = enabled;\n saveAutoPastePref(enabled);\n\n if (enabled) {\n s.helperChecking = true;\n renderMiniMenu();\n s.helperAvailable = await checkHelper();\n s.helperChecking = false;\n\n if (!s.helperAvailable) {\n s.config.target = 'clipboard';\n }\n } else {\n s.helperAvailable = false;\n s.config.target = 'clipboard';\n }\n\n renderMiniMenu();\n}\n\nfunction buildToggle(on: boolean, onChange: (v: boolean) => void): HTMLDivElement {\n const wrap = document.createElement('div');\n wrap.style.cssText = `display:inline-flex;align-items:center;flex-shrink:0;`;\n\n const track = document.createElement('div');\n track.style.cssText = `\n width:28px;height:16px;border-radius:8px;cursor:pointer;\n transition:background 0.15s;position:relative;\n background:${on ? M_ACTIVE_BG : '#d4d4d4'};\n `;\n\n const thumb = document.createElement('div');\n thumb.style.cssText = `\n width:12px;height:12px;border-radius:50%;\n background:${on ? M_ACTIVE_FG : '#fff'};\n position:absolute;top:2px;transition:left 0.15s;\n left:${on ? '14px' : '2px'};\n box-shadow:0 1px 2px rgba(0,0,0,0.15);\n `;\n track.appendChild(thumb);\n\n track.addEventListener('click', (e) => {\n e.stopPropagation();\n onChange(!on);\n });\n\n wrap.appendChild(track);\n return wrap;\n}\n\nfunction grabIconBtn(icon: string, isActive: boolean, onClick: () => void): HTMLButtonElement {\n const btn = document.createElement('button');\n btn.innerHTML = icon;\n btn.style.cssText = `\n width:28px;height:28px;border:none;border-radius:6px;cursor:pointer;\n display:flex;align-items:center;justify-content:center;padding:0;\n transition:all 0.15s;\n background:${isActive ? M_ACTIVE_BG : 'transparent'};\n color:${isActive ? M_ACTIVE_FG : M_FG_DIM};\n `;\n\n btn.addEventListener('mouseenter', () => {\n if (!isActive) { btn.style.background = M_HOVER; btn.style.color = M_FG; }\n });\n btn.addEventListener('mouseleave', () => {\n if (!isActive) { btn.style.background = 'transparent'; btn.style.color = M_FG_DIM; }\n });\n btn.addEventListener('click', (e) => { e.stopPropagation(); e.preventDefault(); onClick(); });\n\n return btn;\n}\n\nfunction sep(): HTMLDivElement {\n const d = document.createElement('div');\n d.style.cssText = `width:1px;height:16px;background:${M_BORDER};margin:0 2px;flex-shrink:0;`;\n return d;\n}\n\nfunction onGripPointerDown(e: PointerEvent): void {\n if (e.button !== 0 || !s.menuExpanded || !s.miniMenu) return;\n e.preventDefault();\n\n const grip = e.currentTarget as HTMLElement;\n grip.setPointerCapture(e.pointerId);\n s.dragPointerId = e.pointerId;\n\n s.dragStartX = e.clientX;\n s.dragStartY = e.clientY;\n s.dragPending = true;\n s.dragging = false;\n\n const rect = s.miniMenu.getBoundingClientRect();\n s.dragW = rect.width;\n s.dragH = rect.height;\n\n if (!s.hasDragged) {\n s.miniMenu.style.top = rect.top + 'px';\n s.miniMenu.style.left = rect.left + 'px';\n s.miniMenu.style.bottom = 'auto';\n s.miniMenu.style.right = 'auto';\n s.hasDragged = true;\n }\n\n s.dragBaseX = parseFloat(s.miniMenu.style.left) || rect.left;\n s.dragBaseY = parseFloat(s.miniMenu.style.top) || rect.top;\n s.dragLastX = s.dragBaseX;\n s.dragLastY = s.dragBaseY;\n}\n\nfunction onGripPointerMove(e: PointerEvent): void {\n if (e.pointerId !== s.dragPointerId || !s.miniMenu) return;\n if (!s.dragPending && !s.dragging) return;\n\n const dx = e.clientX - s.dragStartX;\n const dy = e.clientY - s.dragStartY;\n\n if (s.dragPending && !s.dragging) {\n if (Math.abs(dx) < DRAG_THRESHOLD_PX && Math.abs(dy) < DRAG_THRESHOLD_PX) return;\n s.dragging = true;\n s.dragPending = false;\n s.miniMenu.style.transition = 'none';\n s.miniMenu.style.willChange = 'left, top';\n document.body.style.cursor = 'grabbing';\n document.body.style.userSelect = 'none';\n }\n\n if (s.dragging) {\n const vw = document.documentElement.clientWidth;\n const vh = document.documentElement.clientHeight;\n s.dragLastX = Math.max(0, Math.min(s.dragBaseX + dx, vw - s.dragW));\n s.dragLastY = Math.max(0, Math.min(s.dragBaseY + dy, vh - s.dragH));\n s.miniMenu.style.left = s.dragLastX + 'px';\n s.miniMenu.style.top = s.dragLastY + 'px';\n }\n}\n\nfunction onGripPointerUp(e: PointerEvent): void {\n if (e.pointerId !== s.dragPointerId || !s.miniMenu) return;\n s.dragPointerId = -1;\n document.body.style.cursor = '';\n document.body.style.userSelect = '';\n\n if (s.dragging) {\n s.dragging = false;\n s.miniMenu.style.willChange = '';\n s.miniMenu.style.transition = 'left 0.15s ease, top 0.15s ease';\n\n s.miniMenu.style.pointerEvents = 'none';\n requestAnimationFrame(() => { if (s.miniMenu) s.miniMenu.style.pointerEvents = ''; });\n }\n s.dragPending = false;\n}\n\nfunction snapToNearestEdge(): void {\n if (!s.miniMenu) return;\n const rect = s.miniMenu.getBoundingClientRect();\n const cx = rect.left + rect.width / 2;\n const cy = rect.top + rect.height / 2;\n const vw = document.documentElement.clientWidth;\n const vh = document.documentElement.clientHeight;\n const distTop = cy;\n const distBottom = vh - cy;\n const distLeft = cx;\n const distRight = vw - cx;\n const minDist = Math.min(distTop, distBottom, distLeft, distRight);\n\n if (minDist === distTop) s.dockedEdge = 'top';\n else if (minDist === distBottom) s.dockedEdge = 'bottom';\n else if (minDist === distLeft) s.dockedEdge = 'left';\n else s.dockedEdge = 'right';\n\n s.miniMenu.style.transition = 'none';\n\n renderMiniMenu();\n\n requestAnimationFrame(() => {\n if (!s.miniMenu) return;\n const tabRect = s.miniMenu.getBoundingClientRect();\n const tw = tabRect.width;\n const th = tabRect.height;\n let targetX = parseFloat(s.miniMenu.style.left) || 0;\n let targetY = parseFloat(s.miniMenu.style.top) || 0;\n\n if (s.dockedEdge === 'top') targetY = 0;\n else if (s.dockedEdge === 'bottom') targetY = vh - th;\n else if (s.dockedEdge === 'left') targetX = 0;\n else if (s.dockedEdge === 'right') targetX = vw - tw;\n\n targetX = Math.max(0, Math.min(targetX, vw - tw));\n targetY = Math.max(0, Math.min(targetY, vh - th));\n\n s.miniMenu.style.transition = 'left 0.25s ease, top 0.25s ease';\n s.miniMenu.style.left = targetX + 'px';\n s.miniMenu.style.top = targetY + 'px';\n setTimeout(() => { if (s.miniMenu) s.miniMenu.style.transition = 'left 0.15s ease, top 0.15s ease'; }, 270);\n });\n}\n\nfunction clampToViewport(): void {\n if (!s.miniMenu || !s.hasDragged) return;\n\n const rect = s.miniMenu.getBoundingClientRect();\n let x = rect.left;\n let y = rect.top;\n let clamped = false;\n\n const vw = document.documentElement.clientWidth;\n const vh = document.documentElement.clientHeight;\n if (x + rect.width > vw) { x = vw - rect.width; clamped = true; }\n if (x < 0) { x = 0; clamped = true; }\n if (y + rect.height > vh) { y = vh - rect.height; clamped = true; }\n if (y < 0) { y = 0; clamped = true; }\n\n if (clamped) {\n s.miniMenu.style.transition = 'left 0.2s ease, top 0.2s ease';\n s.miniMenu.style.left = x + 'px';\n s.miniMenu.style.top = y + 'px';\n setTimeout(() => { if (s.miniMenu) s.miniMenu.style.transition = 'left 0.15s ease, top 0.15s ease'; }, 220);\n }\n}\n\nexport function createMiniMenu(): void {\n s.miniMenu = document.createElement('div');\n s.miniMenu.id = '__rune-grab-menu__';\n\n s.dockedEdge = 'bottom';\n s.menuExpanded = false;\n\n s.miniMenu.style.cssText = `\n position:fixed;z-index:${Z_TOOLBAR + 2};\n background:transparent;border:none;\n border-radius:9px;font-family:${FONT};\n box-shadow:none;\n transition:left 0.15s ease, top 0.15s ease;\n user-select:none;\n bottom:0px;right:16px;\n `;\n\n document.addEventListener('mousemove', (e) => { s.lastMouseX = e.clientX; s.lastMouseY = e.clientY; }, { passive: true });\n\n document.body.appendChild(s.miniMenu);\n renderMiniMenu();\n}\n\nexport function renderMiniMenu(): void {\n if (!s.miniMenu) return;\n const frag = document.createDocumentFragment();\n\n if (!s.menuExpanded) {\n s.miniMenu.style.padding = '0';\n s.miniMenu.style.border = 'none';\n s.miniMenu.style.boxShadow = 'none';\n s.miniMenu.style.background = 'transparent';\n\n let chevronSvg: string;\n let tabW: number;\n let tabH: number;\n let borderRadius: string;\n const edge = s.dockedEdge || 'bottom';\n\n if (edge === 'bottom') {\n chevronSvg = `<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"${M_FG}\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"18 15 12 9 6 15\"/></svg>`;\n tabW = 40; tabH = 28;\n borderRadius = '10px 10px 0 0';\n } else if (edge === 'top') {\n chevronSvg = `<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"${M_FG}\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"6 9 12 15 18 9\"/></svg>`;\n tabW = 40; tabH = 28;\n borderRadius = '0 0 10px 10px';\n } else if (edge === 'left') {\n chevronSvg = `<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"${M_FG}\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"9 18 15 12 9 6\"/></svg>`;\n tabW = 28; tabH = 40;\n borderRadius = '0 10px 10px 0';\n } else {\n chevronSvg = `<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"${M_FG}\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"15 18 9 12 15 6\"/></svg>`;\n tabW = 28; tabH = 40;\n borderRadius = '10px 0 0 10px';\n }\n\n const tab = document.createElement('button');\n tab.title = 'Rune Grab';\n tab.innerHTML = chevronSvg;\n tab.style.cssText = `\n width:${tabW}px;height:${tabH}px;border:none;cursor:pointer;\n display:flex;align-items:center;justify-content:center;\n background:${M_BG};color:${M_FG};\n border-radius:${borderRadius};\n box-shadow:0 2px 8px rgba(0,0,0,0.08),0 0 0 1px rgba(0,0,0,0.04);\n transition:background 0.12s;padding:0;\n `;\n tab.addEventListener('mouseenter', () => { tab.style.background = M_HOVER; });\n tab.addEventListener('mouseleave', () => { tab.style.background = M_BG; });\n tab.addEventListener('click', (e) => {\n e.stopPropagation();\n if (!s.miniMenu) return;\n\n const rect = s.miniMenu.getBoundingClientRect();\n s.miniMenu.style.bottom = 'auto';\n s.miniMenu.style.right = 'auto';\n s.miniMenu.style.top = rect.top + 'px';\n s.miniMenu.style.left = rect.left + 'px';\n s.hasDragged = true;\n\n s.menuExpanded = true;\n s.dockedEdge = null;\n\n s.miniMenu.style.background = M_BG;\n s.miniMenu.style.border = `1px solid ${M_BORDER}`;\n s.miniMenu.style.boxShadow = '0 2px 8px rgba(0,0,0,0.08),0 0 0 1px rgba(0,0,0,0.04)';\n s.miniMenu.style.borderRadius = '9px';\n\n s.miniMenu.style.transition = 'none';\n renderMiniMenu();\n s.miniMenu.offsetWidth;\n clampToViewport();\n });\n frag.appendChild(tab);\n s.miniMenu.textContent = '';\n s.miniMenu.appendChild(frag);\n return;\n }\n\n s.miniMenu.style.padding = '3px';\n\n const bar = document.createElement('div');\n bar.style.cssText = 'display:flex;align-items:center;gap:2px;';\n\n const grip = document.createElement('div');\n grip.style.cssText = `\n width:12px;height:28px;cursor:grab;display:flex;align-items:center;justify-content:center;\n flex-shrink:0;border-radius:4px;color:${M_FG_DIM};transition:color 0.12s;\n `;\n grip.innerHTML = ICON_GRIP;\n grip.addEventListener('mouseenter', () => { grip.style.color = M_FG; });\n grip.addEventListener('mouseleave', () => { if (!s.dragging) grip.style.color = M_FG_DIM; });\n grip.addEventListener('pointerdown', onGripPointerDown);\n grip.addEventListener('pointermove', onGripPointerMove);\n grip.addEventListener('pointerup', onGripPointerUp);\n grip.style.touchAction = 'none';\n bar.appendChild(grip);\n\n const ssActive = s.active && s.grabType === 'screenshot';\n bar.appendChild(grabIconBtn(ICON_SS, ssActive, () => {\n if (ssActive) { _deactivate(); }\n else { if (s.active) _deactivate(); s.grabType = 'screenshot'; _activate(); }\n renderMiniMenu();\n }));\n\n const refActive = s.active && s.grabType === 'reference';\n bar.appendChild(grabIconBtn(ICON_REF, refActive, () => {\n if (refActive) { _deactivate(); }\n else { if (s.active) _deactivate(); s.grabType = 'reference'; _activate(); }\n renderMiniMenu();\n }));\n\n bar.appendChild(sep());\n\n const visibleTargets = s.autoPasteEnabled && s.helperAvailable\n ? [...TARGETS_CLIPBOARD, ...TARGETS_APPS]\n : TARGETS_CLIPBOARD;\n\n const toggleBtn = document.createElement('button');\n toggleBtn.innerHTML = s.targetsExpanded ? ICON_CHEVRON_RIGHT : ICON_CHEVRON_LEFT;\n toggleBtn.title = s.targetsExpanded ? 'Collapse targets' : 'Send to…';\n toggleBtn.style.cssText = `\n width:24px;height:28px;border:none;background:transparent;cursor:pointer;\n display:flex;align-items:center;justify-content:center;border-radius:6px;\n color:${M_FG_DIM};transition:all 0.12s;padding:0;flex-shrink:0;\n `;\n toggleBtn.addEventListener('mouseenter', () => { toggleBtn.style.background = M_HOVER; toggleBtn.style.color = M_FG; });\n toggleBtn.addEventListener('mouseleave', () => { toggleBtn.style.background = 'transparent'; toggleBtn.style.color = M_FG_DIM; });\n toggleBtn.addEventListener('click', (e) => {\n e.stopPropagation();\n s.targetsExpanded = !s.targetsExpanded;\n\n if (targetsWrap) {\n if (s.targetsExpanded) {\n targetsWrap.style.width = 'auto';\n const naturalW = targetsWrap.scrollWidth;\n targetsWrap.style.width = '0px';\n targetsWrap.offsetWidth;\n targetsWrap.style.width = naturalW + 'px';\n targetsWrap.style.opacity = '1';\n setTimeout(() => { if (targetsWrap) targetsWrap.style.width = 'auto'; clampToViewport(); }, 200);\n } else {\n const currentW = targetsWrap.scrollWidth;\n targetsWrap.style.width = currentW + 'px';\n targetsWrap.offsetWidth;\n targetsWrap.style.width = '0px';\n targetsWrap.style.opacity = '0';\n }\n }\n\n toggleBtn.innerHTML = s.targetsExpanded ? ICON_CHEVRON_RIGHT : ICON_CHEVRON_LEFT;\n toggleBtn.title = s.targetsExpanded ? 'Collapse targets' : 'Send to…';\n });\n bar.appendChild(toggleBtn);\n\n const targetsWrap = document.createElement('div');\n targetsWrap.style.cssText = `\n display:flex;align-items:center;gap:2px;\n overflow:hidden;white-space:nowrap;\n transition:width 0.2s ease, opacity 0.15s ease;\n ${s.targetsExpanded ? 'opacity:1;' : 'width:0px;opacity:0;'}\n `;\n\n for (const t of visibleTargets) {\n const isCurrent = t === s.config.target;\n const btn = document.createElement('button');\n btn.textContent = TARGET_LABELS[t];\n btn.style.cssText = `\n height:28px;padding:0 8px;border:none;border-radius:6px;cursor:pointer;\n font-size:11px;font-weight:${isCurrent ? '600' : '500'};font-family:${FONT};\n transition:all 0.12s;flex-shrink:0;\n background:${isCurrent ? M_ACTIVE_BG : 'transparent'};\n color:${isCurrent ? M_ACTIVE_FG : M_FG_DIM};\n `;\n btn.addEventListener('mouseenter', () => {\n if (!isCurrent) btn.style.background = M_HOVER;\n });\n btn.addEventListener('mouseleave', () => {\n if (!isCurrent) btn.style.background = 'transparent';\n });\n btn.addEventListener('click', (e) => {\n e.stopPropagation();\n s.config.target = t;\n renderMiniMenu();\n });\n targetsWrap.appendChild(btn);\n }\n\n bar.appendChild(targetsWrap);\n\n if (s.targetsExpanded) bar.appendChild(sep());\n\n bar.appendChild(buildToggle(s.autoPasteEnabled, onAutoPasteToggle));\n\n if (s.autoPasteEnabled && !s.helperAvailable && !s.helperChecking) {\n bar.appendChild(sep());\n const hint = document.createElement('div');\n hint.style.cssText = `\n font-size:8px;font-family:${MONO};color:${M_FG_DIM};\n padding:0 6px;white-space:nowrap;flex-shrink:0;line-height:1.3;\n `;\n hint.innerHTML = `To enable auto pasting: add <br><span style=\"color:${M_FG};font-weight:600;\">rune-grab serve</span> to your dev script.`;\n bar.appendChild(hint);\n }\n\n if (s.helperChecking) {\n bar.appendChild(sep());\n const checking = document.createElement('span');\n checking.textContent = 'Connecting…';\n checking.style.cssText = `font-size:10px;font-family:${FONT};color:${M_FG_DIM};padding:0 4px;flex-shrink:0;`;\n bar.appendChild(checking);\n }\n\n const closeBtn = document.createElement('button');\n closeBtn.innerHTML = ICON_X;\n closeBtn.style.cssText = `\n width:28px;height:28px;border:none;background:transparent;cursor:pointer;\n display:flex;align-items:center;justify-content:center;border-radius:6px;\n color:${M_FG_DIM};transition:all 0.12s;padding:0;\n `;\n closeBtn.addEventListener('mouseenter', () => { closeBtn.style.background = M_HOVER; closeBtn.style.color = M_FG; });\n closeBtn.addEventListener('mouseleave', () => { closeBtn.style.background = 'transparent'; closeBtn.style.color = M_FG_DIM; });\n closeBtn.addEventListener('click', (e) => {\n e.stopPropagation();\n s.menuExpanded = false;\n\n if (!s.hasDragged && s.miniMenu) {\n const r = s.miniMenu.getBoundingClientRect();\n s.miniMenu.style.top = r.top + 'px';\n s.miniMenu.style.left = r.left + 'px';\n s.miniMenu.style.bottom = 'auto';\n s.miniMenu.style.right = 'auto';\n s.hasDragged = true;\n }\n\n snapToNearestEdge();\n });\n bar.appendChild(closeBtn);\n\n frag.appendChild(bar);\n s.miniMenu.textContent = '';\n s.miniMenu.appendChild(frag);\n}\n","const B64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\nconst charVal = new Uint8Array(128);\nfor (let i = 0; i < B64.length; i++) charVal[B64.charCodeAt(i)] = i;\n\ninterface Mapping {\n genLine: number;\n genCol: number;\n srcIdx: number;\n srcLine: number;\n srcCol: number;\n}\n\nfunction decodeMappings(encoded: string): Mapping[] {\n const mappings: Mapping[] = [];\n let genLine = 0;\n let genCol = 0;\n let srcIdx = 0;\n let srcLine = 0;\n let srcCol = 0;\n let i = 0;\n const len = encoded.length;\n\n while (i < len) {\n const ch = encoded.charCodeAt(i);\n if (ch === 59) {\n genLine++;\n genCol = 0;\n i++;\n } else if (ch === 44) {\n i++;\n } else {\n const fields: number[] = [];\n while (i < len && encoded.charCodeAt(i) !== 59 && encoded.charCodeAt(i) !== 44) {\n let value = 0;\n let shift = 0;\n let digit: number;\n do {\n digit = charVal[encoded.charCodeAt(i++)];\n value += (digit & 31) << shift;\n shift += 5;\n } while (digit & 32);\n fields.push(value & 1 ? -(value >> 1) : value >> 1);\n }\n if (fields.length >= 4) {\n genCol += fields[0];\n srcIdx += fields[1];\n srcLine += fields[2];\n srcCol += fields[3];\n mappings.push({ genLine, genCol, srcIdx, srcLine, srcCol });\n } else if (fields.length >= 1) {\n genCol += fields[0];\n }\n }\n }\n\n return mappings;\n}\n\ninterface ParsedMap {\n sources: string[];\n mappings: Mapping[];\n}\n\nconst cache = new Map<string, ParsedMap | null>();\nconst inflight = new Map<string, Promise<ParsedMap | null>>();\n\nasync function fetchSourceMap(moduleUrl: string): Promise<ParsedMap | null> {\n if (cache.has(moduleUrl)) return cache.get(moduleUrl)!;\n if (inflight.has(moduleUrl)) return inflight.get(moduleUrl)!;\n\n const promise = (async (): Promise<ParsedMap | null> => {\n try {\n const res = await fetch(moduleUrl);\n if (!res.ok) return null;\n const text = await res.text();\n const match = text.match(/\\/\\/[#@]\\s*sourceMappingURL=(.+?)(?:\\s|$)/);\n if (!match) return null;\n let mapJson: string;\n const url = match[1];\n if (url.startsWith('data:')) {\n const b64 = url.split(',')[1];\n mapJson = atob(b64);\n } else {\n const mapUrl = new URL(url, moduleUrl).href;\n const mapRes = await fetch(mapUrl);\n if (!mapRes.ok) return null;\n mapJson = await mapRes.text();\n }\n\n const raw = JSON.parse(mapJson);\n const mappings = decodeMappings(raw.mappings || '');\n return { sources: raw.sources || [], mappings };\n } catch {\n return null;\n }\n })();\n\n inflight.set(moduleUrl, promise);\n const result = await promise;\n cache.set(moduleUrl, result);\n inflight.delete(moduleUrl);\n return result;\n}\n\nexport interface ResolvedPosition {\n source: string;\n line: number;\n column: number;\n}\n\n/**\n * Resolve a generated (bundled) position back to the original source position.\n * @param moduleUrl - Full URL of the served module (e.g. http://localhost:5173/src/App.tsx?t=...)\n * @param genLine - 1-based line number in the bundled output\n * @param genCol - 0-based column number in the bundled output\n */\nexport async function resolveOriginalPosition(\n moduleUrl: string,\n genLine: number,\n genCol: number,\n): Promise<ResolvedPosition | null> {\n const map = await fetchSourceMap(moduleUrl);\n if (!map || map.mappings.length === 0) return null;\n const targetLine = genLine - 1;\n let best: Mapping | null = null;\n for (const m of map.mappings) {\n if (m.genLine === targetLine) {\n if (m.genCol <= genCol) {\n if (!best || m.genCol > best.genCol) best = m;\n }\n }\n if (m.genLine > targetLine) break;\n }\n\n if (!best) return null;\n let source = map.sources[best.srcIdx] || '';\n try {\n source = new URL(source, moduleUrl).href;\n } catch {\n }\n return {\n source,\n line: best.srcLine + 1,\n column: best.srcCol,\n };\n}\n\nexport function prewarmSourceMap(moduleUrl: string): void {\n fetchSourceMap(moduleUrl);\n}\n","import { SKIP_PREFIXES, isSourceFile } from './constants.js';\nimport { resolveOriginalPosition, prewarmSourceMap } from './sourcemap.js';\nimport type { ComponentInfo, ComponentFrame } from './types.js';\n\ninterface SourceLoc {\n fileName: string;\n lineNumber: number | null;\n columnNumber: number | null;\n _bundledUrl?: string;\n _bundledLine?: number;\n _bundledCol?: number;\n}\n\nconst pendingResolution = new WeakMap<\n ComponentInfo | ComponentFrame,\n { url: string; line: number; col: number }\n>();\n\nfunction isUsefulName(name: string, filePath: string | null, customSkip?: Set<string>): boolean {\n if (!name || name.length <= 1) return false;\n if (customSkip?.has(name)) return false;\n if (name[0] !== name[0].toUpperCase()) return false;\n for (const pfx of SKIP_PREFIXES) {\n if (name.startsWith(pfx)) return false;\n }\n if (/^[A-Z][a-zA-Z]+\\d+$/.test(name)) return false;\n if (filePath && !isSourceFile(filePath)) return false;\n return true;\n}\n\nfunction cleanFilePath(raw: string): string {\n return raw\n .replace(/^https?:\\/\\/[^/]+\\//, '')\n .replace(/^rsc:\\/\\/[^/]+\\/[^/]+\\//, '')\n .replace(/^webpack-internal:\\/\\/\\//, '')\n .replace(/^\\([\\w-]+\\)\\//, '')\n .replace(/\\?.*$/, '')\n .replace(/^\\/app\\//, '')\n .replace(/^\\.\\//, '');\n}\n\nfunction parseStackForSource(stack: string | undefined): SourceLoc | null {\n if (!stack) return null;\n const lines = stack.split('\\n');\n for (const line of lines) {\n const match = line.match(/\\((.+):(\\d+):(\\d+)\\)/) || line.match(/at\\s+(.+):(\\d+):(\\d+)/);\n if (match) {\n const rawUrl = match[1].trim();\n const cleaned = cleanFilePath(rawUrl);\n if (isSourceFile(cleaned)) {\n const bundledLine = parseInt(match[2], 10);\n const bundledCol = parseInt(match[3], 10);\n return {\n fileName: cleaned,\n lineNumber: bundledLine,\n columnNumber: bundledCol,\n _bundledUrl: rawUrl,\n _bundledLine: bundledLine,\n _bundledCol: bundledCol,\n };\n }\n }\n }\n return null;\n}\n\nfunction getSourceFromFiber(fiber: any): SourceLoc | null {\n if (fiber._debugSource) {\n return {\n fileName: fiber._debugSource.fileName,\n lineNumber: fiber._debugSource.lineNumber ?? null,\n columnNumber: fiber._debugSource.columnNumber ?? null,\n };\n }\n\n const debugStack = fiber._debugStack;\n if (debugStack) {\n const raw = typeof debugStack === 'string' ? debugStack : debugStack?.stack;\n const loc = parseStackForSource(raw);\n if (loc) {\n const canFetchMap = loc._bundledUrl?.startsWith('http');\n if (canFetchMap) {\n prewarmSourceMap(loc._bundledUrl!);\n return {\n fileName: loc.fileName,\n lineNumber: null,\n columnNumber: null,\n _bundledUrl: loc._bundledUrl,\n _bundledLine: loc._bundledLine,\n _bundledCol: loc._bundledCol,\n };\n }\n return {\n fileName: loc.fileName,\n lineNumber: loc._bundledLine ?? null,\n columnNumber: loc._bundledCol ?? null,\n };\n }\n }\n\n return null;\n}\n\nfunction getReactFiber(el: Element): any | null {\n const keys = Object.keys(el);\n for (const key of keys) {\n if (key.startsWith('__reactFiber$') || key.startsWith('__reactInternalInstance$')) {\n return (el as any)[key];\n }\n }\n return null;\n}\n\nfunction storePendingResolution(target: ComponentInfo | ComponentFrame, src: SourceLoc): void {\n if (src._bundledUrl && src._bundledLine != null) {\n pendingResolution.set(target, {\n url: src._bundledUrl,\n line: src._bundledLine,\n col: src._bundledCol ?? 0,\n });\n }\n}\n\nfunction getReactComponentInfo(el: Element, customSkip?: Set<string>): ComponentInfo | null {\n const fiber = getReactFiber(el);\n if (!fiber) return null;\n\n const elementSrc = getSourceFromFiber(fiber);\n let isFirst = true;\n\n let cur = fiber;\n while (cur) {\n if (cur.type && typeof cur.type === 'function') {\n const name = cur.type.displayName || cur.type.name;\n const src = isFirst && elementSrc ? elementSrc : getSourceFromFiber(cur);\n const filePath = src?.fileName ? cleanFilePath(src.fileName) : null;\n if (name && filePath && isUsefulName(name, filePath, customSkip)) {\n const info: ComponentInfo = {\n name,\n filePath,\n line: src?.lineNumber ?? null,\n column: src?.columnNumber ?? null,\n };\n if (src) storePendingResolution(info, src);\n return info;\n }\n isFirst = false;\n }\n if (cur.type?.$$typeof) {\n const inner = cur.type.render || cur.type.type;\n if (inner && typeof inner === 'function') {\n const name = inner.displayName || inner.name;\n const src = isFirst && elementSrc ? elementSrc : getSourceFromFiber(cur);\n const filePath = src?.fileName ? cleanFilePath(src.fileName) : null;\n if (name && filePath && isUsefulName(name, filePath, customSkip)) {\n const info: ComponentInfo = {\n name,\n filePath,\n line: src?.lineNumber ?? null,\n column: src?.columnNumber ?? null,\n };\n if (src) storePendingResolution(info, src);\n return info;\n }\n isFirst = false;\n }\n }\n cur = cur.return;\n }\n return null;\n}\n\nfunction getReactComponentStack(el: Element, maxDepth = 6, customSkip?: Set<string>): ComponentFrame[] {\n const fiber = getReactFiber(el);\n if (!fiber) return [];\n\n const elementSrc = getSourceFromFiber(fiber);\n\n const stack: ComponentFrame[] = [];\n const seen = new Set<string>();\n let cur = fiber;\n let isFirst = true;\n\n while (cur && stack.length < maxDepth) {\n let name: string | null = null;\n let src: SourceLoc | null = null;\n\n if (cur.type && typeof cur.type === 'function') {\n name = cur.type.displayName || cur.type.name;\n src = isFirst && elementSrc ? elementSrc : getSourceFromFiber(cur);\n } else if (cur.type?.$$typeof) {\n const inner = cur.type.render || cur.type.type;\n if (inner && typeof inner === 'function') {\n name = inner.displayName || inner.name;\n src = isFirst && elementSrc ? elementSrc : getSourceFromFiber(cur);\n }\n }\n\n let filePath = src?.fileName ? cleanFilePath(src.fileName) : null;\n if (name && filePath && isUsefulName(name, filePath, customSkip) && !seen.has(name)) {\n seen.add(name);\n const frame: ComponentFrame = { name, filePath, line: src?.lineNumber ?? null };\n if (src) storePendingResolution(frame, src);\n stack.push(frame);\n isFirst = false;\n }\n cur = cur.return;\n }\n return stack;\n}\n\nfunction getVueComponentInfo(el: Element): ComponentInfo | null {\n let cur: Element | null = el;\n while (cur) {\n const vueInstance = (cur as any).__vueParentComponent;\n if (vueInstance) {\n const name = vueInstance.type?.name || vueInstance.type?.__name;\n if (name) {\n const file = vueInstance.type?.__file ?? null;\n return { name, filePath: file, line: null, column: null };\n }\n }\n const vue2 = (cur as any).__vue__;\n if (vue2) {\n const name = vue2.$options?.name || vue2.$options?._componentTag;\n if (name) {\n const file = vue2.$options?.__file ?? null;\n return { name, filePath: file, line: null, column: null };\n }\n }\n cur = cur.parentElement;\n }\n return null;\n}\n\nfunction getSvelteComponentInfo(el: Element): ComponentInfo | null {\n const meta = (el as any).__svelte_meta;\n if (meta?.loc) {\n const file = meta.loc.file;\n const name = file ? file.split('/').pop()?.replace(/\\.svelte$/, '') : null;\n if (name) {\n return { name, filePath: file, line: meta.loc.line ?? null, column: meta.loc.column ?? null };\n }\n }\n const keys = Object.keys(el);\n for (const key of keys) {\n if (key.startsWith('__svelte')) {\n return { name: 'SvelteComponent', filePath: null, line: null, column: null };\n }\n }\n return null;\n}\n\nexport function detectComponent(el: Element, customSkip?: Set<string>): ComponentInfo | null {\n return getReactComponentInfo(el, customSkip)\n || getVueComponentInfo(el)\n || getSvelteComponentInfo(el)\n || null;\n}\n\nexport function detectComponentStack(el: Element, maxDepth = 6, customSkip?: Set<string>): ComponentFrame[] {\n const reactStack = getReactComponentStack(el, maxDepth, customSkip);\n if (reactStack.length > 0) return reactStack;\n\n const info = getVueComponentInfo(el) || getSvelteComponentInfo(el);\n if (info) {\n return [{ name: info.name, filePath: info.filePath, line: info.line }];\n }\n return [];\n}\n\nexport async function resolveComponentInfo(info: ComponentInfo): Promise<void> {\n if (info.line != null) return;\n const pending = pendingResolution.get(info);\n if (!pending) return;\n\n const resolved = await resolveOriginalPosition(pending.url, pending.line, pending.col);\n if (resolved) {\n info.line = resolved.line;\n info.column = resolved.column;\n if (resolved.source) {\n info.filePath = cleanFilePath(resolved.source);\n }\n }\n pendingResolution.delete(info);\n}\n\nexport async function resolveComponentFrame(frame: ComponentFrame): Promise<void> {\n if (frame.line != null) return;\n const pending = pendingResolution.get(frame);\n if (!pending) return;\n\n const resolved = await resolveOriginalPosition(pending.url, pending.line, pending.col);\n if (resolved) {\n frame.line = resolved.line;\n if (resolved.source) {\n frame.filePath = cleanFilePath(resolved.source);\n }\n }\n pendingResolution.delete(frame);\n}\n","import { STYLE_PROPS, STYLE_DEFAULTS, KEEP_ATTRS } from './constants.js';\nimport { detectComponent, detectComponentStack, resolveComponentInfo, resolveComponentFrame } from './frameworks.js';\nimport type { ElementMeta, ComponentFrame } from './types.js';\n\nexport function isLocalhost(): boolean {\n const h = location.hostname;\n return h === 'localhost' || h === '127.0.0.1' || h === '0.0.0.0' || h.endsWith('.local');\n}\n\nfunction getVisibleText(el: Element): string {\n let text = '';\n function walk(node: Node) {\n if (node.nodeType === 3) {\n const t = (node.textContent || '').trim();\n if (t) text += (text ? ' ' : '') + t;\n } else if (node.nodeType === 1) {\n for (let i = 0; i < node.childNodes.length; i++) walk(node.childNodes[i]);\n }\n }\n walk(el);\n if (!text) {\n text = (el as HTMLElement).getAttribute('value')\n || el.getAttribute('alt')\n || el.getAttribute('aria-label')\n || (el as HTMLInputElement).placeholder\n || '';\n }\n if (text.length > 80) text = text.slice(0, 80) + '...';\n return text;\n}\n\nfunction getTagDisplay(el: Element): string {\n let tag = el.tagName.toLowerCase();\n if (el.id) tag += '#' + el.id;\n const cls = Array.from(el.classList)\n .filter((c) => !c.startsWith('__rune-grab'))\n .slice(0, 3);\n if (cls.length) tag += '.' + cls.join('.');\n return tag;\n}\n\nfunction getKeyStyles(el: Element): string {\n const cs = window.getComputedStyle(el);\n const out: string[] = [];\n\n for (const prop of STYLE_PROPS) {\n const cssProp = prop.replace(/[A-Z]/g, (m) => '-' + m.toLowerCase());\n const v = cs.getPropertyValue(cssProp);\n if (!v || STYLE_DEFAULTS.has(v)) continue;\n if (prop === 'fontSize' && v === '16px') continue;\n if (prop === 'fontWeight' && (v === '400' || v === 'normal')) continue;\n if (prop === 'color' && v === 'rgb(0, 0, 0)') continue;\n if (prop === 'lineHeight' && v === 'normal') continue;\n if (prop === 'letterSpacing' && v === 'normal') continue;\n if (prop === 'textAlign' && v === 'start') continue;\n if (prop === 'opacity' && v === '1') continue;\n if (prop === 'borderWidth' && v === '0px') continue;\n if ((prop === 'padding' || prop === 'margin') && (v === '0px' || /^0px(\\s+0px)*$/.test(v))) continue;\n if (prop === 'fontFamily') {\n const first = v.split(',')[0].trim().replace(/^[\"']+|[\"']+$/g, '');\n if (!first || ['system-ui', 'sans-serif', 'serif', 'monospace', '-apple-system'].includes(first)) continue;\n out.push('fontFamily: ' + first);\n continue;\n }\n out.push(prop + ': ' + v);\n }\n return out.join('; ');\n}\n\nfunction cleanHTML(el: Element): string {\n const tag = el.tagName.toLowerCase();\n const attrs: string[] = [];\n\n for (const attr of KEEP_ATTRS) {\n const v = el.getAttribute(attr);\n if (v) attrs.push(`${attr}=\"${v}\"`);\n }\n\n const cls = Array.from(el.classList).filter((c) => !/^(css-|chakra-|__rune)/.test(c));\n if (cls.length) attrs.push(`class=\"${cls.join(' ')}\"`);\n\n const open = `<${tag}${attrs.length ? ' ' + attrs.join(' ') : ''}>`;\n const close = `</${tag}>`;\n\n let text = '';\n el.childNodes.forEach((n) => {\n if (n.nodeType === 3) text += (n.textContent || '').trim();\n });\n\n const childCount = el.children.length;\n let inner = text;\n if (childCount > 0) {\n inner = (text ? text + ' ' : '') + `[${childCount} child element${childCount > 1 ? 's' : ''}]`;\n }\n if (inner.length > 200) inner = inner.slice(0, 200) + '...';\n\n return open + inner + close;\n}\n\nexport function extractElementMeta(el: Element, customSkip?: Set<string>): ElementMeta {\n const local = isLocalhost();\n const component = detectComponent(el, customSkip);\n const tag = getTagDisplay(el);\n const visibleText = getVisibleText(el);\n const html = cleanHTML(el);\n\n const meta: ElementMeta = {\n tag,\n visibleText,\n html,\n attrs: {\n role: el.getAttribute('role') || undefined,\n ariaLabel: el.getAttribute('aria-label') || undefined,\n alt: el.getAttribute('alt') || undefined,\n placeholder: (el as HTMLInputElement).placeholder || undefined,\n type: el.getAttribute('type') || undefined,\n href: el.getAttribute('href') || undefined,\n id: el.id || undefined,\n testId: el.getAttribute('data-testid') || undefined,\n },\n component: component || undefined,\n isLocal: local,\n };\n\n if (local) {\n meta.componentStack = detectComponentStack(el, 3, customSkip);\n } else {\n meta.styles = getKeyStyles(el);\n }\n\n return meta;\n}\n\nexport function buildLabel(meta: ElementMeta): string {\n const textPart = meta.visibleText ? `\"${meta.visibleText.slice(0, 30)}\"` : '';\n const tagPart = meta.tag.split('.')[0].split('#')[0];\n\n let elType: string;\n if (tagPart === 'button' || meta.attrs.role === 'button') elType = 'button';\n else if (tagPart === 'a') elType = 'link';\n else if (tagPart === 'input') elType = `${meta.attrs.type || 'text'} input`;\n else if (tagPart === 'img') elType = 'image';\n else if (tagPart === 'textarea') elType = 'textarea';\n else if (/^h[1-6]$/.test(tagPart)) elType = 'heading';\n else if (['nav', 'section', 'article', 'main', 'aside', 'footer', 'header'].includes(tagPart)) elType = tagPart;\n else elType = `<${tagPart}>`;\n\n let label = textPart ? `${textPart} ${elType}` : elType;\n\n if (meta.component?.name || meta.component?.filePath || meta.isLocal) {\n label += ' in:';\n }\n\n if (label.length > 80) label = label.slice(0, 77) + '...';\n return label;\n}\n\nexport function buildContextText(meta: ElementMeta, prompt?: string): string {\n const parts: string[] = [];\n\n if (prompt) parts.push(prompt);\n parts.push(buildLabel(meta));\n if (meta.isLocal && meta.componentStack?.length) {\n const frame = meta.componentStack[0];\n let line = ` ${frame.name}`;\n if (frame.filePath) {\n line += ` at ${frame.filePath}`;\n if (frame.line) line += `:${frame.line}`;\n }\n parts.push(line);\n } else if (meta.component) {\n let line = ` ${meta.component.name}`;\n if (meta.component.filePath) {\n line += ` at ${meta.component.filePath}`;\n if (meta.component.line) line += `:${meta.component.line}`;\n }\n parts.push(line);\n } else if (meta.isLocal) {\n const pagePath = location.pathname.replace(/^\\//, '') || 'index.html';\n parts.push(` ${pagePath}`);\n }\n\n return parts.join('\\n');\n}\n\nexport async function resolveElementMeta(meta: ElementMeta): Promise<void> {\n const promises: Promise<void>[] = [];\n if (meta.component) {\n promises.push(resolveComponentInfo(meta.component));\n }\n if (meta.componentStack) {\n for (const frame of meta.componentStack) {\n promises.push(resolveComponentFrame(frame));\n }\n }\n await Promise.all(promises);\n}\n","import { Z_OVERLAY, Z_TOOLBAR, OWN_IDS, FLASH_VISIBLE_MS, FLASH_REMOVE_MS } from '../core/constants.js';\nimport { extractElementMeta, resolveElementMeta } from '../core/extract.js';\nimport { isLocalhost } from '../core/extract.js';\nimport { s } from '../core/state.js';\nimport { FONT, MONO, M_BG, M_FG, M_FG_DIM, M_BORDER, M_ACTIVE_BG, M_ACTIVE_FG, ICON_SEND } from './styles.js';\n\nexport function isOwnElement(el: Element | null): boolean {\n if (!el) return false;\n let cur: Element | null = el;\n while (cur) {\n if (cur.id && OWN_IDS.includes(cur.id)) return true;\n cur = cur.parentElement;\n }\n return false;\n}\n\nfunction getToolbarBase(): string {\n return `position:fixed;z-index:${Z_TOOLBAR};background:${M_BG};border:1px solid ${M_BORDER};border-radius:9px;box-shadow:0 2px 8px rgba(0,0,0,0.08),0 0 0 1px rgba(0,0,0,0.04);display:none;flex-direction:row;align-items:center;top:0;left:0;font-family:${FONT};`;\n}\n\nexport function createGrabOverlay(): void {\n if (s.overlay) return;\n\n s.overlay = document.createElement('div');\n s.overlay.id = '__rune-grab-overlay__';\n s.overlay.style.cssText = `position:fixed;pointer-events:none;z-index:${Z_OVERLAY};border:1px dashed ${M_BG};background:transparent;border-radius:3px;transition:all 0.08s ease-out;display:none;top:0;left:0;width:0;height:0;`;\n\n s.label = document.createElement('div');\n s.label.id = '__rune-grab-label__';\n s.label.style.cssText = `position:fixed;pointer-events:none;z-index:${Z_TOOLBAR};background:${M_BG};border:1px solid ${M_BORDER};color:${M_FG};font-size:10px;font-family:${MONO};padding:2px 6px;border-radius:5px;white-space:nowrap;display:none;top:0;left:0;line-height:1.4;font-weight:500;letter-spacing:0.01em;box-shadow:0 2px 8px rgba(0,0,0,0.08);`;\n\n s.toolbar = document.createElement('div');\n s.toolbar.id = '__rune-grab-toolbar__';\n s.toolbar.style.cssText = getToolbarBase() + 'padding:4px;gap:2px;';\n\n s.cursorStyle = document.createElement('style');\n s.cursorStyle.id = '__rune-grab-cursor__';\n s.cursorStyle.textContent = '.__rune-grab-active__ *{cursor:crosshair !important;}.__rune-grab-active__{cursor:crosshair !important;}';\n\n document.head.appendChild(s.cursorStyle);\n document.body.appendChild(s.overlay);\n document.body.appendChild(s.label);\n document.body.appendChild(s.toolbar);\n}\n\nexport function removeGrabOverlay(): void {\n s.overlay?.remove();\n s.label?.remove();\n s.toolbar?.remove();\n s.cursorStyle?.remove();\n s.overlay = null;\n s.label = null;\n s.toolbar = null;\n s.cursorStyle = null;\n}\n\nexport function createSelectionBox(): void {\n if (s.selectionBox) return;\n s.selectionBox = document.createElement('div');\n s.selectionBox.id = '__rune-grab-selection__';\n s.selectionBox.style.cssText = `\n position:fixed;z-index:${Z_OVERLAY};\n border:1px dashed ${M_BG};\n background:transparent;\n border-radius:2px;display:none;\n pointer-events:none;\n top:0;left:0;width:0;height:0;\n `;\n document.body.appendChild(s.selectionBox);\n}\n\nexport function removeSelectionBox(): void {\n s.selectionBox?.remove();\n s.selectionBox = null;\n}\n\nexport function doHighlight(el: Element): void {\n if (!s.overlay || !s.label) return;\n const r = el.getBoundingClientRect();\n s.overlay.style.top = r.top + 'px';\n s.overlay.style.left = r.left + 'px';\n s.overlay.style.width = r.width + 'px';\n s.overlay.style.height = r.height + 'px';\n s.overlay.style.display = 'block';\n\n const meta = extractElementMeta(el, s.customSkipSet);\n\n function formatDisplayName(): string {\n if (isLocalhost() && meta.component) {\n let dn = meta.component.name;\n if (meta.component.filePath) {\n const parts = meta.component.filePath.split('/');\n dn += ` · ${parts[parts.length - 1]}`;\n if (meta.component.line) dn += `:${meta.component.line}`;\n }\n return dn;\n }\n return meta.component ? `<${meta.component.name}>` : `<${meta.tag}>`;\n }\n\n s.label.textContent = formatDisplayName();\n\n // Async: resolve source-mapped lines and update label when ready\n if (isLocalhost() && meta.component && !meta.component.line) {\n resolveElementMeta(meta).then(() => {\n if (s.label && s.selectedElement === el) {\n s.label.textContent = formatDisplayName();\n }\n });\n }\n s.label.style.display = 'block';\n let lt = r.top - 22;\n if (lt < 4) lt = r.bottom + 4;\n s.label.style.top = lt + 'px';\n s.label.style.left = r.left + 'px';\n}\n\nexport function hideHighlight(): void {\n if (s.overlay) s.overlay.style.display = 'none';\n if (s.label) s.label.style.display = 'none';\n}\n\nexport function hideToolbar(): void {\n if (s.toolbar) s.toolbar.style.display = 'none';\n}\n\nexport function flash(msg: string): void {\n if (!document.body) return;\n const f = document.createElement('div');\n f.textContent = msg;\n\n let x = s.lastMouseX + 12;\n let y = s.lastMouseY - 30;\n\n if (x + 150 > window.innerWidth) x = s.lastMouseX - 150;\n if (y < 4) y = s.lastMouseY + 16;\n\n f.style.cssText = `position:fixed;z-index:${Z_TOOLBAR + 3};top:${y}px;left:${x}px;background:${M_BG};color:${M_FG};font-size:11px;font-family:${FONT};padding:5px 12px;border-radius:7px;font-weight:500;pointer-events:none;opacity:1;transition:opacity 0.3s ease-out;box-shadow:0 2px 8px rgba(0,0,0,0.08),0 0 0 1px rgba(0,0,0,0.04);border:1px solid ${M_BORDER};`;\n document.body.appendChild(f);\n setTimeout(() => (f.style.opacity = '0'), FLASH_VISIBLE_MS);\n setTimeout(() => f.remove(), FLASH_REMOVE_MS);\n}\n\nexport function showPromptInput(onSubmit: (prompt: string) => void): void {\n if (!s.toolbar) return;\n s.promptMode = true;\n const prevTop = s.toolbar.style.top;\n const prevLeft = s.toolbar.style.left;\n s.toolbar.innerHTML = '';\n s.toolbar.style.cssText = getToolbarBase() + 'padding:3px 4px 3px 10px;gap:6px;';\n s.toolbar.style.top = prevTop;\n s.toolbar.style.left = prevLeft;\n\n const input = document.createElement('input');\n input.type = 'text';\n input.placeholder = 'Comment (Enter ↵ send, Esc cancel)';\n input.className = '__rune-grab-prompt__';\n input.style.cssText = `background:transparent;border:none;outline:none;color:${M_FG};font-size:12px;font-family:${FONT};width:230px;padding:2px 0;caret-color:${M_FG};`;\n\n // Inject placeholder style — can't set ::placeholder via inline styles\n if (!document.getElementById('__rune-grab-placeholder-style__')) {\n const style = document.createElement('style');\n style.id = '__rune-grab-placeholder-style__';\n style.textContent = `.__rune-grab-prompt__::placeholder{color:${M_FG_DIM} !important;opacity:1 !important;}`;\n document.head.appendChild(style);\n }\n\n const sendBtn = document.createElement('button');\n sendBtn.innerHTML = ICON_SEND;\n sendBtn.style.cssText = `width:22px;height:22px;border:1px solid ${M_BORDER};background:${M_ACTIVE_BG};color:${M_ACTIVE_FG};border-radius:50%;cursor:pointer;display:flex;align-items:center;justify-content:center;flex-shrink:0;transition:all 0.15s;`;\n\n function submit() {\n let prompt = input.value.trim();\n if (prompt && !prompt.endsWith(':')) prompt += ':';\n s.promptMode = false;\n onSubmit(prompt);\n }\n\n function cancel() {\n s.promptMode = false;\n s.locked = false;\n hideToolbar();\n hideHighlight();\n s.selectedElement = null;\n }\n\n sendBtn.addEventListener('click', (e) => { e.stopPropagation(); e.preventDefault(); submit(); });\n input.addEventListener('keydown', (e) => {\n e.stopPropagation();\n if (e.key === 'Enter') { e.preventDefault(); submit(); }\n if (e.key === 'Escape') { e.preventDefault(); cancel(); }\n });\n input.addEventListener('click', (e) => e.stopPropagation());\n\n s.toolbar.appendChild(input);\n s.toolbar.appendChild(sendBtn);\n\n const tw = 270;\n const curLeft = parseFloat(s.toolbar.style.left);\n if (curLeft + tw > window.innerWidth - 8) {\n s.toolbar.style.left = Math.max(8, window.innerWidth - tw - 8) + 'px';\n }\n s.toolbar.style.display = 'flex';\n setTimeout(() => input.focus(), 0);\n}\n","import { s } from '../core/state.js';\n\nexport function parseShortcut(shortcut: string) {\n const parts = shortcut.split('+');\n return {\n key: parts[parts.length - 1].toLowerCase(),\n meta: parts.some((p) => /^(meta|cmd)$/i.test(p)),\n ctrl: parts.some((p) => /^(ctrl|control)$/i.test(p)),\n shift: parts.some((p) => /^shift$/i.test(p)),\n alt: parts.some((p) => /^(alt|option)$/i.test(p)),\n };\n}\n\ntype ToggleFn = () => void;\ntype RenderFn = () => void;\n\nlet _toggle: ToggleFn;\nlet _renderMiniMenu: RenderFn;\n\nexport function setKeyboardCallbacks(toggle: ToggleFn, renderMiniMenu: RenderFn): void {\n _toggle = toggle;\n _renderMiniMenu = renderMiniMenu;\n}\n\nexport function onShortcut(e: KeyboardEvent): void {\n const sc = parseShortcut(s.config.shortcut);\n if (e.key.toLowerCase() === sc.key && e.metaKey === sc.meta && e.ctrlKey === sc.ctrl && e.shiftKey === sc.shift && e.altKey === sc.alt) {\n e.preventDefault();\n _toggle();\n _renderMiniMenu();\n }\n}\n","import { extractElementMeta, buildLabel, buildContextText, resolveElementMeta } from '../core/extract.js';\nimport { s } from '../core/state.js';\nimport { isOwnElement, doHighlight, hideHighlight, hideToolbar, showPromptInput, flash } from '../ui/overlay.js';\nimport { TARGET_LABELS } from '../ui/styles.js';\nimport type { GrabResult } from '../core/types.js';\n\ntype DispatchFn = (result: GrabResult) => Promise<void>;\ntype DeactivateFn = () => void;\ntype RenderFn = () => void;\n\nlet _dispatch: DispatchFn;\nlet _deactivate: DeactivateFn;\nlet _renderMiniMenu: RenderFn;\n\nexport function setReferenceCallbacks(dispatch: DispatchFn, deactivate: DeactivateFn, renderMiniMenu: RenderFn): void {\n _dispatch = dispatch;\n _deactivate = deactivate;\n _renderMiniMenu = renderMiniMenu;\n}\n\nasync function executeReferenceGrab(el: Element, prompt: string): Promise<void> {\n const meta = extractElementMeta(el, s.customSkipSet);\n await resolveElementMeta(meta);\n const labelText = buildLabel(meta);\n const contextText = buildContextText(meta, prompt);\n\n const result: GrabResult = {\n type: 'reference', label: labelText, text: contextText, prompt, meta,\n };\n await _dispatch(result);\n flash(`Sent to ${TARGET_LABELS[s.config.target]}`);\n\n s.locked = false;\n hideToolbar();\n hideHighlight();\n s.selectedElement = null;\n}\n\nfunction showPromptForGrab(el: Element): void {\n if (!s.toolbar) return;\n const r = el.getBoundingClientRect();\n const tw = 270;\n const th = 34;\n let top = r.bottom + 6;\n let left = r.left + (r.width / 2) - (tw / 2);\n if (top + th > window.innerHeight - 8) top = r.top - th - 6;\n if (left < 8) left = 8;\n if (left + tw > window.innerWidth - 8) left = window.innerWidth - tw - 8;\n s.toolbar.style.top = top + 'px';\n s.toolbar.style.left = left + 'px';\n\n showPromptInput(async (prompt) => {\n await executeReferenceGrab(el, prompt);\n });\n}\n\nexport function onRefMouseMove(e: MouseEvent): void {\n if (s.locked || s.mmRAF) return;\n s.mmRAF = requestAnimationFrame(() => {\n s.mmRAF = 0;\n const el = document.elementFromPoint(e.clientX, e.clientY);\n if (!el || isOwnElement(el) || el === document.body || el === document.documentElement) {\n hideHighlight(); s.selectedElement = null; return;\n }\n s.selectedElement = el;\n doHighlight(el);\n });\n}\n\nexport function onRefClick(e: MouseEvent): void {\n if (isOwnElement(e.target as Element)) return;\n if (s.promptMode) return;\n e.preventDefault();\n e.stopPropagation();\n e.stopImmediatePropagation();\n if (s.locked) { s.locked = false; hideToolbar(); return; }\n if (s.selectedElement) {\n s.locked = true;\n doHighlight(s.selectedElement);\n showPromptForGrab(s.selectedElement);\n }\n}\n\nexport function onRefKeyDown(e: KeyboardEvent): void {\n if (s.promptMode) return;\n if (e.key === 'Escape') {\n if (s.locked) { s.locked = false; hideToolbar(); s.selectedElement = null; hideHighlight(); }\n else { _deactivate(); _renderMiniMenu(); }\n }\n}\n\nexport function onRefScroll(): void {\n if (s.promptMode) return;\n if (s.locked) { s.locked = false; hideToolbar(); s.selectedElement = null; hideHighlight(); }\n}\n","import { captureRect } from '../core/screenshot.js';\nimport { isLocalhost } from '../core/extract.js';\nimport { s } from '../core/state.js';\nimport { isOwnElement, createSelectionBox, flash } from '../ui/overlay.js';\nimport type { GrabResult } from '../core/types.js';\n\ntype DispatchFn = (result: GrabResult) => Promise<void>;\ntype DeactivateFn = () => void;\ntype RenderFn = () => void;\n\nlet _dispatch: DispatchFn;\nlet _deactivate: DeactivateFn;\nlet _renderMiniMenu: RenderFn;\n\nexport function setScreenshotCallbacks(dispatch: DispatchFn, deactivate: DeactivateFn, renderMiniMenu: RenderFn): void {\n _dispatch = dispatch;\n _deactivate = deactivate;\n _renderMiniMenu = renderMiniMenu;\n}\n\nexport function onSSMouseDown(e: MouseEvent): void {\n if (e.button !== 0) return;\n if (isOwnElement(e.target as Element)) return;\n e.preventDefault();\n e.stopPropagation();\n s.ssDrawing = true;\n s.ssStartX = e.clientX;\n s.ssStartY = e.clientY;\n if (s.selectionBox) {\n s.selectionBox.style.left = s.ssStartX + 'px';\n s.selectionBox.style.top = s.ssStartY + 'px';\n s.selectionBox.style.width = '0px';\n s.selectionBox.style.height = '0px';\n s.selectionBox.style.display = 'block';\n }\n}\n\nexport function onSSMouseMove(e: MouseEvent): void {\n if (!s.ssDrawing || !s.selectionBox) return;\n e.preventDefault();\n const x = Math.min(e.clientX, s.ssStartX);\n const y = Math.min(e.clientY, s.ssStartY);\n const w = Math.abs(e.clientX - s.ssStartX);\n const h = Math.abs(e.clientY - s.ssStartY);\n s.selectionBox.style.left = x + 'px';\n s.selectionBox.style.top = y + 'px';\n s.selectionBox.style.width = w + 'px';\n s.selectionBox.style.height = h + 'px';\n}\n\nexport async function onSSMouseUp(e: MouseEvent): Promise<void> {\n if (!s.ssDrawing) return;\n s.ssDrawing = false;\n e.preventDefault();\n e.stopPropagation();\n\n const x = Math.min(e.clientX, s.ssStartX);\n const y = Math.min(e.clientY, s.ssStartY);\n const w = Math.abs(e.clientX - s.ssStartX);\n const h = Math.abs(e.clientY - s.ssStartY);\n const selBox = s.selectionBox;\n if (selBox) selBox.remove();\n s.selectionBox = null;\n if (s.miniMenu) s.miniMenu.style.display = 'none';\n if (s.cursorStyle) s.cursorStyle.disabled = true;\n\n await new Promise((r) => requestAnimationFrame(() => requestAnimationFrame(r)));\n\n if (w >= 10 && h >= 10) {\n const image = await captureRect({ x, y, width: w, height: h });\n\n if (s.miniMenu) s.miniMenu.style.display = '';\n if (s.cursorStyle) s.cursorStyle.disabled = false;\n createSelectionBox();\n\n if (image) {\n const result: GrabResult = {\n type: 'screenshot',\n label: `Region ${w}×${h}`,\n text: `Screenshot region: ${w}×${h} at (${Math.round(x)}, ${Math.round(y)})`,\n prompt: '',\n image,\n meta: { tag: 'region', visibleText: '', html: '', attrs: {}, isLocal: isLocalhost() },\n };\n await _dispatch(result);\n flash('Screenshot captured');\n }\n } else {\n if (s.miniMenu) s.miniMenu.style.display = '';\n if (s.cursorStyle) s.cursorStyle.disabled = false;\n createSelectionBox();\n }\n}\n\nexport function onSSKeyDown(e: KeyboardEvent): void {\n if (e.key === 'Escape') {\n if (s.ssDrawing) {\n s.ssDrawing = false;\n if (s.selectionBox) s.selectionBox.style.display = 'none';\n } else {\n _deactivate();\n _renderMiniMenu();\n }\n }\n}\n","import { releaseStream } from './screenshot.js';\nimport { sendToApp } from '../targets/app.js';\nimport { copyToClipboard } from '../targets/clipboard.js';\nimport type { RuneGrabConfig, GrabResult, TargetApp } from './types.js';\nimport { s, DEFAULTS } from './state.js';\nimport { createMiniMenu, renderMiniMenu, loadAutoPastePref, checkHelper, setMenuCallbacks } from '../ui/menu.js';\nimport { createGrabOverlay, removeGrabOverlay, createSelectionBox, removeSelectionBox } from '../ui/overlay.js';\nimport { onShortcut, setKeyboardCallbacks } from '../handlers/keyboard.js';\nimport { onRefMouseMove, onRefClick, onRefKeyDown, onRefScroll, setReferenceCallbacks } from '../handlers/inspect.js';\nimport { onSSMouseDown, onSSMouseMove, onSSMouseUp, onSSKeyDown, setScreenshotCallbacks } from '../handlers/capture.js';\n\nasync function dispatchResult(result: GrabResult): Promise<void> {\n s.config.onGrab(result);\n window.dispatchEvent(new CustomEvent('rune:grab', { detail: result }));\n\n if (s.config.target === 'clipboard') {\n await copyToClipboard(result);\n } else {\n await sendToApp(s.config.target, result);\n }\n}\n\nexport function activate(): void {\n if (s.active) return;\n if (!document.body || !document.head) return;\n s.active = true;\n\n document.documentElement.classList.add('__rune-grab-active__');\n\n if (s.grabType === 'screenshot') {\n createGrabOverlay();\n createSelectionBox();\n document.addEventListener('mousedown', onSSMouseDown, true);\n document.addEventListener('mousemove', onSSMouseMove, true);\n document.addEventListener('mouseup', onSSMouseUp, true);\n document.addEventListener('keydown', onSSKeyDown, true);\n } else {\n createGrabOverlay();\n document.addEventListener('mousemove', onRefMouseMove, true);\n document.addEventListener('click', onRefClick, true);\n document.addEventListener('keydown', onRefKeyDown, true);\n document.addEventListener('scroll', onRefScroll, true);\n }\n\n s.config.onToggle(true);\n}\n\nexport function deactivate(): void {\n if (!s.active) return;\n s.active = false;\n s.locked = false;\n s.promptMode = false;\n s.ssDrawing = false;\n s.selectedElement = null;\n\n if (s.mmRAF) { cancelAnimationFrame(s.mmRAF); s.mmRAF = 0; }\n\n document.removeEventListener('mousedown', onSSMouseDown, true);\n document.removeEventListener('mousemove', onSSMouseMove, true);\n document.removeEventListener('mouseup', onSSMouseUp, true);\n document.removeEventListener('keydown', onSSKeyDown, true);\n\n document.removeEventListener('mousemove', onRefMouseMove, true);\n document.removeEventListener('click', onRefClick, true);\n document.removeEventListener('keydown', onRefKeyDown, true);\n document.removeEventListener('scroll', onRefScroll, true);\n\n removeGrabOverlay();\n removeSelectionBox();\n document.documentElement.classList.remove('__rune-grab-active__');\n\n s.config.onToggle(false);\n}\n\nexport function toggle(): void {\n if (s.active) deactivate(); else activate();\n}\n\nexport function isActive(): boolean { return s.active; }\n\nexport function setTarget(target: TargetApp): void {\n s.config.target = target;\n if (s.menuExpanded) renderMiniMenu();\n}\n\nexport function getTarget(): TargetApp { return s.config.target; }\n\nexport function init(userConfig: RuneGrabConfig = {}): () => void {\n if (s.initialized) return () => { };\n\n s.config = { ...DEFAULTS, ...userConfig };\n s.initialized = true;\n\n if (userConfig.skipComponents?.length) {\n s.customSkipSet = new Set(userConfig.skipComponents);\n }\n\n setMenuCallbacks(activate, deactivate);\n setKeyboardCallbacks(toggle, renderMiniMenu);\n setReferenceCallbacks(dispatchResult, deactivate, renderMiniMenu);\n setScreenshotCallbacks(dispatchResult, deactivate, renderMiniMenu);\n\n const savedAutoPaste = loadAutoPastePref();\n if (savedAutoPaste) {\n s.autoPasteEnabled = true;\n checkHelper().then((ok) => {\n s.helperAvailable = ok;\n if (!ok) s.config.target = 'clipboard';\n if (s.menuExpanded) renderMiniMenu();\n });\n }\n\n const setup = () => {\n createMiniMenu();\n document.addEventListener('keydown', onShortcut, true);\n };\n\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', setup, { once: true });\n } else {\n setup();\n }\n\n return () => {\n deactivate();\n releaseStream();\n s.miniMenu?.remove();\n document.removeEventListener('keydown', onShortcut, true);\n s.initialized = false;\n s.hasDragged = false;\n };\n}\n","import { useEffect, useState, useCallback, useRef } from 'react';\nimport type { RuneGrabConfig, GrabResult, TargetApp } from '../core/types.js';\n\nexport type { RuneGrabConfig, GrabResult, TargetApp };\n\nexport interface UseRuneGrabReturn {\n active: boolean;\n toggle: () => void;\n activate: () => void;\n deactivate: () => void;\n setTarget: (target: TargetApp) => void;\n target: TargetApp;\n lastGrab: GrabResult | null;\n}\n\nexport function useRuneGrab(config: RuneGrabConfig = {}): UseRuneGrabReturn {\n const [active, setActive] = useState(false);\n const [target, setTargetState] = useState<TargetApp>(config.target ?? 'clipboard');\n const [lastGrab, setLastGrab] = useState<GrabResult | null>(null);\n const cleanupRef = useRef<(() => void) | null>(null);\n const engineRef = useRef<typeof import('../core/engine.js') | null>(null);\n\n useEffect(() => {\n let mounted = true;\n import('../core/engine.js').then((engine) => {\n if (!mounted) return;\n engineRef.current = engine;\n cleanupRef.current = engine.init({\n ...config,\n onGrab: (result) => {\n setLastGrab(result);\n config.onGrab?.(result);\n },\n onToggle: (isActive) => {\n setActive(isActive);\n config.onToggle?.(isActive);\n },\n });\n });\n\n return () => {\n mounted = false;\n cleanupRef.current?.();\n };\n }, []);\n\n const toggle = useCallback(() => {\n engineRef.current?.toggle();\n }, []);\n\n const activate = useCallback(() => {\n engineRef.current?.activate();\n }, []);\n\n const deactivate = useCallback(() => {\n engineRef.current?.deactivate();\n }, []);\n\n const setTarget = useCallback((t: TargetApp) => {\n setTargetState(t);\n engineRef.current?.setTarget(t);\n }, []);\n\n return { active, toggle, activate, deactivate, setTarget, target, lastGrab };\n}\n"],"mappings":"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","names":["HELPER_PORT","activate","deactivate","HELPER_PORT","isActive","toggle","renderMiniMenu","deactivate","renderMiniMenu","_deactivate","_renderMiniMenu","deactivate","renderMiniMenu","_dispatch","_deactivate","_renderMiniMenu","isActive","toggle","activate","deactivate","setTarget"]}
1
+ {"version":3,"sources":["../src/core/screenshot.ts","../src/targets/clipboard.ts","../src/targets/app.ts","../src/core/state.ts","../src/core/constants.ts","../src/ui/styles.ts","../src/ui/menu.ts","../src/core/sourcemap.ts","../src/core/frameworks.ts","../src/core/extract.ts","../src/ui/overlay.ts","../src/handlers/keyboard.ts","../src/handlers/inspect.ts","../src/handlers/capture.ts","../src/core/engine.ts","../src/hooks/react.ts"],"sourcesContent":["type CaptureProvider = (rect: DOMRect) => Promise<string | null>;\nlet customProvider: CaptureProvider | null = null;\n\nexport function setCaptureProvider(provider: CaptureProvider): void {\n customProvider = provider;\n}\n\nlet activeStream: MediaStream | null = null;\n\nasync function getStream(): Promise<MediaStream | null> {\n if (activeStream) {\n const tracks = activeStream.getVideoTracks();\n if (tracks.length > 0 && tracks[0].readyState === 'live') {\n return activeStream;\n }\n activeStream = null;\n }\n\n try {\n activeStream = await navigator.mediaDevices.getDisplayMedia({\n video: true,\n preferCurrentTab: true,\n selfBrowserSurface: 'include',\n } as any);\n\n activeStream!.getVideoTracks()[0].addEventListener('ended', () => {\n activeStream = null;\n });\n\n return activeStream;\n } catch {\n return null;\n }\n}\n\nasync function captureFromStream(\n stream: MediaStream,\n rect: DOMRect,\n format: string,\n quality: number,\n): Promise<string> {\n const video = document.createElement('video');\n video.srcObject = stream;\n video.muted = true;\n video.playsInline = true;\n\n await new Promise<void>((resolve, reject) => {\n video.onloadedmetadata = () => { video.play().then(resolve).catch(reject); };\n video.onerror = reject;\n });\n\n if ('requestVideoFrameCallback' in video) {\n await new Promise<void>((r) => (video as any).requestVideoFrameCallback(() => r()));\n } else {\n await new Promise((r) => setTimeout(r, 200));\n }\n\n const videoW = video.videoWidth;\n const videoH = video.videoHeight;\n const scaleX = videoW / window.innerWidth;\n const scaleY = videoH / window.innerHeight;\n\n const sx = rect.left * scaleX;\n const sy = rect.top * scaleY;\n const sw = rect.width * scaleX;\n const sh = rect.height * scaleY;\n\n const dpr = window.devicePixelRatio || 1;\n const canvas = document.createElement('canvas');\n canvas.width = rect.width * dpr;\n canvas.height = rect.height * dpr;\n const ctx = canvas.getContext('2d')!;\n ctx.drawImage(video, sx, sy, sw, sh, 0, 0, canvas.width, canvas.height);\n\n video.pause();\n video.srcObject = null;\n\n return canvas.toDataURL(format, quality);\n}\n\nexport async function captureRect(\n rect: { x: number; y: number; width: number; height: number },\n format: 'image/png' | 'image/jpeg' = 'image/png',\n quality = 0.92,\n): Promise<string | null> {\n if (rect.width === 0 || rect.height === 0) return null;\n\n try {\n const domRect = new DOMRect(rect.x, rect.y, rect.width, rect.height);\n\n if (customProvider) {\n return await customProvider(domRect);\n }\n\n const stream = await getStream();\n if (stream) {\n return await captureFromStream(stream, domRect, format, quality);\n }\n\n console.warn('[rune-grab] Screenshot permission was denied or unavailable. In Electron apps, use setCaptureProvider() instead.');\n return null;\n } catch (err) {\n console.warn('[rune-grab] Screenshot capture failed:', err);\n return null;\n }\n}\n\nexport function releaseStream(): void {\n if (activeStream) {\n activeStream.getTracks().forEach((t) => t.stop());\n activeStream = null;\n }\n}\n","import type { GrabResult } from '../core/types.js';\n\nexport async function copyToClipboard(result: GrabResult): Promise<boolean> {\n try {\n const items: Record<string, Blob> = {};\n\n items['text/plain'] = new Blob([result.text], { type: 'text/plain' });\n\n if (result.image) {\n const response = await fetch(result.image);\n const imageBlob = await response.blob();\n items['image/png'] = imageBlob;\n }\n\n await navigator.clipboard.write([\n new ClipboardItem(items),\n ]);\n return true;\n } catch {\n try {\n await navigator.clipboard.writeText(result.text);\n return true;\n } catch {\n return false;\n }\n }\n}\n","import type { GrabResult, TargetApp } from '../core/types.js';\nimport { copyToClipboard } from './clipboard.js';\n\nconst HELPER_PORT = 19274;\n\nasync function isHelperRunning(): Promise<boolean> {\n try {\n const ac = new AbortController();\n const timer = setTimeout(() => ac.abort(), 500);\n const res = await fetch(`http://127.0.0.1:${HELPER_PORT}/health`, {\n signal: ac.signal,\n });\n clearTimeout(timer);\n return res.ok;\n } catch {\n return false;\n }\n}\n\nasync function sendToHelper(target: TargetApp, result: GrabResult): Promise<boolean> {\n try {\n const res = await fetch(`http://127.0.0.1:${HELPER_PORT}/paste`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n target,\n text: result.text,\n image: result.image ?? null,\n label: result.label,\n }),\n });\n return res.ok;\n } catch {\n return false;\n }\n}\n\nexport const APP_BUNDLE_IDS: Record<TargetApp, string> = {\n claude: 'com.anthropic.claudefordesktop',\n cursor: 'com.todesktop.230313mzl4w4u92',\n codex: 'com.openai.codex',\n 'claude-code': '',\n clipboard: '',\n};\n\nexport const APP_NAMES: Record<TargetApp, string> = {\n claude: 'Claude',\n cursor: 'Cursor',\n codex: 'Codex',\n 'claude-code': 'Claude Code',\n clipboard: 'Clipboard',\n};\n\nexport async function sendToApp(target: TargetApp, result: GrabResult): Promise<{ success: boolean; method: 'auto' | 'clipboard' }> {\n await copyToClipboard(result);\n\n if (target === 'clipboard') {\n return { success: true, method: 'clipboard' };\n }\n\n const helperUp = await isHelperRunning();\n if (helperUp) {\n const ok = await sendToHelper(target, result);\n if (ok) return { success: true, method: 'auto' };\n }\n\n return { success: true, method: 'clipboard' };\n}\n\n","import type { RuneGrabConfig, TargetApp } from './types.js';\n\nconst isMac = typeof navigator !== 'undefined' && /Mac|iPhone|iPad/.test(navigator.platform);\n\nexport const DEFAULTS: Required<RuneGrabConfig> = {\n shortcut: isMac ? 'Meta+Shift+G' : 'Ctrl+Shift+G',\n target: 'clipboard',\n accentColor: '#f5f5f5',\n maxStackDepth: 3,\n onGrab: () => { },\n onToggle: () => { },\n showTargetPicker: true,\n skipComponents: [],\n};\n\nexport const s = {\n initialized: false,\n active: false,\n locked: false,\n promptMode: false,\n menuExpanded: false,\n targetsExpanded: false,\n grabType: 'screenshot' as 'screenshot' | 'reference',\n autoPasteEnabled: false,\n helperAvailable: false,\n helperChecking: false,\n dockedEdge: null as 'top' | 'bottom' | 'left' | 'right' | null,\n selectedElement: null as Element | null,\n mmRAF: 0,\n config: { ...DEFAULTS } as Required<RuneGrabConfig>,\n customSkipSet: undefined as Set<string> | undefined,\n miniMenu: null as HTMLDivElement | null,\n overlay: null as HTMLDivElement | null,\n label: null as HTMLDivElement | null,\n toolbar: null as HTMLDivElement | null,\n cursorStyle: null as HTMLStyleElement | null,\n selectionBox: null as HTMLDivElement | null,\n ssDrawing: false,\n ssStartX: 0,\n ssStartY: 0,\n lastMouseX: 0,\n lastMouseY: 0,\n dragging: false,\n dragPending: false,\n dragStartX: 0,\n dragStartY: 0,\n hasDragged: false,\n dragW: 0,\n dragH: 0,\n dragBaseX: 0,\n dragBaseY: 0,\n dragPointerId: -1,\n dragLastX: 0,\n dragLastY: 0,\n};\n","export const SKIP_PREFIXES = ['_', '$', 'Styled(', 'motion(', 'chakra(', 'withRouter(', 'connect(', 'styled.', 'styled(', 'tw.', 'rc-', '__'];\n\nexport function isLibraryFile(filePath: string): boolean {\n return filePath.includes('node_modules');\n}\n\nexport function isSourceFile(filePath: string): boolean {\n if (!filePath) return false;\n if (isLibraryFile(filePath)) return false;\n if (filePath.startsWith('webpack-internal:///node_modules/')) return false;\n // Filter Next.js/Vite/webpack bundle artifacts\n if (filePath.includes('_next/static/')) return false;\n if (filePath.includes('.vite/deps/')) return false;\n if (/^webpack[\\w-]*\\.js$/.test(filePath) || /[\\\\/]webpack[\\w-]*\\.js$/.test(filePath)) return false;\n return true;\n}\n\nexport const STYLE_PROPS = [\n 'display', 'position', 'overflow',\n 'width', 'height', 'minWidth', 'minHeight', 'maxWidth', 'maxHeight',\n 'flexDirection', 'flexWrap', 'justifyContent', 'alignItems', 'alignSelf', 'gap',\n 'gridTemplateColumns', 'gridTemplateRows',\n 'padding', 'margin',\n 'fontSize', 'fontWeight', 'fontFamily', 'lineHeight', 'letterSpacing',\n 'textAlign', 'textTransform', 'color',\n 'backgroundColor', 'backgroundImage',\n 'borderRadius', 'boxShadow',\n 'borderWidth', 'borderStyle', 'borderColor',\n 'opacity', 'transform', 'filter', 'backdropFilter',\n 'objectFit',\n];\n\nexport const STYLE_DEFAULTS = new Set([\n 'block', 'inline', 'none', 'normal', 'auto', '0px', 'transparent',\n 'rgba(0, 0, 0, 0)', 'start', 'visible', 'static', 'row', 'stretch',\n '0px 0px 0px 0px', 'baseline',\n]);\n\nexport const KEEP_ATTRS = ['type', 'href', 'src', 'alt', 'role', 'aria-label', 'placeholder', 'name', 'id', 'data-testid'];\n\nexport const Z_OVERLAY = 2147483640;\nexport const Z_TOOLBAR = 2147483641;\n\nexport const OWN_IDS = ['__rune-grab-overlay__', '__rune-grab-label__', '__rune-grab-toolbar__', '__rune-grab-menu__', '__rune-grab-selection__'];\n\nexport const DRAG_THRESHOLD_PX = 4;\n\nexport const HELPER_PORT = 19274;\n\nexport const HEALTH_CHECK_TIMEOUT_MS = 800;\n\nexport const FLASH_VISIBLE_MS = 1000;\n\nexport const FLASH_REMOVE_MS = 1200;\n\nexport const LS_KEY = '__rune-grab-autopaste__';\n","import type { TargetApp } from '../core/types.js';\n\nexport const FONT = `-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif`;\nexport const MONO = `ui-monospace,SFMono-Regular,Menlo,monospace`;\n\nexport const M_BG = '#f5f5f5';\nexport const M_FG = '#171717';\nexport const M_FG_DIM = '#737373';\nexport const M_BORDER = '#e5e5e5';\nexport const M_HOVER = '#ebebeb';\nexport const M_ACTIVE_BG = '#171717';\nexport const M_ACTIVE_FG = '#f5f5f5';\n\nexport const ICON_SS = `<svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"/><circle cx=\"8.5\" cy=\"8.5\" r=\"1.5\"/><polyline points=\"21 15 16 10 5 21\"/></svg>`;\nexport const ICON_REF = `<svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"16 18 22 12 16 6\"/><polyline points=\"8 6 2 12 8 18\"/></svg>`;\nexport const ICON_X = `<svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/></svg>`;\nexport const ICON_CHEVRON_RIGHT = `<svg width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"9 18 15 12 9 6\"/></svg>`;\nexport const ICON_CHEVRON_LEFT = `<svg width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"15 18 9 12 15 6\"/></svg>`;\nexport const ICON_SEND = '<svg width=\"10\" height=\"10\" viewBox=\"0 0 448 512\" fill=\"currentColor\"><path d=\"M34.9 289.5l-22.2-22.2c-9.4-9.4-9.4-24.6 0-33.9L207 39c9.4-9.4 24.6-9.4 33.9 0l194.3 194.3c9.4 9.4 9.4 24.6 0 33.9L413 289.4c-9.5 9.5-25 9.3-34.3-.4L264.5 168.6V456c0 13.3-10.7 24-24 24h-32c-13.3 0-24-10.7-24-24V168.6L70.2 289.1c-9.3 9.8-24.8 10-34.3.4z\"/></svg>';\nexport const ICON_GRIP = `<svg width=\"6\" height=\"10\" viewBox=\"0 0 6 10\" fill=\"currentColor\"><circle cx=\"1\" cy=\"1\" r=\"1\"/><circle cx=\"5\" cy=\"1\" r=\"1\"/><circle cx=\"1\" cy=\"5\" r=\"1\"/><circle cx=\"5\" cy=\"5\" r=\"1\"/><circle cx=\"1\" cy=\"9\" r=\"1\"/><circle cx=\"5\" cy=\"9\" r=\"1\"/></svg>`;\n\nexport const TARGET_LABELS: Record<TargetApp, string> = {\n clipboard: 'Clipboard',\n claude: 'Claude',\n cursor: 'Cursor',\n codex: 'Codex',\n 'claude-code': 'CLI',\n};\n\nexport const TARGETS_CLIPBOARD: TargetApp[] = ['clipboard'];\nexport const TARGETS_APPS: TargetApp[] = ['claude', 'cursor', 'codex', 'claude-code'];\n","import { Z_TOOLBAR, DRAG_THRESHOLD_PX, HELPER_PORT, HEALTH_CHECK_TIMEOUT_MS, LS_KEY } from '../core/constants.js';\nimport { s } from '../core/state.js';\nimport {\n FONT, MONO, M_BG, M_FG, M_FG_DIM, M_BORDER, M_HOVER, M_ACTIVE_BG, M_ACTIVE_FG,\n ICON_SS, ICON_REF, ICON_X, ICON_CHEVRON_RIGHT, ICON_CHEVRON_LEFT, ICON_GRIP,\n TARGET_LABELS, TARGETS_CLIPBOARD, TARGETS_APPS,\n} from './styles.js';\n\ntype ActivateFn = () => void;\ntype DeactivateFn = () => void;\ntype RenderFn = () => void;\n\nlet _activate: ActivateFn;\nlet _deactivate: DeactivateFn;\nlet _renderMiniMenu: RenderFn;\n\nexport function setMenuCallbacks(activate: ActivateFn, deactivate: DeactivateFn): void {\n _activate = activate;\n _deactivate = deactivate;\n}\n\nexport function loadAutoPastePref(): boolean {\n try { return localStorage.getItem(LS_KEY) === '1'; } catch { return false; }\n}\n\nexport function saveAutoPastePref(v: boolean): void {\n try { localStorage.setItem(LS_KEY, v ? '1' : '0'); } catch { }\n}\n\nexport async function checkHelper(): Promise<boolean> {\n try {\n const ac = new AbortController();\n const timer = setTimeout(() => ac.abort(), HEALTH_CHECK_TIMEOUT_MS);\n const res = await fetch(`http://127.0.0.1:${HELPER_PORT}/health`, {\n signal: ac.signal,\n });\n clearTimeout(timer);\n return res.ok;\n } catch { return false; }\n}\n\nasync function onAutoPasteToggle(enabled: boolean): Promise<void> {\n s.autoPasteEnabled = enabled;\n saveAutoPastePref(enabled);\n\n if (enabled) {\n s.helperChecking = true;\n renderMiniMenu();\n s.helperAvailable = await checkHelper();\n s.helperChecking = false;\n\n if (!s.helperAvailable) {\n s.config.target = 'clipboard';\n }\n } else {\n s.helperAvailable = false;\n s.config.target = 'clipboard';\n }\n\n renderMiniMenu();\n}\n\nfunction buildToggle(on: boolean, onChange: (v: boolean) => void): HTMLDivElement {\n const wrap = document.createElement('div');\n wrap.style.cssText = `display:inline-flex;align-items:center;flex-shrink:0;`;\n\n const track = document.createElement('div');\n track.style.cssText = `\n width:28px;height:16px;border-radius:8px;cursor:pointer;\n transition:background 0.15s;position:relative;\n background:${on ? M_ACTIVE_BG : '#d4d4d4'};\n `;\n\n const thumb = document.createElement('div');\n thumb.style.cssText = `\n width:12px;height:12px;border-radius:50%;\n background:${on ? M_ACTIVE_FG : '#fff'};\n position:absolute;top:2px;transition:left 0.15s;\n left:${on ? '14px' : '2px'};\n box-shadow:0 1px 2px rgba(0,0,0,0.15);\n `;\n track.appendChild(thumb);\n\n track.addEventListener('click', (e) => {\n e.stopPropagation();\n onChange(!on);\n });\n\n wrap.appendChild(track);\n return wrap;\n}\n\nfunction grabIconBtn(icon: string, isActive: boolean, onClick: () => void): HTMLButtonElement {\n const btn = document.createElement('button');\n btn.innerHTML = icon;\n btn.style.cssText = `\n width:28px;height:28px;border:none;border-radius:6px;cursor:pointer;\n display:flex;align-items:center;justify-content:center;padding:0;\n transition:all 0.15s;\n background:${isActive ? M_ACTIVE_BG : 'transparent'};\n color:${isActive ? M_ACTIVE_FG : M_FG_DIM};\n `;\n\n btn.addEventListener('mouseenter', () => {\n if (!isActive) { btn.style.background = M_HOVER; btn.style.color = M_FG; }\n });\n btn.addEventListener('mouseleave', () => {\n if (!isActive) { btn.style.background = 'transparent'; btn.style.color = M_FG_DIM; }\n });\n btn.addEventListener('click', (e) => { e.stopPropagation(); e.preventDefault(); onClick(); });\n\n return btn;\n}\n\nfunction sep(): HTMLDivElement {\n const d = document.createElement('div');\n d.style.cssText = `width:1px;height:16px;background:${M_BORDER};margin:0 2px;flex-shrink:0;`;\n return d;\n}\n\nfunction onGripPointerDown(e: PointerEvent): void {\n if (e.button !== 0 || !s.menuExpanded || !s.miniMenu) return;\n e.preventDefault();\n\n const grip = e.currentTarget as HTMLElement;\n grip.setPointerCapture(e.pointerId);\n s.dragPointerId = e.pointerId;\n\n s.dragStartX = e.clientX;\n s.dragStartY = e.clientY;\n s.dragPending = true;\n s.dragging = false;\n\n const rect = s.miniMenu.getBoundingClientRect();\n s.dragW = rect.width;\n s.dragH = rect.height;\n\n if (!s.hasDragged) {\n s.miniMenu.style.top = rect.top + 'px';\n s.miniMenu.style.left = rect.left + 'px';\n s.miniMenu.style.bottom = 'auto';\n s.miniMenu.style.right = 'auto';\n s.hasDragged = true;\n }\n\n s.dragBaseX = parseFloat(s.miniMenu.style.left) || rect.left;\n s.dragBaseY = parseFloat(s.miniMenu.style.top) || rect.top;\n s.dragLastX = s.dragBaseX;\n s.dragLastY = s.dragBaseY;\n}\n\nfunction onGripPointerMove(e: PointerEvent): void {\n if (e.pointerId !== s.dragPointerId || !s.miniMenu) return;\n if (!s.dragPending && !s.dragging) return;\n\n const dx = e.clientX - s.dragStartX;\n const dy = e.clientY - s.dragStartY;\n\n if (s.dragPending && !s.dragging) {\n if (Math.abs(dx) < DRAG_THRESHOLD_PX && Math.abs(dy) < DRAG_THRESHOLD_PX) return;\n s.dragging = true;\n s.dragPending = false;\n s.miniMenu.style.transition = 'none';\n s.miniMenu.style.willChange = 'left, top';\n document.body.style.cursor = 'grabbing';\n document.body.style.userSelect = 'none';\n }\n\n if (s.dragging) {\n const vw = document.documentElement.clientWidth;\n const vh = document.documentElement.clientHeight;\n s.dragLastX = Math.max(0, Math.min(s.dragBaseX + dx, vw - s.dragW));\n s.dragLastY = Math.max(0, Math.min(s.dragBaseY + dy, vh - s.dragH));\n s.miniMenu.style.left = s.dragLastX + 'px';\n s.miniMenu.style.top = s.dragLastY + 'px';\n }\n}\n\nfunction onGripPointerUp(e: PointerEvent): void {\n if (e.pointerId !== s.dragPointerId || !s.miniMenu) return;\n s.dragPointerId = -1;\n document.body.style.cursor = '';\n document.body.style.userSelect = '';\n\n if (s.dragging) {\n s.dragging = false;\n s.miniMenu.style.willChange = '';\n s.miniMenu.style.transition = 'left 0.15s ease, top 0.15s ease';\n\n s.miniMenu.style.pointerEvents = 'none';\n requestAnimationFrame(() => { if (s.miniMenu) s.miniMenu.style.pointerEvents = ''; });\n }\n s.dragPending = false;\n}\n\nfunction snapToNearestEdge(): void {\n if (!s.miniMenu) return;\n const rect = s.miniMenu.getBoundingClientRect();\n const cx = rect.left + rect.width / 2;\n const cy = rect.top + rect.height / 2;\n const vw = document.documentElement.clientWidth;\n const vh = document.documentElement.clientHeight;\n const distTop = cy;\n const distBottom = vh - cy;\n const distLeft = cx;\n const distRight = vw - cx;\n const minDist = Math.min(distTop, distBottom, distLeft, distRight);\n\n if (minDist === distTop) s.dockedEdge = 'top';\n else if (minDist === distBottom) s.dockedEdge = 'bottom';\n else if (minDist === distLeft) s.dockedEdge = 'left';\n else s.dockedEdge = 'right';\n\n s.miniMenu.style.transition = 'none';\n\n renderMiniMenu();\n\n requestAnimationFrame(() => {\n if (!s.miniMenu) return;\n const tabRect = s.miniMenu.getBoundingClientRect();\n const tw = tabRect.width;\n const th = tabRect.height;\n let targetX = parseFloat(s.miniMenu.style.left) || 0;\n let targetY = parseFloat(s.miniMenu.style.top) || 0;\n\n if (s.dockedEdge === 'top') targetY = 0;\n else if (s.dockedEdge === 'bottom') targetY = vh - th;\n else if (s.dockedEdge === 'left') targetX = 0;\n else if (s.dockedEdge === 'right') targetX = vw - tw;\n\n targetX = Math.max(0, Math.min(targetX, vw - tw));\n targetY = Math.max(0, Math.min(targetY, vh - th));\n\n s.miniMenu.style.transition = 'left 0.25s ease, top 0.25s ease';\n s.miniMenu.style.left = targetX + 'px';\n s.miniMenu.style.top = targetY + 'px';\n setTimeout(() => { if (s.miniMenu) s.miniMenu.style.transition = 'left 0.15s ease, top 0.15s ease'; }, 270);\n });\n}\n\nfunction clampToViewport(): void {\n if (!s.miniMenu || !s.hasDragged) return;\n\n const rect = s.miniMenu.getBoundingClientRect();\n let x = rect.left;\n let y = rect.top;\n let clamped = false;\n\n const vw = document.documentElement.clientWidth;\n const vh = document.documentElement.clientHeight;\n if (x + rect.width > vw) { x = vw - rect.width; clamped = true; }\n if (x < 0) { x = 0; clamped = true; }\n if (y + rect.height > vh) { y = vh - rect.height; clamped = true; }\n if (y < 0) { y = 0; clamped = true; }\n\n if (clamped) {\n s.miniMenu.style.transition = 'left 0.2s ease, top 0.2s ease';\n s.miniMenu.style.left = x + 'px';\n s.miniMenu.style.top = y + 'px';\n setTimeout(() => { if (s.miniMenu) s.miniMenu.style.transition = 'left 0.15s ease, top 0.15s ease'; }, 220);\n }\n}\n\nexport function createMiniMenu(): void {\n s.miniMenu = document.createElement('div');\n s.miniMenu.id = '__rune-grab-menu__';\n\n s.dockedEdge = 'bottom';\n s.menuExpanded = false;\n\n s.miniMenu.style.cssText = `\n position:fixed;z-index:${Z_TOOLBAR + 2};\n background:transparent;border:none;\n border-radius:9px;font-family:${FONT};\n box-shadow:none;\n transition:left 0.15s ease, top 0.15s ease;\n user-select:none;\n bottom:0px;right:16px;\n `;\n\n document.addEventListener('mousemove', (e) => { s.lastMouseX = e.clientX; s.lastMouseY = e.clientY; }, { passive: true });\n\n document.body.appendChild(s.miniMenu);\n renderMiniMenu();\n}\n\nexport function renderMiniMenu(): void {\n if (!s.miniMenu) return;\n const frag = document.createDocumentFragment();\n\n if (!s.menuExpanded) {\n s.miniMenu.style.padding = '0';\n s.miniMenu.style.border = 'none';\n s.miniMenu.style.boxShadow = 'none';\n s.miniMenu.style.background = 'transparent';\n\n let chevronSvg: string;\n let tabW: number;\n let tabH: number;\n let borderRadius: string;\n const edge = s.dockedEdge || 'bottom';\n\n if (edge === 'bottom') {\n chevronSvg = `<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"${M_FG}\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"18 15 12 9 6 15\"/></svg>`;\n tabW = 40; tabH = 28;\n borderRadius = '10px 10px 0 0';\n } else if (edge === 'top') {\n chevronSvg = `<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"${M_FG}\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"6 9 12 15 18 9\"/></svg>`;\n tabW = 40; tabH = 28;\n borderRadius = '0 0 10px 10px';\n } else if (edge === 'left') {\n chevronSvg = `<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"${M_FG}\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"9 18 15 12 9 6\"/></svg>`;\n tabW = 28; tabH = 40;\n borderRadius = '0 10px 10px 0';\n } else {\n chevronSvg = `<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"${M_FG}\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"15 18 9 12 15 6\"/></svg>`;\n tabW = 28; tabH = 40;\n borderRadius = '10px 0 0 10px';\n }\n\n const tab = document.createElement('button');\n tab.title = 'Rune Grab';\n tab.innerHTML = chevronSvg;\n tab.style.cssText = `\n width:${tabW}px;height:${tabH}px;border:none;cursor:pointer;\n display:flex;align-items:center;justify-content:center;\n background:${M_BG};color:${M_FG};\n border-radius:${borderRadius};\n box-shadow:0 2px 8px rgba(0,0,0,0.08),0 0 0 1px rgba(0,0,0,0.04);\n transition:background 0.12s;padding:0;\n `;\n tab.addEventListener('mouseenter', () => { tab.style.background = M_HOVER; });\n tab.addEventListener('mouseleave', () => { tab.style.background = M_BG; });\n tab.addEventListener('click', (e) => {\n e.stopPropagation();\n if (!s.miniMenu) return;\n\n const rect = s.miniMenu.getBoundingClientRect();\n s.miniMenu.style.bottom = 'auto';\n s.miniMenu.style.right = 'auto';\n s.miniMenu.style.top = rect.top + 'px';\n s.miniMenu.style.left = rect.left + 'px';\n s.hasDragged = true;\n\n s.menuExpanded = true;\n s.dockedEdge = null;\n\n s.miniMenu.style.background = M_BG;\n s.miniMenu.style.border = `1px solid ${M_BORDER}`;\n s.miniMenu.style.boxShadow = '0 2px 8px rgba(0,0,0,0.08),0 0 0 1px rgba(0,0,0,0.04)';\n s.miniMenu.style.borderRadius = '9px';\n\n s.miniMenu.style.transition = 'none';\n renderMiniMenu();\n s.miniMenu.offsetWidth;\n clampToViewport();\n });\n frag.appendChild(tab);\n s.miniMenu.textContent = '';\n s.miniMenu.appendChild(frag);\n return;\n }\n\n s.miniMenu.style.padding = '3px';\n\n const bar = document.createElement('div');\n bar.style.cssText = 'display:flex;align-items:center;gap:2px;';\n\n const grip = document.createElement('div');\n grip.style.cssText = `\n width:12px;height:28px;cursor:grab;display:flex;align-items:center;justify-content:center;\n flex-shrink:0;border-radius:4px;color:${M_FG_DIM};transition:color 0.12s;\n `;\n grip.innerHTML = ICON_GRIP;\n grip.addEventListener('mouseenter', () => { grip.style.color = M_FG; });\n grip.addEventListener('mouseleave', () => { if (!s.dragging) grip.style.color = M_FG_DIM; });\n grip.addEventListener('pointerdown', onGripPointerDown);\n grip.addEventListener('pointermove', onGripPointerMove);\n grip.addEventListener('pointerup', onGripPointerUp);\n grip.style.touchAction = 'none';\n bar.appendChild(grip);\n\n const ssActive = s.active && s.grabType === 'screenshot';\n bar.appendChild(grabIconBtn(ICON_SS, ssActive, () => {\n if (ssActive) { _deactivate(); }\n else { if (s.active) _deactivate(); s.grabType = 'screenshot'; _activate(); }\n renderMiniMenu();\n }));\n\n const refActive = s.active && s.grabType === 'reference';\n bar.appendChild(grabIconBtn(ICON_REF, refActive, () => {\n if (refActive) { _deactivate(); }\n else { if (s.active) _deactivate(); s.grabType = 'reference'; _activate(); }\n renderMiniMenu();\n }));\n\n bar.appendChild(sep());\n\n const visibleTargets = s.autoPasteEnabled && s.helperAvailable\n ? [...TARGETS_CLIPBOARD, ...TARGETS_APPS]\n : TARGETS_CLIPBOARD;\n\n const toggleBtn = document.createElement('button');\n toggleBtn.innerHTML = s.targetsExpanded ? ICON_CHEVRON_RIGHT : ICON_CHEVRON_LEFT;\n toggleBtn.title = s.targetsExpanded ? 'Collapse targets' : 'Send to…';\n toggleBtn.style.cssText = `\n width:24px;height:28px;border:none;background:transparent;cursor:pointer;\n display:flex;align-items:center;justify-content:center;border-radius:6px;\n color:${M_FG_DIM};transition:all 0.12s;padding:0;flex-shrink:0;\n `;\n toggleBtn.addEventListener('mouseenter', () => { toggleBtn.style.background = M_HOVER; toggleBtn.style.color = M_FG; });\n toggleBtn.addEventListener('mouseleave', () => { toggleBtn.style.background = 'transparent'; toggleBtn.style.color = M_FG_DIM; });\n toggleBtn.addEventListener('click', (e) => {\n e.stopPropagation();\n s.targetsExpanded = !s.targetsExpanded;\n\n if (targetsWrap) {\n if (s.targetsExpanded) {\n targetsWrap.style.width = 'auto';\n const naturalW = targetsWrap.scrollWidth;\n targetsWrap.style.width = '0px';\n targetsWrap.offsetWidth;\n targetsWrap.style.width = naturalW + 'px';\n targetsWrap.style.opacity = '1';\n setTimeout(() => { if (targetsWrap) targetsWrap.style.width = 'auto'; clampToViewport(); }, 200);\n } else {\n const currentW = targetsWrap.scrollWidth;\n targetsWrap.style.width = currentW + 'px';\n targetsWrap.offsetWidth;\n targetsWrap.style.width = '0px';\n targetsWrap.style.opacity = '0';\n }\n }\n\n toggleBtn.innerHTML = s.targetsExpanded ? ICON_CHEVRON_RIGHT : ICON_CHEVRON_LEFT;\n toggleBtn.title = s.targetsExpanded ? 'Collapse targets' : 'Send to…';\n });\n bar.appendChild(toggleBtn);\n\n const targetsWrap = document.createElement('div');\n targetsWrap.style.cssText = `\n display:flex;align-items:center;gap:2px;\n overflow:hidden;white-space:nowrap;\n transition:width 0.2s ease, opacity 0.15s ease;\n ${s.targetsExpanded ? 'opacity:1;' : 'width:0px;opacity:0;'}\n `;\n\n for (const t of visibleTargets) {\n const isCurrent = t === s.config.target;\n const btn = document.createElement('button');\n btn.textContent = TARGET_LABELS[t];\n btn.style.cssText = `\n height:28px;padding:0 8px;border:none;border-radius:6px;cursor:pointer;\n font-size:11px;font-weight:${isCurrent ? '600' : '500'};font-family:${FONT};\n transition:all 0.12s;flex-shrink:0;\n background:${isCurrent ? M_ACTIVE_BG : 'transparent'};\n color:${isCurrent ? M_ACTIVE_FG : M_FG_DIM};\n `;\n btn.addEventListener('mouseenter', () => {\n if (!isCurrent) btn.style.background = M_HOVER;\n });\n btn.addEventListener('mouseleave', () => {\n if (!isCurrent) btn.style.background = 'transparent';\n });\n btn.addEventListener('click', (e) => {\n e.stopPropagation();\n s.config.target = t;\n renderMiniMenu();\n });\n targetsWrap.appendChild(btn);\n }\n\n bar.appendChild(targetsWrap);\n\n if (s.targetsExpanded) bar.appendChild(sep());\n\n bar.appendChild(buildToggle(s.autoPasteEnabled, onAutoPasteToggle));\n\n if (s.autoPasteEnabled && !s.helperAvailable && !s.helperChecking) {\n bar.appendChild(sep());\n const hint = document.createElement('div');\n hint.style.cssText = `\n font-size:8px;font-family:${MONO};color:${M_FG_DIM};\n padding:0 6px;white-space:nowrap;flex-shrink:0;line-height:1.3;\n `;\n hint.innerHTML = `To enable auto pasting: add <br><span style=\"color:${M_FG};font-weight:600;\">rune-grab serve</span> to your dev script.`;\n bar.appendChild(hint);\n }\n\n if (s.helperChecking) {\n bar.appendChild(sep());\n const checking = document.createElement('span');\n checking.textContent = 'Connecting…';\n checking.style.cssText = `font-size:10px;font-family:${FONT};color:${M_FG_DIM};padding:0 4px;flex-shrink:0;`;\n bar.appendChild(checking);\n }\n\n const closeBtn = document.createElement('button');\n closeBtn.innerHTML = ICON_X;\n closeBtn.style.cssText = `\n width:28px;height:28px;border:none;background:transparent;cursor:pointer;\n display:flex;align-items:center;justify-content:center;border-radius:6px;\n color:${M_FG_DIM};transition:all 0.12s;padding:0;\n `;\n closeBtn.addEventListener('mouseenter', () => { closeBtn.style.background = M_HOVER; closeBtn.style.color = M_FG; });\n closeBtn.addEventListener('mouseleave', () => { closeBtn.style.background = 'transparent'; closeBtn.style.color = M_FG_DIM; });\n closeBtn.addEventListener('click', (e) => {\n e.stopPropagation();\n s.menuExpanded = false;\n\n if (!s.hasDragged && s.miniMenu) {\n const r = s.miniMenu.getBoundingClientRect();\n s.miniMenu.style.top = r.top + 'px';\n s.miniMenu.style.left = r.left + 'px';\n s.miniMenu.style.bottom = 'auto';\n s.miniMenu.style.right = 'auto';\n s.hasDragged = true;\n }\n\n snapToNearestEdge();\n });\n bar.appendChild(closeBtn);\n\n frag.appendChild(bar);\n s.miniMenu.textContent = '';\n s.miniMenu.appendChild(frag);\n}\n","const B64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\nconst charVal = new Uint8Array(128);\nfor (let i = 0; i < B64.length; i++) charVal[B64.charCodeAt(i)] = i;\n\ninterface Mapping {\n genLine: number;\n genCol: number;\n srcIdx: number;\n srcLine: number;\n srcCol: number;\n}\n\nfunction decodeMappings(encoded: string): Mapping[] {\n const mappings: Mapping[] = [];\n let genLine = 0;\n let genCol = 0;\n let srcIdx = 0;\n let srcLine = 0;\n let srcCol = 0;\n let i = 0;\n const len = encoded.length;\n\n while (i < len) {\n const ch = encoded.charCodeAt(i);\n if (ch === 59) {\n genLine++;\n genCol = 0;\n i++;\n } else if (ch === 44) {\n i++;\n } else {\n const fields: number[] = [];\n while (i < len && encoded.charCodeAt(i) !== 59 && encoded.charCodeAt(i) !== 44) {\n let value = 0;\n let shift = 0;\n let digit: number;\n do {\n digit = charVal[encoded.charCodeAt(i++)];\n value += (digit & 31) << shift;\n shift += 5;\n } while (digit & 32);\n fields.push(value & 1 ? -(value >> 1) : value >> 1);\n }\n if (fields.length >= 4) {\n genCol += fields[0];\n srcIdx += fields[1];\n srcLine += fields[2];\n srcCol += fields[3];\n mappings.push({ genLine, genCol, srcIdx, srcLine, srcCol });\n } else if (fields.length >= 1) {\n genCol += fields[0];\n }\n }\n }\n\n return mappings;\n}\n\ninterface ParsedMap {\n sources: string[];\n mappings: Mapping[];\n}\n\nconst cache = new Map<string, ParsedMap | null>();\nconst inflight = new Map<string, Promise<ParsedMap | null>>();\n\nasync function fetchSourceMap(moduleUrl: string): Promise<ParsedMap | null> {\n if (cache.has(moduleUrl)) return cache.get(moduleUrl)!;\n if (inflight.has(moduleUrl)) return inflight.get(moduleUrl)!;\n\n const promise = (async (): Promise<ParsedMap | null> => {\n try {\n const res = await fetch(moduleUrl);\n if (!res.ok) return null;\n const text = await res.text();\n const match = text.match(/\\/\\/[#@]\\s*sourceMappingURL=(.+?)(?:\\s|$)/);\n if (!match) return null;\n let mapJson: string;\n const url = match[1];\n if (url.startsWith('data:')) {\n const b64 = url.split(',')[1];\n mapJson = atob(b64);\n } else {\n const mapUrl = new URL(url, moduleUrl).href;\n const mapRes = await fetch(mapUrl);\n if (!mapRes.ok) return null;\n mapJson = await mapRes.text();\n }\n\n const raw = JSON.parse(mapJson);\n const mappings = decodeMappings(raw.mappings || '');\n return { sources: raw.sources || [], mappings };\n } catch {\n return null;\n }\n })();\n\n inflight.set(moduleUrl, promise);\n const result = await promise;\n cache.set(moduleUrl, result);\n inflight.delete(moduleUrl);\n return result;\n}\n\nexport interface ResolvedPosition {\n source: string;\n line: number;\n column: number;\n}\n\n/**\n * Resolve a generated (bundled) position back to the original source position.\n * @param moduleUrl - Full URL of the served module (e.g. http://localhost:5173/src/App.tsx?t=...)\n * @param genLine - 1-based line number in the bundled output\n * @param genCol - 0-based column number in the bundled output\n */\nexport async function resolveOriginalPosition(\n moduleUrl: string,\n genLine: number,\n genCol: number,\n): Promise<ResolvedPosition | null> {\n const map = await fetchSourceMap(moduleUrl);\n if (!map || map.mappings.length === 0) return null;\n const targetLine = genLine - 1;\n let best: Mapping | null = null;\n for (const m of map.mappings) {\n if (m.genLine === targetLine) {\n if (m.genCol <= genCol) {\n if (!best || m.genCol > best.genCol) best = m;\n }\n }\n if (m.genLine > targetLine) break;\n }\n\n if (!best) return null;\n let source = map.sources[best.srcIdx] || '';\n try {\n source = new URL(source, moduleUrl).href;\n } catch {\n }\n return {\n source,\n line: best.srcLine + 1,\n column: best.srcCol,\n };\n}\n\nexport function prewarmSourceMap(moduleUrl: string): void {\n fetchSourceMap(moduleUrl);\n}\n","import { SKIP_PREFIXES, isSourceFile } from './constants.js';\nimport { resolveOriginalPosition, prewarmSourceMap } from './sourcemap.js';\nimport type { ComponentInfo, ComponentFrame } from './types.js';\n\ninterface SourceLoc {\n fileName: string;\n lineNumber: number | null;\n columnNumber: number | null;\n _bundledUrl?: string;\n _bundledLine?: number;\n _bundledCol?: number;\n}\n\nconst pendingResolution = new WeakMap<\n ComponentInfo | ComponentFrame,\n { url: string; line: number; col: number }\n>();\n\nfunction isUsefulName(name: string, filePath: string | null, customSkip?: Set<string>): boolean {\n if (!name || name.length <= 1) return false;\n if (customSkip?.has(name)) return false;\n if (name[0] !== name[0].toUpperCase()) return false;\n for (const pfx of SKIP_PREFIXES) {\n if (name.startsWith(pfx)) return false;\n }\n if (/^[A-Z][a-zA-Z]+\\d+$/.test(name)) return false;\n if (filePath && !isSourceFile(filePath)) return false;\n return true;\n}\n\n/** Check name quality only — ignores file path. Used for fallback detection. */\nfunction isCleanComponentName(name: string, customSkip?: Set<string>): boolean {\n if (!name || name.length <= 1) return false;\n if (customSkip?.has(name)) return false;\n if (name[0] !== name[0].toUpperCase()) return false;\n for (const pfx of SKIP_PREFIXES) {\n if (name.startsWith(pfx)) return false;\n }\n if (/^[A-Z][a-zA-Z]+\\d+$/.test(name)) return false;\n return true;\n}\n\n/** Detect infrastructure components (providers, wrappers, boundaries) that are\n * poor candidates for describing a UI element. */\nfunction isInfraName(name: string): boolean {\n return /(?:Provider|Context|Consumer|Boundary|Wrapper|Root|Layout|Suspense)$/i.test(name);\n}\n\nfunction cleanFilePath(raw: string): string {\n return raw\n .replace(/^https?:\\/\\/[^/]+\\//, '')\n .replace(/^rsc:\\/\\/[^/]+\\/[^/]+\\//, '')\n .replace(/^webpack-internal:\\/\\/\\//, '')\n .replace(/^\\([\\w-]+\\)\\//, '')\n .replace(/\\?.*$/, '')\n .replace(/^\\/app\\//, '')\n .replace(/^\\.\\//, '');\n}\n\nfunction parseStackForSource(stack: string | undefined): SourceLoc | null {\n if (!stack) return null;\n const lines = stack.split('\\n');\n for (const line of lines) {\n const match = line.match(/\\((.+):(\\d+):(\\d+)\\)/) || line.match(/at\\s+(.+):(\\d+):(\\d+)/);\n if (match) {\n const rawUrl = match[1].trim();\n const cleaned = cleanFilePath(rawUrl);\n if (isSourceFile(cleaned)) {\n const bundledLine = parseInt(match[2], 10);\n const bundledCol = parseInt(match[3], 10);\n return {\n fileName: cleaned,\n lineNumber: bundledLine,\n columnNumber: bundledCol,\n _bundledUrl: rawUrl,\n _bundledLine: bundledLine,\n _bundledCol: bundledCol,\n };\n }\n }\n }\n return null;\n}\n\nfunction getSourceFromFiber(fiber: any): SourceLoc | null {\n if (fiber._debugSource) {\n return {\n fileName: fiber._debugSource.fileName,\n lineNumber: fiber._debugSource.lineNumber ?? null,\n columnNumber: fiber._debugSource.columnNumber ?? null,\n };\n }\n\n const debugStack = fiber._debugStack;\n if (debugStack) {\n const raw = typeof debugStack === 'string' ? debugStack : debugStack?.stack;\n const loc = parseStackForSource(raw);\n if (loc) {\n const canFetchMap = loc._bundledUrl?.startsWith('http');\n if (canFetchMap) {\n prewarmSourceMap(loc._bundledUrl!);\n return {\n fileName: loc.fileName,\n lineNumber: null,\n columnNumber: null,\n _bundledUrl: loc._bundledUrl,\n _bundledLine: loc._bundledLine,\n _bundledCol: loc._bundledCol,\n };\n }\n return {\n fileName: loc.fileName,\n lineNumber: loc._bundledLine ?? null,\n columnNumber: loc._bundledCol ?? null,\n };\n }\n }\n\n return null;\n}\n\nfunction getReactFiber(el: Element): any | null {\n const keys = Object.keys(el);\n for (const key of keys) {\n if (key.startsWith('__reactFiber$') || key.startsWith('__reactInternalInstance$')) {\n return (el as any)[key];\n }\n }\n return null;\n}\n\nfunction storePendingResolution(target: ComponentInfo | ComponentFrame, src: SourceLoc): void {\n if (src._bundledUrl && src._bundledLine != null) {\n pendingResolution.set(target, {\n url: src._bundledUrl,\n line: src._bundledLine,\n col: src._bundledCol ?? 0,\n });\n }\n}\n\nfunction getReactComponentInfo(el: Element, customSkip?: Set<string>): ComponentInfo | null {\n const fiber = getReactFiber(el);\n if (!fiber) return null;\n\n const elementSrc = getSourceFromFiber(fiber);\n let isFirst = true;\n\n // Fallback: first component with a clean name but no user-source filePath.\n // Prefer this over infrastructure components like providers/wrappers.\n let fallback: { info: ComponentInfo; src: SourceLoc | null } | null = null;\n\n let cur = fiber;\n while (cur) {\n let name: string | null = null;\n let src: SourceLoc | null = null;\n\n if (cur.type && typeof cur.type === 'function') {\n name = cur.type.displayName || cur.type.name;\n src = isFirst && elementSrc ? elementSrc : getSourceFromFiber(cur);\n } else if (cur.type?.$$typeof) {\n // forwardRef/memo: displayName lives on the wrapper, not the inner fn\n const inner = cur.type.render || cur.type.type;\n name = cur.type.displayName\n || (inner && typeof inner === 'function' ? (inner.displayName || inner.name) : null)\n || null;\n if (name) {\n src = isFirst && elementSrc ? elementSrc : getSourceFromFiber(cur);\n }\n }\n\n if (name) {\n const filePath = src?.fileName ? cleanFilePath(src.fileName) : null;\n\n // Best case: user component with source in project files\n if (filePath && isUsefulName(name, filePath, customSkip)) {\n const info: ComponentInfo = {\n name,\n filePath,\n line: src?.lineNumber ?? null,\n column: src?.columnNumber ?? null,\n };\n if (src) storePendingResolution(info, src);\n return info;\n }\n\n // Track first non-infra component as fallback (e.g. Heading, Text, Box\n // from Chakra that lack _debugSource when rendered from server components).\n // Strip bundle-artifact paths — source map resolution may fill in the real path later.\n if (!fallback && isCleanComponentName(name, customSkip) && !isInfraName(name)) {\n const validPath = filePath && isSourceFile(filePath) ? filePath : null;\n fallback = {\n info: { name, filePath: validPath, line: validPath ? (src?.lineNumber ?? null) : null, column: validPath ? (src?.columnNumber ?? null) : null },\n src: src || null,\n };\n }\n\n isFirst = false;\n }\n\n cur = cur.return;\n }\n\n // No user component found — return the closest meaningful library component\n if (fallback) {\n if (fallback.src) storePendingResolution(fallback.info, fallback.src);\n return fallback.info;\n }\n\n return null;\n}\n\nfunction getReactComponentStack(el: Element, maxDepth = 6, customSkip?: Set<string>): ComponentFrame[] {\n const fiber = getReactFiber(el);\n if (!fiber) return [];\n\n const elementSrc = getSourceFromFiber(fiber);\n\n const stack: ComponentFrame[] = [];\n const fallbackStack: ComponentFrame[] = [];\n const seen = new Set<string>();\n const fallbackSeen = new Set<string>();\n let cur = fiber;\n let isFirst = true;\n\n while (cur && stack.length < maxDepth) {\n let name: string | null = null;\n let src: SourceLoc | null = null;\n\n if (cur.type && typeof cur.type === 'function') {\n name = cur.type.displayName || cur.type.name;\n src = isFirst && elementSrc ? elementSrc : getSourceFromFiber(cur);\n } else if (cur.type?.$$typeof) {\n // forwardRef/memo: displayName lives on the wrapper, not the inner fn\n const inner = cur.type.render || cur.type.type;\n name = cur.type.displayName\n || (inner && typeof inner === 'function' ? (inner.displayName || inner.name) : null)\n || null;\n if (name) {\n src = isFirst && elementSrc ? elementSrc : getSourceFromFiber(cur);\n }\n }\n\n if (name) {\n let filePath = src?.fileName ? cleanFilePath(src.fileName) : null;\n\n // Best case: user component with source in project files\n if (filePath && isUsefulName(name, filePath, customSkip) && !seen.has(name)) {\n seen.add(name);\n const frame: ComponentFrame = { name, filePath, line: src?.lineNumber ?? null };\n if (src) storePendingResolution(frame, src);\n stack.push(frame);\n isFirst = false;\n }\n // Track non-infra library components as fallback candidates.\n // Strip bundle-artifact paths — source map resolution may fill in the real path later.\n else if (\n fallbackStack.length < maxDepth &&\n isCleanComponentName(name, customSkip) &&\n !isInfraName(name) &&\n !fallbackSeen.has(name)\n ) {\n fallbackSeen.add(name);\n const validPath = filePath && isSourceFile(filePath) ? filePath : null;\n const frame: ComponentFrame = { name, filePath: validPath, line: validPath ? (src?.lineNumber ?? null) : null };\n if (src) storePendingResolution(frame, src);\n fallbackStack.push(frame);\n }\n }\n\n cur = cur.return;\n }\n\n // If no user components found, use library component fallbacks\n return stack.length > 0 ? stack : fallbackStack;\n}\n\nfunction getVueComponentInfo(el: Element): ComponentInfo | null {\n let cur: Element | null = el;\n while (cur) {\n const vueInstance = (cur as any).__vueParentComponent;\n if (vueInstance) {\n const name = vueInstance.type?.name || vueInstance.type?.__name;\n if (name) {\n const file = vueInstance.type?.__file ?? null;\n return { name, filePath: file, line: null, column: null };\n }\n }\n const vue2 = (cur as any).__vue__;\n if (vue2) {\n const name = vue2.$options?.name || vue2.$options?._componentTag;\n if (name) {\n const file = vue2.$options?.__file ?? null;\n return { name, filePath: file, line: null, column: null };\n }\n }\n cur = cur.parentElement;\n }\n return null;\n}\n\nfunction getSvelteComponentInfo(el: Element): ComponentInfo | null {\n const meta = (el as any).__svelte_meta;\n if (meta?.loc) {\n const file = meta.loc.file;\n const name = file ? file.split('/').pop()?.replace(/\\.svelte$/, '') : null;\n if (name) {\n return { name, filePath: file, line: meta.loc.line ?? null, column: meta.loc.column ?? null };\n }\n }\n const keys = Object.keys(el);\n for (const key of keys) {\n if (key.startsWith('__svelte')) {\n return { name: 'SvelteComponent', filePath: null, line: null, column: null };\n }\n }\n return null;\n}\n\nexport function detectComponent(el: Element, customSkip?: Set<string>): ComponentInfo | null {\n return getReactComponentInfo(el, customSkip)\n || getVueComponentInfo(el)\n || getSvelteComponentInfo(el)\n || null;\n}\n\nexport function detectComponentStack(el: Element, maxDepth = 6, customSkip?: Set<string>): ComponentFrame[] {\n const reactStack = getReactComponentStack(el, maxDepth, customSkip);\n if (reactStack.length > 0) return reactStack;\n\n const info = getVueComponentInfo(el) || getSvelteComponentInfo(el);\n if (info) {\n return [{ name: info.name, filePath: info.filePath, line: info.line }];\n }\n return [];\n}\n\nexport async function resolveComponentInfo(info: ComponentInfo): Promise<void> {\n if (info.line != null) return;\n const pending = pendingResolution.get(info);\n if (!pending) return;\n\n const resolved = await resolveOriginalPosition(pending.url, pending.line, pending.col);\n if (resolved) {\n info.line = resolved.line;\n info.column = resolved.column;\n if (resolved.source) {\n info.filePath = cleanFilePath(resolved.source);\n }\n }\n pendingResolution.delete(info);\n}\n\nexport async function resolveComponentFrame(frame: ComponentFrame): Promise<void> {\n if (frame.line != null) return;\n const pending = pendingResolution.get(frame);\n if (!pending) return;\n\n const resolved = await resolveOriginalPosition(pending.url, pending.line, pending.col);\n if (resolved) {\n frame.line = resolved.line;\n if (resolved.source) {\n frame.filePath = cleanFilePath(resolved.source);\n }\n }\n pendingResolution.delete(frame);\n}\n","import { STYLE_PROPS, STYLE_DEFAULTS, KEEP_ATTRS } from './constants.js';\nimport { detectComponent, detectComponentStack, resolveComponentInfo, resolveComponentFrame } from './frameworks.js';\nimport type { ElementMeta, ComponentFrame } from './types.js';\n\nexport function isLocalhost(): boolean {\n const h = location.hostname;\n return h === 'localhost' || h === '127.0.0.1' || h === '0.0.0.0' || h.endsWith('.local');\n}\n\nfunction getVisibleText(el: Element): string {\n let text = '';\n function walk(node: Node) {\n if (node.nodeType === 3) {\n const t = (node.textContent || '').trim();\n if (t) text += (text ? ' ' : '') + t;\n } else if (node.nodeType === 1) {\n for (let i = 0; i < node.childNodes.length; i++) walk(node.childNodes[i]);\n }\n }\n walk(el);\n if (!text) {\n text = (el as HTMLElement).getAttribute('value')\n || el.getAttribute('alt')\n || el.getAttribute('aria-label')\n || (el as HTMLInputElement).placeholder\n || '';\n }\n if (text.length > 80) text = text.slice(0, 80) + '...';\n return text;\n}\n\nfunction getTagDisplay(el: Element): string {\n let tag = el.tagName.toLowerCase();\n if (el.id) tag += '#' + el.id;\n const cls = Array.from(el.classList)\n .filter((c) => !c.startsWith('__rune-grab'))\n .slice(0, 3);\n if (cls.length) tag += '.' + cls.join('.');\n return tag;\n}\n\nfunction getKeyStyles(el: Element): string {\n const cs = window.getComputedStyle(el);\n const out: string[] = [];\n\n for (const prop of STYLE_PROPS) {\n const cssProp = prop.replace(/[A-Z]/g, (m) => '-' + m.toLowerCase());\n const v = cs.getPropertyValue(cssProp);\n if (!v || STYLE_DEFAULTS.has(v)) continue;\n if (prop === 'fontSize' && v === '16px') continue;\n if (prop === 'fontWeight' && (v === '400' || v === 'normal')) continue;\n if (prop === 'color' && v === 'rgb(0, 0, 0)') continue;\n if (prop === 'lineHeight' && v === 'normal') continue;\n if (prop === 'letterSpacing' && v === 'normal') continue;\n if (prop === 'textAlign' && v === 'start') continue;\n if (prop === 'opacity' && v === '1') continue;\n if (prop === 'borderWidth' && v === '0px') continue;\n if ((prop === 'padding' || prop === 'margin') && (v === '0px' || /^0px(\\s+0px)*$/.test(v))) continue;\n if (prop === 'fontFamily') {\n const first = v.split(',')[0].trim().replace(/^[\"']+|[\"']+$/g, '');\n if (!first || ['system-ui', 'sans-serif', 'serif', 'monospace', '-apple-system'].includes(first)) continue;\n out.push('fontFamily: ' + first);\n continue;\n }\n out.push(prop + ': ' + v);\n }\n return out.join('; ');\n}\n\nfunction cleanHTML(el: Element): string {\n const tag = el.tagName.toLowerCase();\n const attrs: string[] = [];\n\n for (const attr of KEEP_ATTRS) {\n const v = el.getAttribute(attr);\n if (v) attrs.push(`${attr}=\"${v}\"`);\n }\n\n const cls = Array.from(el.classList).filter((c) => !/^(css-|chakra-|__rune)/.test(c));\n if (cls.length) attrs.push(`class=\"${cls.join(' ')}\"`);\n\n const open = `<${tag}${attrs.length ? ' ' + attrs.join(' ') : ''}>`;\n const close = `</${tag}>`;\n\n let text = '';\n el.childNodes.forEach((n) => {\n if (n.nodeType === 3) text += (n.textContent || '').trim();\n });\n\n const childCount = el.children.length;\n let inner = text;\n if (childCount > 0) {\n inner = (text ? text + ' ' : '') + `[${childCount} child element${childCount > 1 ? 's' : ''}]`;\n }\n if (inner.length > 200) inner = inner.slice(0, 200) + '...';\n\n return open + inner + close;\n}\n\nexport function extractElementMeta(el: Element, customSkip?: Set<string>): ElementMeta {\n const local = isLocalhost();\n const component = detectComponent(el, customSkip);\n const tag = getTagDisplay(el);\n const visibleText = getVisibleText(el);\n const html = cleanHTML(el);\n\n const meta: ElementMeta = {\n tag,\n visibleText,\n html,\n attrs: {\n role: el.getAttribute('role') || undefined,\n ariaLabel: el.getAttribute('aria-label') || undefined,\n alt: el.getAttribute('alt') || undefined,\n placeholder: (el as HTMLInputElement).placeholder || undefined,\n type: el.getAttribute('type') || undefined,\n href: el.getAttribute('href') || undefined,\n id: el.id || undefined,\n testId: el.getAttribute('data-testid') || undefined,\n },\n component: component || undefined,\n isLocal: local,\n };\n\n if (local) {\n meta.componentStack = detectComponentStack(el, 3, customSkip);\n } else {\n meta.styles = getKeyStyles(el);\n }\n\n return meta;\n}\n\nexport function buildLabel(meta: ElementMeta): string {\n const textPart = meta.visibleText ? `\"${meta.visibleText.slice(0, 30)}\"` : '';\n const tagPart = meta.tag.split('.')[0].split('#')[0];\n\n let elType: string;\n if (tagPart === 'button' || meta.attrs.role === 'button') elType = 'button';\n else if (tagPart === 'a') elType = 'link';\n else if (tagPart === 'input') elType = `${meta.attrs.type || 'text'} input`;\n else if (tagPart === 'img') elType = 'image';\n else if (tagPart === 'textarea') elType = 'textarea';\n else if (/^h[1-6]$/.test(tagPart)) elType = 'heading';\n else if (['nav', 'section', 'article', 'main', 'aside', 'footer', 'header'].includes(tagPart)) elType = tagPart;\n else elType = `<${tagPart}>`;\n\n let label = textPart ? `${textPart} ${elType}` : elType;\n\n if (meta.component?.name || meta.component?.filePath || meta.isLocal) {\n label += ' in:';\n }\n\n if (label.length > 80) label = label.slice(0, 77) + '...';\n return label;\n}\n\nexport function buildContextText(meta: ElementMeta, prompt?: string): string {\n const parts: string[] = [];\n\n if (prompt) parts.push(prompt);\n parts.push(buildLabel(meta));\n if (meta.isLocal && meta.componentStack?.length) {\n const frame = meta.componentStack[0];\n let line = ` ${frame.name}`;\n if (frame.filePath) {\n line += ` at ${frame.filePath}`;\n if (frame.line) line += `:${frame.line}`;\n }\n parts.push(line);\n } else if (meta.component) {\n let line = ` ${meta.component.name}`;\n if (meta.component.filePath) {\n line += ` at ${meta.component.filePath}`;\n if (meta.component.line) line += `:${meta.component.line}`;\n }\n parts.push(line);\n } else if (meta.isLocal) {\n const pagePath = location.pathname.replace(/^\\//, '') || 'index.html';\n parts.push(` ${pagePath}`);\n }\n\n return parts.join('\\n');\n}\n\nexport async function resolveElementMeta(meta: ElementMeta): Promise<void> {\n const promises: Promise<void>[] = [];\n if (meta.component) {\n promises.push(resolveComponentInfo(meta.component));\n }\n if (meta.componentStack) {\n for (const frame of meta.componentStack) {\n promises.push(resolveComponentFrame(frame));\n }\n }\n await Promise.all(promises);\n}\n","import { Z_OVERLAY, Z_TOOLBAR, OWN_IDS, FLASH_VISIBLE_MS, FLASH_REMOVE_MS } from '../core/constants.js';\nimport { extractElementMeta, resolveElementMeta } from '../core/extract.js';\nimport { isLocalhost } from '../core/extract.js';\nimport { s } from '../core/state.js';\nimport { FONT, MONO, M_BG, M_FG, M_FG_DIM, M_BORDER, M_ACTIVE_BG, M_ACTIVE_FG, ICON_SEND } from './styles.js';\n\nexport function isOwnElement(el: Element | null): boolean {\n if (!el) return false;\n let cur: Element | null = el;\n while (cur) {\n if (cur.id && OWN_IDS.includes(cur.id)) return true;\n cur = cur.parentElement;\n }\n return false;\n}\n\nfunction getToolbarBase(): string {\n return `position:fixed;z-index:${Z_TOOLBAR};background:${M_BG};border:1px solid ${M_BORDER};border-radius:9px;box-shadow:0 2px 8px rgba(0,0,0,0.08),0 0 0 1px rgba(0,0,0,0.04);display:none;flex-direction:row;align-items:center;top:0;left:0;font-family:${FONT};`;\n}\n\nexport function createGrabOverlay(): void {\n if (s.overlay) return;\n\n s.overlay = document.createElement('div');\n s.overlay.id = '__rune-grab-overlay__';\n s.overlay.style.cssText = `position:fixed;pointer-events:none;z-index:${Z_OVERLAY};border:1px dashed ${M_BG};background:transparent;border-radius:3px;transition:all 0.08s ease-out;display:none;top:0;left:0;width:0;height:0;`;\n\n s.label = document.createElement('div');\n s.label.id = '__rune-grab-label__';\n s.label.style.cssText = `position:fixed;pointer-events:none;z-index:${Z_TOOLBAR};background:${M_BG};border:1px solid ${M_BORDER};color:${M_FG};font-size:10px;font-family:${MONO};padding:2px 6px;border-radius:5px;white-space:nowrap;display:none;top:0;left:0;line-height:1.4;font-weight:500;letter-spacing:0.01em;box-shadow:0 2px 8px rgba(0,0,0,0.08);`;\n\n s.toolbar = document.createElement('div');\n s.toolbar.id = '__rune-grab-toolbar__';\n s.toolbar.style.cssText = getToolbarBase() + 'padding:4px;gap:2px;';\n\n s.cursorStyle = document.createElement('style');\n s.cursorStyle.id = '__rune-grab-cursor__';\n s.cursorStyle.textContent = '.__rune-grab-active__ *{cursor:crosshair !important;}.__rune-grab-active__{cursor:crosshair !important;}';\n\n document.head.appendChild(s.cursorStyle);\n document.body.appendChild(s.overlay);\n document.body.appendChild(s.label);\n document.body.appendChild(s.toolbar);\n}\n\nexport function removeGrabOverlay(): void {\n s.overlay?.remove();\n s.label?.remove();\n s.toolbar?.remove();\n s.cursorStyle?.remove();\n s.overlay = null;\n s.label = null;\n s.toolbar = null;\n s.cursorStyle = null;\n}\n\nexport function createSelectionBox(): void {\n if (s.selectionBox) return;\n s.selectionBox = document.createElement('div');\n s.selectionBox.id = '__rune-grab-selection__';\n s.selectionBox.style.cssText = `\n position:fixed;z-index:${Z_OVERLAY};\n border:1px dashed ${M_BG};\n background:transparent;\n border-radius:2px;display:none;\n pointer-events:none;\n top:0;left:0;width:0;height:0;\n `;\n document.body.appendChild(s.selectionBox);\n}\n\nexport function removeSelectionBox(): void {\n s.selectionBox?.remove();\n s.selectionBox = null;\n}\n\nexport function doHighlight(el: Element): void {\n if (!s.overlay || !s.label) return;\n const r = el.getBoundingClientRect();\n s.overlay.style.top = r.top + 'px';\n s.overlay.style.left = r.left + 'px';\n s.overlay.style.width = r.width + 'px';\n s.overlay.style.height = r.height + 'px';\n s.overlay.style.display = 'block';\n\n const meta = extractElementMeta(el, s.customSkipSet);\n\n function formatDisplayName(): string {\n if (isLocalhost() && meta.component) {\n let dn = meta.component.name;\n if (meta.component.filePath) {\n const parts = meta.component.filePath.split('/');\n dn += ` · ${parts[parts.length - 1]}`;\n if (meta.component.line) dn += `:${meta.component.line}`;\n }\n return dn;\n }\n return meta.component ? `<${meta.component.name}>` : `<${meta.tag}>`;\n }\n\n s.label.textContent = formatDisplayName();\n\n // Async: resolve source-mapped lines and update label when ready\n if (isLocalhost() && meta.component && !meta.component.line) {\n resolveElementMeta(meta).then(() => {\n if (s.label && s.selectedElement === el) {\n s.label.textContent = formatDisplayName();\n }\n });\n }\n s.label.style.display = 'block';\n let lt = r.top - 22;\n if (lt < 4) lt = r.bottom + 4;\n s.label.style.top = lt + 'px';\n s.label.style.left = r.left + 'px';\n}\n\nexport function hideHighlight(): void {\n if (s.overlay) s.overlay.style.display = 'none';\n if (s.label) s.label.style.display = 'none';\n}\n\nexport function hideToolbar(): void {\n if (s.toolbar) s.toolbar.style.display = 'none';\n}\n\nexport function flash(msg: string): void {\n if (!document.body) return;\n const f = document.createElement('div');\n f.textContent = msg;\n\n let x = s.lastMouseX + 12;\n let y = s.lastMouseY - 30;\n\n if (x + 150 > window.innerWidth) x = s.lastMouseX - 150;\n if (y < 4) y = s.lastMouseY + 16;\n\n f.style.cssText = `position:fixed;z-index:${Z_TOOLBAR + 3};top:${y}px;left:${x}px;background:${M_BG};color:${M_FG};font-size:11px;font-family:${FONT};padding:5px 12px;border-radius:7px;font-weight:500;pointer-events:none;opacity:1;transition:opacity 0.3s ease-out;box-shadow:0 2px 8px rgba(0,0,0,0.08),0 0 0 1px rgba(0,0,0,0.04);border:1px solid ${M_BORDER};`;\n document.body.appendChild(f);\n setTimeout(() => (f.style.opacity = '0'), FLASH_VISIBLE_MS);\n setTimeout(() => f.remove(), FLASH_REMOVE_MS);\n}\n\nexport function showPromptInput(onSubmit: (prompt: string) => void): void {\n if (!s.toolbar) return;\n s.promptMode = true;\n const prevTop = s.toolbar.style.top;\n const prevLeft = s.toolbar.style.left;\n s.toolbar.innerHTML = '';\n s.toolbar.style.cssText = getToolbarBase() + 'padding:3px 4px 3px 10px;gap:6px;';\n s.toolbar.style.top = prevTop;\n s.toolbar.style.left = prevLeft;\n\n const input = document.createElement('input');\n input.type = 'text';\n input.placeholder = 'Comment (Enter ↵ send, Esc cancel)';\n input.className = '__rune-grab-prompt__';\n input.style.cssText = `background:transparent;border:none;outline:none;color:${M_FG};font-size:12px;font-family:${FONT};width:230px;padding:2px 0;caret-color:${M_FG};`;\n\n // Inject placeholder style — can't set ::placeholder via inline styles\n if (!document.getElementById('__rune-grab-placeholder-style__')) {\n const style = document.createElement('style');\n style.id = '__rune-grab-placeholder-style__';\n style.textContent = `.__rune-grab-prompt__::placeholder{color:${M_FG_DIM} !important;opacity:1 !important;}`;\n document.head.appendChild(style);\n }\n\n const sendBtn = document.createElement('button');\n sendBtn.innerHTML = ICON_SEND;\n sendBtn.style.cssText = `width:22px;height:22px;border:1px solid ${M_BORDER};background:${M_ACTIVE_BG};color:${M_ACTIVE_FG};border-radius:50%;cursor:pointer;display:flex;align-items:center;justify-content:center;flex-shrink:0;transition:all 0.15s;`;\n\n function submit() {\n let prompt = input.value.trim();\n if (prompt && !prompt.endsWith(':')) prompt += ':';\n s.promptMode = false;\n onSubmit(prompt);\n }\n\n function cancel() {\n s.promptMode = false;\n s.locked = false;\n hideToolbar();\n hideHighlight();\n s.selectedElement = null;\n }\n\n sendBtn.addEventListener('click', (e) => { e.stopPropagation(); e.preventDefault(); submit(); });\n input.addEventListener('keydown', (e) => {\n e.stopPropagation();\n if (e.key === 'Enter') { e.preventDefault(); submit(); }\n if (e.key === 'Escape') { e.preventDefault(); cancel(); }\n });\n input.addEventListener('click', (e) => e.stopPropagation());\n\n s.toolbar.appendChild(input);\n s.toolbar.appendChild(sendBtn);\n\n const tw = 270;\n const curLeft = parseFloat(s.toolbar.style.left);\n if (curLeft + tw > window.innerWidth - 8) {\n s.toolbar.style.left = Math.max(8, window.innerWidth - tw - 8) + 'px';\n }\n s.toolbar.style.display = 'flex';\n setTimeout(() => input.focus(), 0);\n}\n","import { s } from '../core/state.js';\n\nexport function parseShortcut(shortcut: string) {\n const parts = shortcut.split('+');\n return {\n key: parts[parts.length - 1].toLowerCase(),\n meta: parts.some((p) => /^(meta|cmd)$/i.test(p)),\n ctrl: parts.some((p) => /^(ctrl|control)$/i.test(p)),\n shift: parts.some((p) => /^shift$/i.test(p)),\n alt: parts.some((p) => /^(alt|option)$/i.test(p)),\n };\n}\n\ntype ToggleFn = () => void;\ntype RenderFn = () => void;\n\nlet _toggle: ToggleFn;\nlet _renderMiniMenu: RenderFn;\n\nexport function setKeyboardCallbacks(toggle: ToggleFn, renderMiniMenu: RenderFn): void {\n _toggle = toggle;\n _renderMiniMenu = renderMiniMenu;\n}\n\nexport function onShortcut(e: KeyboardEvent): void {\n const sc = parseShortcut(s.config.shortcut);\n if (e.key.toLowerCase() === sc.key && e.metaKey === sc.meta && e.ctrlKey === sc.ctrl && e.shiftKey === sc.shift && e.altKey === sc.alt) {\n e.preventDefault();\n _toggle();\n _renderMiniMenu();\n }\n}\n","import { extractElementMeta, buildLabel, buildContextText, resolveElementMeta } from '../core/extract.js';\nimport { s } from '../core/state.js';\nimport { isOwnElement, doHighlight, hideHighlight, hideToolbar, showPromptInput, flash } from '../ui/overlay.js';\nimport { TARGET_LABELS } from '../ui/styles.js';\nimport type { GrabResult } from '../core/types.js';\n\ntype DispatchFn = (result: GrabResult) => Promise<void>;\ntype DeactivateFn = () => void;\ntype RenderFn = () => void;\n\nlet _dispatch: DispatchFn;\nlet _deactivate: DeactivateFn;\nlet _renderMiniMenu: RenderFn;\n\nexport function setReferenceCallbacks(dispatch: DispatchFn, deactivate: DeactivateFn, renderMiniMenu: RenderFn): void {\n _dispatch = dispatch;\n _deactivate = deactivate;\n _renderMiniMenu = renderMiniMenu;\n}\n\nasync function executeReferenceGrab(el: Element, prompt: string): Promise<void> {\n const meta = extractElementMeta(el, s.customSkipSet);\n await resolveElementMeta(meta);\n const labelText = buildLabel(meta);\n const contextText = buildContextText(meta, prompt);\n\n const result: GrabResult = {\n type: 'reference', label: labelText, text: contextText, prompt, meta,\n };\n await _dispatch(result);\n flash(`Sent to ${TARGET_LABELS[s.config.target]}`);\n\n s.locked = false;\n hideToolbar();\n hideHighlight();\n s.selectedElement = null;\n}\n\nfunction showPromptForGrab(el: Element): void {\n if (!s.toolbar) return;\n const r = el.getBoundingClientRect();\n const tw = 270;\n const th = 34;\n let top = r.bottom + 6;\n let left = r.left + (r.width / 2) - (tw / 2);\n if (top + th > window.innerHeight - 8) top = r.top - th - 6;\n if (left < 8) left = 8;\n if (left + tw > window.innerWidth - 8) left = window.innerWidth - tw - 8;\n s.toolbar.style.top = top + 'px';\n s.toolbar.style.left = left + 'px';\n\n showPromptInput(async (prompt) => {\n await executeReferenceGrab(el, prompt);\n });\n}\n\nexport function onRefMouseMove(e: MouseEvent): void {\n if (s.locked || s.mmRAF) return;\n s.mmRAF = requestAnimationFrame(() => {\n s.mmRAF = 0;\n const el = document.elementFromPoint(e.clientX, e.clientY);\n if (!el || isOwnElement(el) || el === document.body || el === document.documentElement) {\n hideHighlight(); s.selectedElement = null; return;\n }\n s.selectedElement = el;\n doHighlight(el);\n });\n}\n\nexport function onRefClick(e: MouseEvent): void {\n if (isOwnElement(e.target as Element)) return;\n if (s.promptMode) return;\n e.preventDefault();\n e.stopPropagation();\n e.stopImmediatePropagation();\n if (s.locked) { s.locked = false; hideToolbar(); return; }\n if (s.selectedElement) {\n s.locked = true;\n doHighlight(s.selectedElement);\n showPromptForGrab(s.selectedElement);\n }\n}\n\nexport function onRefKeyDown(e: KeyboardEvent): void {\n if (s.promptMode) return;\n if (e.key === 'Escape') {\n if (s.locked) { s.locked = false; hideToolbar(); s.selectedElement = null; hideHighlight(); }\n else { _deactivate(); _renderMiniMenu(); }\n }\n}\n\nexport function onRefScroll(): void {\n if (s.promptMode) return;\n if (s.locked) { s.locked = false; hideToolbar(); s.selectedElement = null; hideHighlight(); }\n}\n","import { captureRect } from '../core/screenshot.js';\nimport { isLocalhost } from '../core/extract.js';\nimport { s } from '../core/state.js';\nimport { isOwnElement, createSelectionBox, flash } from '../ui/overlay.js';\nimport type { GrabResult } from '../core/types.js';\n\ntype DispatchFn = (result: GrabResult) => Promise<void>;\ntype DeactivateFn = () => void;\ntype RenderFn = () => void;\n\nlet _dispatch: DispatchFn;\nlet _deactivate: DeactivateFn;\nlet _renderMiniMenu: RenderFn;\n\nexport function setScreenshotCallbacks(dispatch: DispatchFn, deactivate: DeactivateFn, renderMiniMenu: RenderFn): void {\n _dispatch = dispatch;\n _deactivate = deactivate;\n _renderMiniMenu = renderMiniMenu;\n}\n\nexport function onSSMouseDown(e: MouseEvent): void {\n if (e.button !== 0) return;\n if (isOwnElement(e.target as Element)) return;\n e.preventDefault();\n e.stopPropagation();\n s.ssDrawing = true;\n s.ssStartX = e.clientX;\n s.ssStartY = e.clientY;\n if (s.selectionBox) {\n s.selectionBox.style.left = s.ssStartX + 'px';\n s.selectionBox.style.top = s.ssStartY + 'px';\n s.selectionBox.style.width = '0px';\n s.selectionBox.style.height = '0px';\n s.selectionBox.style.display = 'block';\n }\n}\n\nexport function onSSMouseMove(e: MouseEvent): void {\n if (!s.ssDrawing || !s.selectionBox) return;\n e.preventDefault();\n const x = Math.min(e.clientX, s.ssStartX);\n const y = Math.min(e.clientY, s.ssStartY);\n const w = Math.abs(e.clientX - s.ssStartX);\n const h = Math.abs(e.clientY - s.ssStartY);\n s.selectionBox.style.left = x + 'px';\n s.selectionBox.style.top = y + 'px';\n s.selectionBox.style.width = w + 'px';\n s.selectionBox.style.height = h + 'px';\n}\n\nexport async function onSSMouseUp(e: MouseEvent): Promise<void> {\n if (!s.ssDrawing) return;\n s.ssDrawing = false;\n e.preventDefault();\n e.stopPropagation();\n\n const x = Math.min(e.clientX, s.ssStartX);\n const y = Math.min(e.clientY, s.ssStartY);\n const w = Math.abs(e.clientX - s.ssStartX);\n const h = Math.abs(e.clientY - s.ssStartY);\n const selBox = s.selectionBox;\n if (selBox) selBox.remove();\n s.selectionBox = null;\n if (s.miniMenu) s.miniMenu.style.display = 'none';\n if (s.cursorStyle) s.cursorStyle.disabled = true;\n\n await new Promise((r) => requestAnimationFrame(() => requestAnimationFrame(r)));\n\n if (w >= 10 && h >= 10) {\n const image = await captureRect({ x, y, width: w, height: h });\n\n if (s.miniMenu) s.miniMenu.style.display = '';\n if (s.cursorStyle) s.cursorStyle.disabled = false;\n createSelectionBox();\n\n if (image) {\n const result: GrabResult = {\n type: 'screenshot',\n label: `Region ${w}×${h}`,\n text: `Screenshot region: ${w}×${h} at (${Math.round(x)}, ${Math.round(y)})`,\n prompt: '',\n image,\n meta: { tag: 'region', visibleText: '', html: '', attrs: {}, isLocal: isLocalhost() },\n };\n await _dispatch(result);\n flash('Screenshot captured');\n }\n } else {\n if (s.miniMenu) s.miniMenu.style.display = '';\n if (s.cursorStyle) s.cursorStyle.disabled = false;\n createSelectionBox();\n }\n}\n\nexport function onSSKeyDown(e: KeyboardEvent): void {\n if (e.key === 'Escape') {\n if (s.ssDrawing) {\n s.ssDrawing = false;\n if (s.selectionBox) s.selectionBox.style.display = 'none';\n } else {\n _deactivate();\n _renderMiniMenu();\n }\n }\n}\n","import { releaseStream } from './screenshot.js';\nimport { sendToApp } from '../targets/app.js';\nimport { copyToClipboard } from '../targets/clipboard.js';\nimport type { RuneGrabConfig, GrabResult, TargetApp } from './types.js';\nimport { s, DEFAULTS } from './state.js';\nimport { createMiniMenu, renderMiniMenu, loadAutoPastePref, checkHelper, setMenuCallbacks } from '../ui/menu.js';\nimport { createGrabOverlay, removeGrabOverlay, createSelectionBox, removeSelectionBox } from '../ui/overlay.js';\nimport { onShortcut, setKeyboardCallbacks } from '../handlers/keyboard.js';\nimport { onRefMouseMove, onRefClick, onRefKeyDown, onRefScroll, setReferenceCallbacks } from '../handlers/inspect.js';\nimport { onSSMouseDown, onSSMouseMove, onSSMouseUp, onSSKeyDown, setScreenshotCallbacks } from '../handlers/capture.js';\n\nasync function dispatchResult(result: GrabResult): Promise<void> {\n s.config.onGrab(result);\n window.dispatchEvent(new CustomEvent('rune:grab', { detail: result }));\n\n if (s.config.target === 'clipboard') {\n await copyToClipboard(result);\n } else {\n await sendToApp(s.config.target, result);\n }\n}\n\nexport function activate(): void {\n if (s.active) return;\n if (!document.body || !document.head) return;\n s.active = true;\n\n document.documentElement.classList.add('__rune-grab-active__');\n\n if (s.grabType === 'screenshot') {\n createGrabOverlay();\n createSelectionBox();\n document.addEventListener('mousedown', onSSMouseDown, true);\n document.addEventListener('mousemove', onSSMouseMove, true);\n document.addEventListener('mouseup', onSSMouseUp, true);\n document.addEventListener('keydown', onSSKeyDown, true);\n } else {\n createGrabOverlay();\n document.addEventListener('mousemove', onRefMouseMove, true);\n document.addEventListener('click', onRefClick, true);\n document.addEventListener('keydown', onRefKeyDown, true);\n document.addEventListener('scroll', onRefScroll, true);\n }\n\n s.config.onToggle(true);\n}\n\nexport function deactivate(): void {\n if (!s.active) return;\n s.active = false;\n s.locked = false;\n s.promptMode = false;\n s.ssDrawing = false;\n s.selectedElement = null;\n\n if (s.mmRAF) { cancelAnimationFrame(s.mmRAF); s.mmRAF = 0; }\n\n document.removeEventListener('mousedown', onSSMouseDown, true);\n document.removeEventListener('mousemove', onSSMouseMove, true);\n document.removeEventListener('mouseup', onSSMouseUp, true);\n document.removeEventListener('keydown', onSSKeyDown, true);\n\n document.removeEventListener('mousemove', onRefMouseMove, true);\n document.removeEventListener('click', onRefClick, true);\n document.removeEventListener('keydown', onRefKeyDown, true);\n document.removeEventListener('scroll', onRefScroll, true);\n\n removeGrabOverlay();\n removeSelectionBox();\n document.documentElement.classList.remove('__rune-grab-active__');\n\n s.config.onToggle(false);\n}\n\nexport function toggle(): void {\n if (s.active) deactivate(); else activate();\n}\n\nexport function isActive(): boolean { return s.active; }\n\nexport function setTarget(target: TargetApp): void {\n s.config.target = target;\n if (s.menuExpanded) renderMiniMenu();\n}\n\nexport function getTarget(): TargetApp { return s.config.target; }\n\nexport function init(userConfig: RuneGrabConfig = {}): () => void {\n if (s.initialized) return () => { };\n\n s.config = { ...DEFAULTS, ...userConfig };\n s.initialized = true;\n\n if (userConfig.skipComponents?.length) {\n s.customSkipSet = new Set(userConfig.skipComponents);\n }\n\n setMenuCallbacks(activate, deactivate);\n setKeyboardCallbacks(toggle, renderMiniMenu);\n setReferenceCallbacks(dispatchResult, deactivate, renderMiniMenu);\n setScreenshotCallbacks(dispatchResult, deactivate, renderMiniMenu);\n\n const savedAutoPaste = loadAutoPastePref();\n if (savedAutoPaste) {\n s.autoPasteEnabled = true;\n checkHelper().then((ok) => {\n s.helperAvailable = ok;\n if (!ok) s.config.target = 'clipboard';\n if (s.menuExpanded) renderMiniMenu();\n });\n }\n\n const setup = () => {\n createMiniMenu();\n document.addEventListener('keydown', onShortcut, true);\n };\n\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', setup, { once: true });\n } else {\n setup();\n }\n\n return () => {\n deactivate();\n releaseStream();\n s.miniMenu?.remove();\n document.removeEventListener('keydown', onShortcut, true);\n s.initialized = false;\n s.hasDragged = false;\n };\n}\n","import { useEffect, useState, useCallback, useRef } from 'react';\nimport type { RuneGrabConfig, GrabResult, TargetApp } from '../core/types.js';\n\nexport type { RuneGrabConfig, GrabResult, TargetApp };\n\nexport interface UseRuneGrabReturn {\n active: boolean;\n toggle: () => void;\n activate: () => void;\n deactivate: () => void;\n setTarget: (target: TargetApp) => void;\n target: TargetApp;\n lastGrab: GrabResult | null;\n}\n\nexport function useRuneGrab(config: RuneGrabConfig = {}): UseRuneGrabReturn {\n const [active, setActive] = useState(false);\n const [target, setTargetState] = useState<TargetApp>(config.target ?? 'clipboard');\n const [lastGrab, setLastGrab] = useState<GrabResult | null>(null);\n const cleanupRef = useRef<(() => void) | null>(null);\n const engineRef = useRef<typeof import('../core/engine.js') | null>(null);\n\n useEffect(() => {\n let mounted = true;\n import('../core/engine.js').then((engine) => {\n if (!mounted) return;\n engineRef.current = engine;\n cleanupRef.current = engine.init({\n ...config,\n onGrab: (result) => {\n setLastGrab(result);\n config.onGrab?.(result);\n },\n onToggle: (isActive) => {\n setActive(isActive);\n config.onToggle?.(isActive);\n },\n });\n });\n\n return () => {\n mounted = false;\n cleanupRef.current?.();\n };\n }, []);\n\n const toggle = useCallback(() => {\n engineRef.current?.toggle();\n }, []);\n\n const activate = useCallback(() => {\n engineRef.current?.activate();\n }, []);\n\n const deactivate = useCallback(() => {\n engineRef.current?.deactivate();\n }, []);\n\n const setTarget = useCallback((t: TargetApp) => {\n setTargetState(t);\n engineRef.current?.setTarget(t);\n }, []);\n\n return { active, toggle, activate, deactivate, setTarget, target, lastGrab };\n}\n"],"mappings":"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","names":["HELPER_PORT","activate","deactivate","HELPER_PORT","isActive","toggle","renderMiniMenu","deactivate","renderMiniMenu","_deactivate","_renderMiniMenu","deactivate","renderMiniMenu","_dispatch","_deactivate","_renderMiniMenu","isActive","toggle","activate","deactivate","setTarget"]}