rune-grab 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/screenshot.ts","../src/targets/clipboard.ts","../src/targets/app.ts","../src/core/state.ts","../src/core/constants.ts","../src/ui/styles.ts","../src/ui/menu.ts","../src/core/frameworks.ts","../src/core/extract.ts","../src/ui/overlay.ts","../src/handlers/keyboard.ts","../src/handlers/inspect.ts","../src/handlers/capture.ts","../src/core/engine.ts","../src/hooks/react.ts"],"sourcesContent":["type CaptureProvider = (rect: DOMRect) => Promise<string | null>;\nlet customProvider: CaptureProvider | null = null;\n\nexport function setCaptureProvider(provider: CaptureProvider): void {\n customProvider = provider;\n}\n\nlet activeStream: MediaStream | null = null;\n\nasync function getStream(): Promise<MediaStream | null> {\n if (activeStream) {\n const tracks = activeStream.getVideoTracks();\n if (tracks.length > 0 && tracks[0].readyState === 'live') {\n return activeStream;\n }\n activeStream = null;\n }\n\n try {\n activeStream = await navigator.mediaDevices.getDisplayMedia({\n video: {\n preferCurrentTab: true,\n } as any,\n audio: false,\n });\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 await new Promise((r) => requestAnimationFrame(r));\n await new Promise((r) => requestAnimationFrame(r));\n\n const track = stream.getVideoTracks()[0];\n const settings = track.getSettings();\n const videoW = settings.width || video.videoWidth;\n const videoH = settings.height || 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] No screenshot method available. Use setCaptureProvider() for Electron apps.');\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 const textarea = document.createElement('textarea');\n textarea.value = result.text;\n textarea.style.position = 'fixed';\n textarea.style.opacity = '0';\n document.body.appendChild(textarea);\n textarea.select();\n document.execCommand('copy');\n document.body.removeChild(textarea);\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\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\n ssDrawing: false,\n ssStartX: 0,\n ssStartY: 0,\n\n lastMouseX: 0,\n lastMouseY: 0,\n\n dragging: false,\n dragPending: false,\n dragStartX: 0,\n dragStartY: 0,\n hasDragged: false,\n\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","import { SKIP_PREFIXES, isSourceFile } from './constants.js';\nimport type { ComponentInfo, ComponentFrame } from './types.js';\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 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 getReactComponentInfo(el: Element, customSkip?: Set<string>): ComponentInfo | null {\n const fiber = getReactFiber(el);\n if (!fiber) return null;\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 = cur._debugSource;\n const filePath = src?.fileName ?? null;\n if (name && isUsefulName(name, filePath, customSkip)) {\n return {\n name,\n filePath,\n line: src?.lineNumber ?? null,\n column: src?.columnNumber ?? null,\n };\n }\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 = cur._debugSource;\n const filePath = src?.fileName ?? null;\n if (name && isUsefulName(name, filePath, customSkip)) {\n return {\n name,\n filePath,\n line: src?.lineNumber ?? null,\n column: src?.columnNumber ?? null,\n };\n }\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 stack: ComponentFrame[] = [];\n const seen = new Set<string>();\n let cur = fiber;\n\n while (cur && stack.length < maxDepth) {\n let name: string | null = null;\n let src: any = null;\n\n if (cur.type && typeof cur.type === 'function') {\n name = cur.type.displayName || cur.type.name;\n src = cur._debugSource;\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 = cur._debugSource;\n }\n }\n\n let filePath = src?.fileName ?? null;\n if (name && isUsefulName(name, filePath, customSkip) && !seen.has(name)) {\n seen.add(name);\n const line = src?.lineNumber ?? null;\n if (filePath) {\n filePath = filePath\n .replace(/^(webpack-internal:\\/\\/\\/|\\/app\\/)/, '')\n .replace(/^\\.\\//, '');\n }\n stack.push({ name, filePath, line });\n }\n cur = cur.return;\n }\n return stack;\n}\n\nfunction getVueComponentInfo(el: Element): ComponentInfo | null {\n const vueInstance = (el 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 = (el 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 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","import { STYLE_PROPS, STYLE_DEFAULTS, KEEP_ATTRS } from './constants.js';\nimport { detectComponent, detectComponentStack } 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 = tagPart;\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\n let label = textPart ? `${textPart} ${elType}` : elType;\n\n if (meta.component?.filePath) {\n const parts = meta.component.filePath.split('/');\n const file = parts[parts.length - 1];\n label += ` in ${file}`;\n if (meta.component.line) label += `:${meta.component.line}`;\n } else if (meta.component?.name) {\n label += ` in <${meta.component.name}>`;\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\n if (meta.isLocal && meta.componentStack?.length) {\n for (const frame of meta.componentStack) {\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 }\n }\n\n parts.push(`Element: ${meta.html}`);\n\n if (meta.visibleText) parts.push(`Text: \"${meta.visibleText}\"`);\n\n const attrs = Object.entries(meta.attrs)\n .filter(([, v]) => v)\n .map(([k, v]) => `${k}=\"${v}\"`)\n .join(' ');\n if (attrs) parts.push(`Attributes: ${attrs}`);\n\n if (meta.styles) parts.push(`Styles: ${meta.styles}`);\n\n return parts.join('\\n');\n}\n","import { Z_OVERLAY, Z_TOOLBAR, OWN_IDS, FLASH_VISIBLE_MS, FLASH_REMOVE_MS } from '../core/constants.js';\nimport { extractElementMeta } 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 let displayName: string;\n\n if (isLocalhost() && meta.component) {\n displayName = meta.component.name;\n if (meta.component.filePath) {\n const parts = meta.component.filePath.split('/');\n displayName += ` · ${parts[parts.length - 1]}`;\n if (meta.component.line) displayName += `:${meta.component.line}`;\n }\n } else {\n displayName = meta.component ? `<${meta.component.name}>` : `<${meta.tag}>`;\n }\n\n s.label.textContent = displayName;\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.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 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 } 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 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\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\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\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\n const selBox = s.selectionBox;\n if (selBox) selBox.remove();\n s.selectionBox = null;\n if (s.miniMenu) s.miniMenu.style.display = 'none';\n if (s.cursorStyle) s.cursorStyle.disabled = true;\n\n await new Promise((r) => requestAnimationFrame(() => requestAnimationFrame(r)));\n\n if (w >= 10 && h >= 10) {\n const image = await captureRect({ x, y, width: w, height: h });\n\n if (s.miniMenu) s.miniMenu.style.display = '';\n if (s.cursorStyle) s.cursorStyle.disabled = false;\n createSelectionBox();\n\n if (image) {\n const result: GrabResult = {\n type: 'screenshot',\n label: `Region ${w}×${h}`,\n text: `Screenshot region: ${w}×${h} at (${Math.round(x)}, ${Math.round(y)})`,\n prompt: '',\n image,\n meta: { tag: 'region', visibleText: '', html: '', attrs: {}, isLocal: isLocalhost() },\n };\n await _dispatch(result);\n flash('Screenshot captured');\n }\n } else {\n if (s.miniMenu) s.miniMenu.style.display = '';\n if (s.cursorStyle) s.cursorStyle.disabled = false;\n createSelectionBox();\n }\n}\n\nexport function onSSKeyDown(e: KeyboardEvent): void {\n if (e.key === 'Escape') {\n if (s.ssDrawing) {\n s.ssDrawing = false;\n if (s.selectionBox) s.selectionBox.style.display = 'none';\n } else {\n _deactivate();\n _renderMiniMenu();\n }\n }\n}\n","import { releaseStream } from './screenshot.js';\nimport { sendToApp } from '../targets/app.js';\nimport { copyToClipboard } from '../targets/clipboard.js';\nimport type { RuneGrabConfig, GrabResult, TargetApp } from './types.js';\nimport { s, DEFAULTS } from './state.js';\nimport { createMiniMenu, renderMiniMenu, loadAutoPastePref, checkHelper, setMenuCallbacks } from '../ui/menu.js';\nimport { createGrabOverlay, removeGrabOverlay, createSelectionBox, removeSelectionBox } from '../ui/overlay.js';\nimport { onShortcut, setKeyboardCallbacks } from '../handlers/keyboard.js';\nimport { onRefMouseMove, onRefClick, onRefKeyDown, onRefScroll, setReferenceCallbacks } from '../handlers/inspect.js';\nimport { onSSMouseDown, onSSMouseMove, onSSMouseUp, onSSKeyDown, setScreenshotCallbacks } from '../handlers/capture.js';\n\nasync function dispatchResult(result: GrabResult): Promise<void> {\n s.config.onGrab(result);\n window.dispatchEvent(new CustomEvent('rune:grab', { detail: result }));\n\n if (s.config.target === 'clipboard') {\n await copyToClipboard(result);\n } else {\n await sendToApp(s.config.target, result);\n }\n}\n\nexport function activate(): void {\n if (s.active) return;\n if (!document.body || !document.head) return;\n s.active = true;\n\n document.documentElement.classList.add('__rune-grab-active__');\n\n if (s.grabType === 'screenshot') {\n createGrabOverlay();\n createSelectionBox();\n document.addEventListener('mousedown', onSSMouseDown, true);\n document.addEventListener('mousemove', onSSMouseMove, true);\n document.addEventListener('mouseup', onSSMouseUp, true);\n document.addEventListener('keydown', onSSKeyDown, true);\n } else {\n createGrabOverlay();\n document.addEventListener('mousemove', onRefMouseMove, true);\n document.addEventListener('click', onRefClick, true);\n document.addEventListener('keydown', onRefKeyDown, true);\n document.addEventListener('scroll', onRefScroll, true);\n }\n\n s.config.onToggle(true);\n}\n\nexport function deactivate(): void {\n if (!s.active) return;\n s.active = false;\n s.locked = false;\n s.promptMode = false;\n s.ssDrawing = false;\n s.selectedElement = null;\n\n if (s.mmRAF) { cancelAnimationFrame(s.mmRAF); s.mmRAF = 0; }\n\n document.removeEventListener('mousedown', onSSMouseDown, true);\n document.removeEventListener('mousemove', onSSMouseMove, true);\n document.removeEventListener('mouseup', onSSMouseUp, true);\n document.removeEventListener('keydown', onSSKeyDown, true);\n\n document.removeEventListener('mousemove', onRefMouseMove, true);\n document.removeEventListener('click', onRefClick, true);\n document.removeEventListener('keydown', onRefKeyDown, true);\n document.removeEventListener('scroll', onRefScroll, true);\n\n removeGrabOverlay();\n removeSelectionBox();\n document.documentElement.classList.remove('__rune-grab-active__');\n\n s.config.onToggle(false);\n}\n\nexport function toggle(): void {\n if (s.active) deactivate(); else activate();\n}\n\nexport function isActive(): boolean { return s.active; }\n\nexport function setTarget(target: TargetApp): void {\n s.config.target = target;\n if (s.menuExpanded) renderMiniMenu();\n}\n\nexport function getTarget(): TargetApp { return s.config.target; }\n\nexport function init(userConfig: RuneGrabConfig = {}): () => void {\n if (s.initialized) return () => { };\n\n s.config = { ...DEFAULTS, ...userConfig };\n s.initialized = true;\n\n if (userConfig.skipComponents?.length) {\n s.customSkipSet = new Set(userConfig.skipComponents);\n }\n\n setMenuCallbacks(activate, deactivate);\n setKeyboardCallbacks(toggle, renderMiniMenu);\n setReferenceCallbacks(dispatchResult, deactivate, renderMiniMenu);\n setScreenshotCallbacks(dispatchResult, deactivate, renderMiniMenu);\n\n const savedAutoPaste = loadAutoPastePref();\n if (savedAutoPaste) {\n s.autoPasteEnabled = true;\n checkHelper().then((ok) => {\n s.helperAvailable = ok;\n if (!ok) s.config.target = 'clipboard';\n if (s.menuExpanded) renderMiniMenu();\n });\n }\n\n const setup = () => {\n createMiniMenu();\n document.addEventListener('keydown', onShortcut, true);\n };\n\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', setup, { once: true });\n } else {\n setup();\n }\n\n return () => {\n deactivate();\n releaseStream();\n s.miniMenu?.remove();\n document.removeEventListener('keydown', onShortcut, true);\n s.initialized = false;\n s.hasDragged = false;\n };\n}\n","import { useEffect, useState, useCallback, useRef } from 'react';\nimport type { RuneGrabConfig, GrabResult, TargetApp } from '../core/types.js';\n\nexport type { RuneGrabConfig, GrabResult, TargetApp };\n\nexport interface UseRuneGrabReturn {\n active: boolean;\n toggle: () => void;\n activate: () => void;\n deactivate: () => void;\n setTarget: (target: TargetApp) => void;\n target: TargetApp;\n lastGrab: GrabResult | null;\n}\n\nexport function useRuneGrab(config: RuneGrabConfig = {}): UseRuneGrabReturn {\n const [active, setActive] = useState(false);\n const [target, setTargetState] = useState<TargetApp>(config.target ?? 'clipboard');\n const [lastGrab, setLastGrab] = useState<GrabResult | null>(null);\n const cleanupRef = useRef<(() => void) | null>(null);\n const engineRef = useRef<typeof import('../core/engine.js') | null>(null);\n\n useEffect(() => {\n let mounted = true;\n\n import('../core/engine.js').then((engine) => {\n if (!mounted) return;\n engineRef.current = engine;\n\n cleanupRef.current = engine.init({\n ...config,\n onGrab: (result) => {\n setLastGrab(result);\n config.onGrab?.(result);\n },\n onToggle: (isActive) => {\n setActive(isActive);\n config.onToggle?.(isActive);\n },\n });\n });\n\n return () => {\n mounted = false;\n cleanupRef.current?.();\n };\n }, []);\n\n const toggle = useCallback(() => {\n engineRef.current?.toggle();\n }, []);\n\n const activate = useCallback(() => {\n engineRef.current?.activate();\n }, []);\n\n const deactivate = useCallback(() => {\n engineRef.current?.deactivate();\n }, []);\n\n const setTarget = useCallback((t: TargetApp) => {\n setTargetState(t);\n engineRef.current?.setTarget(t);\n }, []);\n\n return { active, toggle, activate, deactivate, setTarget, target, lastGrab };\n}\n"],"mappings":"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","names":["HELPER_PORT","activate","deactivate","HELPER_PORT","isActive","toggle","renderMiniMenu","deactivate","renderMiniMenu","_deactivate","_renderMiniMenu","deactivate","renderMiniMenu","_dispatch","_deactivate","_renderMiniMenu","isActive","toggle","activate","deactivate","setTarget"]}