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.cjs +61 -32
- package/dist/react.cjs.map +1 -1
- package/dist/react.js +61 -32
- package/dist/react.js.map +1 -1
- package/dist/rune-grab.cjs +61 -32
- package/dist/rune-grab.cjs.map +1 -1
- package/dist/rune-grab.iife.global.js +21 -21
- package/dist/rune-grab.iife.global.js.map +1 -1
- package/dist/rune-grab.js +61 -32
- package/dist/rune-grab.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/iife.ts","../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"],"sourcesContent":["import { init, activate, deactivate, toggle, isActive, setTarget, getTarget } from './core/engine.js';\nimport type { RuneGrabConfig, GrabResult, TargetApp } from './core/types.js';\n\nconst userConfig = (typeof window !== 'undefined' && (window as any).__RUNE_GRAB_CONFIG__) || {};\ninit(userConfig);\n\nexport { init, activate, deactivate, toggle, isActive, setTarget, getTarget };\nexport type { RuneGrabConfig, GrabResult, TargetApp };\n","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"],"mappings":"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","names":["iife_exports","__export","activate","deactivate","getTarget","init","isActive","setTarget","toggle","customProvider","activeStream","getStream","tracks","captureFromStream","stream","rect","format","quality","video","resolve","reject","r","videoW","videoH","scaleX","scaleY","sx","sy","sw","sh","dpr","canvas","captureRect","domRect","customProvider","err","releaseStream","copyToClipboard","result","items","imageBlob","HELPER_PORT","isHelperRunning","ac","timer","res","sendToHelper","target","result","sendToApp","target","result","copyToClipboard","isHelperRunning","sendToHelper","isMac","DEFAULTS","s","SKIP_PREFIXES","isLibraryFile","filePath","isSourceFile","STYLE_PROPS","STYLE_DEFAULTS","KEEP_ATTRS","Z_OVERLAY","Z_TOOLBAR","OWN_IDS","DRAG_THRESHOLD_PX","HELPER_PORT","HEALTH_CHECK_TIMEOUT_MS","FLASH_VISIBLE_MS","FLASH_REMOVE_MS","LS_KEY","FONT","MONO","M_BG","M_FG","M_FG_DIM","M_BORDER","M_HOVER","M_ACTIVE_BG","M_ACTIVE_FG","ICON_SS","ICON_REF","ICON_X","ICON_CHEVRON_RIGHT","ICON_CHEVRON_LEFT","ICON_SEND","ICON_GRIP","TARGET_LABELS","TARGETS_CLIPBOARD","TARGETS_APPS","_activate","_deactivate","setMenuCallbacks","activate","deactivate","_activate","_deactivate","loadAutoPastePref","LS_KEY","saveAutoPastePref","v","checkHelper","ac","timer","HEALTH_CHECK_TIMEOUT_MS","res","HELPER_PORT","onAutoPasteToggle","enabled","s","renderMiniMenu","buildToggle","on","onChange","wrap","track","M_ACTIVE_BG","thumb","M_ACTIVE_FG","e","grabIconBtn","icon","isActive","onClick","btn","M_FG_DIM","M_HOVER","M_FG","sep","d","M_BORDER","onGripPointerDown","rect","onGripPointerMove","dx","dy","DRAG_THRESHOLD_PX","vw","vh","onGripPointerUp","snapToNearestEdge","cx","cy","distTop","distBottom","distLeft","distRight","minDist","tabRect","tw","th","targetX","targetY","clampToViewport","x","y","clamped","createMiniMenu","Z_TOOLBAR","FONT","frag","chevronSvg","tabW","tabH","borderRadius","edge","tab","M_BG","bar","grip","ICON_GRIP","ssActive","ICON_SS","refActive","ICON_REF","visibleTargets","TARGETS_CLIPBOARD","TARGETS_APPS","toggleBtn","ICON_CHEVRON_RIGHT","ICON_CHEVRON_LEFT","targetsWrap","naturalW","currentW","t","isCurrent","TARGET_LABELS","hint","MONO","checking","closeBtn","ICON_X","r","B64","charVal","i","decodeMappings","encoded","mappings","genLine","genCol","srcIdx","srcLine","srcCol","len","ch","fields","value","shift","digit","cache","inflight","fetchSourceMap","moduleUrl","promise","res","match","mapJson","url","b64","mapUrl","mapRes","raw","result","resolveOriginalPosition","map","targetLine","best","m","source","prewarmSourceMap","pendingResolution","isUsefulName","name","filePath","customSkip","pfx","SKIP_PREFIXES","isSourceFile","cleanFilePath","raw","parseStackForSource","stack","lines","line","match","rawUrl","cleaned","bundledLine","bundledCol","getSourceFromFiber","fiber","debugStack","loc","prewarmSourceMap","getReactFiber","el","keys","key","storePendingResolution","target","src","getReactComponentInfo","elementSrc","isFirst","cur","info","inner","getReactComponentStack","maxDepth","seen","frame","getVueComponentInfo","vueInstance","file","vue2","getSvelteComponentInfo","meta","detectComponent","detectComponentStack","reactStack","resolveComponentInfo","pending","resolved","resolveOriginalPosition","resolveComponentFrame","isLocalhost","h","getVisibleText","el","text","walk","node","t","i","getTagDisplay","tag","cls","c","getKeyStyles","cs","out","prop","STYLE_PROPS","cssProp","m","v","STYLE_DEFAULTS","first","cleanHTML","attrs","attr","KEEP_ATTRS","open","close","n","childCount","inner","extractElementMeta","customSkip","local","component","detectComponent","visibleText","html","meta","detectComponentStack","buildLabel","textPart","tagPart","elType","label","buildContextText","prompt","parts","frame","line","pagePath","resolveElementMeta","promises","resolveComponentInfo","resolveComponentFrame","isOwnElement","el","cur","OWN_IDS","getToolbarBase","Z_TOOLBAR","M_BG","M_BORDER","FONT","createGrabOverlay","s","Z_OVERLAY","M_FG","MONO","removeGrabOverlay","createSelectionBox","removeSelectionBox","doHighlight","r","meta","extractElementMeta","formatDisplayName","isLocalhost","dn","parts","resolveElementMeta","lt","hideHighlight","hideToolbar","flash","msg","f","x","y","FLASH_VISIBLE_MS","FLASH_REMOVE_MS","showPromptInput","onSubmit","prevTop","prevLeft","input","style","M_FG_DIM","sendBtn","ICON_SEND","M_ACTIVE_BG","M_ACTIVE_FG","submit","prompt","cancel","e","tw","parseShortcut","shortcut","parts","p","_toggle","_renderMiniMenu","setKeyboardCallbacks","toggle","renderMiniMenu","onShortcut","e","sc","s","_dispatch","_deactivate","_renderMiniMenu","setReferenceCallbacks","dispatch","deactivate","renderMiniMenu","executeReferenceGrab","el","prompt","meta","extractElementMeta","s","resolveElementMeta","labelText","buildLabel","contextText","buildContextText","flash","TARGET_LABELS","hideToolbar","hideHighlight","showPromptForGrab","r","tw","th","top","left","showPromptInput","onRefMouseMove","e","isOwnElement","doHighlight","onRefClick","onRefKeyDown","onRefScroll","_dispatch","_deactivate","_renderMiniMenu","setScreenshotCallbacks","dispatch","deactivate","renderMiniMenu","onSSMouseDown","e","isOwnElement","s","onSSMouseMove","x","y","w","h","onSSMouseUp","selBox","r","image","captureRect","createSelectionBox","result","isLocalhost","flash","onSSKeyDown","dispatchResult","result","s","copyToClipboard","sendToApp","activate","createGrabOverlay","createSelectionBox","onSSMouseDown","onSSMouseMove","onSSMouseUp","onSSKeyDown","onRefMouseMove","onRefClick","onRefKeyDown","onRefScroll","deactivate","removeGrabOverlay","removeSelectionBox","toggle","isActive","setTarget","target","renderMiniMenu","getTarget","init","userConfig","DEFAULTS","setMenuCallbacks","setKeyboardCallbacks","setReferenceCallbacks","setScreenshotCallbacks","loadAutoPastePref","checkHelper","ok","setup","createMiniMenu","onShortcut","releaseStream","userConfig","init"]}
|
|
1
|
+
{"version":3,"sources":["../src/iife.ts","../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"],"sourcesContent":["import { init, activate, deactivate, toggle, isActive, setTarget, getTarget } from './core/engine.js';\nimport type { RuneGrabConfig, GrabResult, TargetApp } from './core/types.js';\n\nconst userConfig = (typeof window !== 'undefined' && (window as any).__RUNE_GRAB_CONFIG__) || {};\ninit(userConfig);\n\nexport { init, activate, deactivate, toggle, isActive, setTarget, getTarget };\nexport type { RuneGrabConfig, GrabResult, TargetApp };\n","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"],"mappings":"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","names":["iife_exports","__export","activate","deactivate","getTarget","init","isActive","setTarget","toggle","customProvider","activeStream","getStream","tracks","captureFromStream","stream","rect","format","quality","video","resolve","reject","r","videoW","videoH","scaleX","scaleY","sx","sy","sw","sh","dpr","canvas","captureRect","domRect","customProvider","err","releaseStream","copyToClipboard","result","items","imageBlob","HELPER_PORT","isHelperRunning","ac","timer","res","sendToHelper","target","result","sendToApp","target","result","copyToClipboard","isHelperRunning","sendToHelper","isMac","DEFAULTS","s","SKIP_PREFIXES","isLibraryFile","filePath","isSourceFile","STYLE_PROPS","STYLE_DEFAULTS","KEEP_ATTRS","Z_OVERLAY","Z_TOOLBAR","OWN_IDS","DRAG_THRESHOLD_PX","HELPER_PORT","HEALTH_CHECK_TIMEOUT_MS","FLASH_VISIBLE_MS","FLASH_REMOVE_MS","LS_KEY","FONT","MONO","M_BG","M_FG","M_FG_DIM","M_BORDER","M_HOVER","M_ACTIVE_BG","M_ACTIVE_FG","ICON_SS","ICON_REF","ICON_X","ICON_CHEVRON_RIGHT","ICON_CHEVRON_LEFT","ICON_SEND","ICON_GRIP","TARGET_LABELS","TARGETS_CLIPBOARD","TARGETS_APPS","_activate","_deactivate","setMenuCallbacks","activate","deactivate","_activate","_deactivate","loadAutoPastePref","LS_KEY","saveAutoPastePref","v","checkHelper","ac","timer","HEALTH_CHECK_TIMEOUT_MS","res","HELPER_PORT","onAutoPasteToggle","enabled","s","renderMiniMenu","buildToggle","on","onChange","wrap","track","M_ACTIVE_BG","thumb","M_ACTIVE_FG","e","grabIconBtn","icon","isActive","onClick","btn","M_FG_DIM","M_HOVER","M_FG","sep","d","M_BORDER","onGripPointerDown","rect","onGripPointerMove","dx","dy","DRAG_THRESHOLD_PX","vw","vh","onGripPointerUp","snapToNearestEdge","cx","cy","distTop","distBottom","distLeft","distRight","minDist","tabRect","tw","th","targetX","targetY","clampToViewport","x","y","clamped","createMiniMenu","Z_TOOLBAR","FONT","frag","chevronSvg","tabW","tabH","borderRadius","edge","tab","M_BG","bar","grip","ICON_GRIP","ssActive","ICON_SS","refActive","ICON_REF","visibleTargets","TARGETS_CLIPBOARD","TARGETS_APPS","toggleBtn","ICON_CHEVRON_RIGHT","ICON_CHEVRON_LEFT","targetsWrap","naturalW","currentW","t","isCurrent","TARGET_LABELS","hint","MONO","checking","closeBtn","ICON_X","r","B64","charVal","i","decodeMappings","encoded","mappings","genLine","genCol","srcIdx","srcLine","srcCol","len","ch","fields","value","shift","digit","cache","inflight","fetchSourceMap","moduleUrl","promise","res","match","mapJson","url","b64","mapUrl","mapRes","raw","result","resolveOriginalPosition","map","targetLine","best","m","source","prewarmSourceMap","pendingResolution","isUsefulName","name","filePath","customSkip","pfx","SKIP_PREFIXES","isSourceFile","isCleanComponentName","isInfraName","cleanFilePath","raw","parseStackForSource","stack","lines","line","match","rawUrl","cleaned","bundledLine","bundledCol","getSourceFromFiber","fiber","debugStack","loc","prewarmSourceMap","getReactFiber","el","keys","key","storePendingResolution","target","src","getReactComponentInfo","elementSrc","isFirst","fallback","cur","inner","info","validPath","getReactComponentStack","maxDepth","fallbackStack","seen","fallbackSeen","frame","getVueComponentInfo","vueInstance","file","vue2","getSvelteComponentInfo","meta","detectComponent","detectComponentStack","reactStack","resolveComponentInfo","pending","resolved","resolveOriginalPosition","resolveComponentFrame","isLocalhost","h","getVisibleText","el","text","walk","node","t","i","getTagDisplay","tag","cls","c","getKeyStyles","cs","out","prop","STYLE_PROPS","cssProp","m","v","STYLE_DEFAULTS","first","cleanHTML","attrs","attr","KEEP_ATTRS","open","close","n","childCount","inner","extractElementMeta","customSkip","local","component","detectComponent","visibleText","html","meta","detectComponentStack","buildLabel","textPart","tagPart","elType","label","buildContextText","prompt","parts","frame","line","pagePath","resolveElementMeta","promises","resolveComponentInfo","resolveComponentFrame","isOwnElement","el","cur","OWN_IDS","getToolbarBase","Z_TOOLBAR","M_BG","M_BORDER","FONT","createGrabOverlay","s","Z_OVERLAY","M_FG","MONO","removeGrabOverlay","createSelectionBox","removeSelectionBox","doHighlight","r","meta","extractElementMeta","formatDisplayName","isLocalhost","dn","parts","resolveElementMeta","lt","hideHighlight","hideToolbar","flash","msg","f","x","y","FLASH_VISIBLE_MS","FLASH_REMOVE_MS","showPromptInput","onSubmit","prevTop","prevLeft","input","style","M_FG_DIM","sendBtn","ICON_SEND","M_ACTIVE_BG","M_ACTIVE_FG","submit","prompt","cancel","e","tw","parseShortcut","shortcut","parts","p","_toggle","_renderMiniMenu","setKeyboardCallbacks","toggle","renderMiniMenu","onShortcut","e","sc","s","_dispatch","_deactivate","_renderMiniMenu","setReferenceCallbacks","dispatch","deactivate","renderMiniMenu","executeReferenceGrab","el","prompt","meta","extractElementMeta","s","resolveElementMeta","labelText","buildLabel","contextText","buildContextText","flash","TARGET_LABELS","hideToolbar","hideHighlight","showPromptForGrab","r","tw","th","top","left","showPromptInput","onRefMouseMove","e","isOwnElement","doHighlight","onRefClick","onRefKeyDown","onRefScroll","_dispatch","_deactivate","_renderMiniMenu","setScreenshotCallbacks","dispatch","deactivate","renderMiniMenu","onSSMouseDown","e","isOwnElement","s","onSSMouseMove","x","y","w","h","onSSMouseUp","selBox","r","image","captureRect","createSelectionBox","result","isLocalhost","flash","onSSKeyDown","dispatchResult","result","s","copyToClipboard","sendToApp","activate","createGrabOverlay","createSelectionBox","onSSMouseDown","onSSMouseMove","onSSMouseUp","onSSKeyDown","onRefMouseMove","onRefClick","onRefKeyDown","onRefScroll","deactivate","removeGrabOverlay","removeSelectionBox","toggle","isActive","setTarget","target","renderMiniMenu","getTarget","init","userConfig","DEFAULTS","setMenuCallbacks","setKeyboardCallbacks","setReferenceCallbacks","setScreenshotCallbacks","loadAutoPastePref","checkHelper","ok","setup","createMiniMenu","onShortcut","releaseStream","userConfig","init"]}
|