pixelagent 0.1.9 → 0.1.11

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.
@@ -1 +1 @@
1
- {"version":3,"file":"pixelagent.js","sources":["../src/annotate/ElementOverlay.tsx","../src/glass/displacementMap.ts","../src/glass/backdropSupport.ts","../src/glass/GlassSurface.tsx","../src/glass/GlassButton.tsx","../src/glass/GlassPanel.tsx","../src/hooks/useDraggable.ts","../src/edit/EditActionIcons.tsx","../src/edit/colorModel.ts","../src/edit/ColorPickerPopover.tsx","../src/edit/EditSection.tsx","../src/edit/fontFamilies.ts","../src/edit/FontFamilySelect.tsx","../src/edit/propertyControls.ts","../src/edit/PropertyField.tsx","../src/edit/SpacingField.tsx","../src/edit/SegmentedControl.tsx","../src/edit/TypographyIcons.tsx","../src/edit/styleUtils.ts","../src/edit/EditPropertiesPanel.tsx","../src/edit/useEditPreview.ts","../src/edit/EditPanel.tsx","../src/edit/submitApply.ts","../src/hooks/useElementRect.ts","../src/annotate/popoverPosition.ts","../src/annotate/AnnotationPopover.tsx","../src/annotate/AreaSelectOverlay.tsx","../src/annotate/buildAnnotationEntry.ts","../src/annotate/annotationAnchor.ts","../src/annotate/AnnotationBadgesOverlay.tsx","../src/annotate/pickElement.ts","../src/ui/CopyFeedbackSlot.tsx","../src/annotate/SessionPanel.tsx","../src/ui/icons.tsx","../src/ui/ToolbarSettingsMenu.tsx","../src/shadow/PixelAgentIcon.tsx","../src/shadow/Toolbar.tsx","../src/hooks/useAnnotationSession.ts","../src/ui/usePixelAgentUi.ts","../src/PixelAgent.tsx","../src/index.tsx"],"sourcesContent":["import { useEffect, useState } from 'react';\nimport { getElementDisplayLabel } from '@pixelagent/shared';\n\ninterface ElementOverlayProps {\n element: Element | null;\n selected: Element | null;\n multiSelected?: Element[];\n /** Which element was clicked (stronger ring when multiple are selected). */\n primarySelected?: Element | null;\n}\n\nexport function ElementOverlay({\n element,\n selected,\n multiSelected = [],\n primarySelected = null,\n}: ElementOverlayProps) {\n const [highlights, setHighlights] = useState<\n Array<{ rect: DOMRect; label: string; isSelected: boolean; isPrimary: boolean }>\n >([]);\n\n const primary = primarySelected ?? selected;\n\n useEffect(() => {\n const targets = new Map<Element, boolean>();\n const scopeMode = multiSelected.length > 0;\n\n if (element && !selected && !scopeMode) {\n targets.set(element, false);\n }\n if (selected) {\n targets.set(selected, true);\n }\n for (const el of multiSelected) {\n targets.set(el, true);\n }\n\n if (targets.size === 0) {\n setHighlights([]);\n return;\n }\n\n const update = () => {\n setHighlights(\n Array.from(targets.entries()).map(([el, isSelected]) => ({\n rect: el.getBoundingClientRect(),\n label: getElementDisplayLabel(el),\n isSelected,\n isPrimary: primary !== null && el === primary,\n }))\n );\n };\n\n update();\n\n const observers = Array.from(targets.keys()).map((el) => {\n const observer = new ResizeObserver(update);\n observer.observe(el);\n return observer;\n });\n\n window.addEventListener('scroll', update, true);\n window.addEventListener('resize', update);\n\n return () => {\n for (const observer of observers) observer.disconnect();\n window.removeEventListener('scroll', update, true);\n window.removeEventListener('resize', update);\n };\n }, [element, selected, multiSelected, primary]);\n\n if (highlights.length === 0) return null;\n\n const tooltipAnchor =\n highlights.find((h) => h.isPrimary) ?? highlights.find((h) => h.isSelected) ?? highlights[0];\n const selectedCount = highlights.filter((h) => h.isSelected).length;\n\n return (\n <>\n {highlights.map((item, index) => (\n <div\n key={`${item.label}-${index}`}\n className={[\n 'pa-highlight',\n item.isSelected ? 'pa-highlight-selected' : '',\n item.isPrimary ? 'pa-highlight-primary' : '',\n item.isSelected && !item.isPrimary && selectedCount > 1\n ? 'pa-highlight-scope'\n : '',\n ]\n .filter(Boolean)\n .join(' ')}\n style={{\n top: item.rect.top,\n left: item.rect.left,\n width: item.rect.width,\n height: item.rect.height,\n }}\n />\n ))}\n <div\n className=\"pa-tooltip\"\n style={{\n top: Math.max(0, tooltipAnchor.rect.top - 28),\n left: tooltipAnchor.rect.left,\n }}\n >\n {selectedCount > 1\n ? `${selectedCount} instances · ${tooltipAnchor.label}`\n : tooltipAnchor.label}\n </div>\n </>\n );\n}\n","/**\n * Generates a displacement map PNG (data URI) for the Liquid Glass refraction.\n *\n * Each pixel's R/G channels encode a 2D vector telling `feDisplacementMap` how\n * far to pull the underlying backdrop. The vector field comes from a rounded\n * rect SDF: ~0 in the center (no displacement), increasing toward the rim, so\n * content gets \"lens-compressed\" at the edges like a real glass element.\n *\n * Same math as shuding/liquid-glass — adapted for variable element sizes and\n * shapes (capsule vs. rect).\n */\n\nexport interface DisplacementMap {\n href: string;\n scale: number;\n width: number;\n height: number;\n}\n\n/** Rim pull strength — higher = more visible light refraction at edges. */\nexport const REFRACTION_GAIN_DEFAULT = 0.35;\nexport const REFRACTION_GAIN_ENHANCED = 0.48;\n\nexport function generateLiquidGlassMap(\n width: number,\n height: number,\n borderRadiusPx: number,\n refractionGain: number = REFRACTION_GAIN_DEFAULT\n): DisplacementMap | null {\n if (width < 8 || height < 8) return null;\n\n const dpi = 1;\n const w = Math.max(1, Math.round(width * dpi));\n const h = Math.max(1, Math.round(height * dpi));\n\n const canvas = document.createElement('canvas');\n canvas.width = w;\n canvas.height = h;\n const ctx = canvas.getContext('2d');\n if (!ctx) return null;\n\n const imageData = ctx.createImageData(w, h);\n const data = imageData.data;\n\n // Normalized corner radius (capped to half the shortest side)\n const r = Math.min(0.5, borderRadiusPx / Math.min(width, height));\n // Half-extents in normalized [-0.5, 0.5] space.\n // 0.3, 0.2 with radius 0.6 = same proportions as shuding's reference;\n // produces a strong \"pull toward center\" at the rim.\n const hx = 0.3;\n const hy = 0.2;\n const sdfRadius = Math.max(0.4, r + 0.1);\n\n let maxScale = 0;\n const raw = new Float32Array(w * h * 2);\n\n let ri = 0;\n for (let y = 0; y < h; y++) {\n for (let x = 0; x < w; x++) {\n const ux = x / w - 0.5;\n const uy = y / h - 0.5;\n const sdf = roundedRectSDF(ux, uy, hx, hy, sdfRadius);\n const d = smoothStep(0.8, 0, sdf - 0.15);\n const scaled = smoothStep(0, 1, d);\n const dx = (ux * scaled + 0.5) * w - x;\n const dy = (uy * scaled + 0.5) * h - y;\n if (Math.abs(dx) > maxScale) maxScale = Math.abs(dx);\n if (Math.abs(dy) > maxScale) maxScale = Math.abs(dy);\n raw[ri++] = dx;\n raw[ri++] = dy;\n }\n }\n\n if (maxScale === 0) return null;\n maxScale *= 0.4 * refractionGain;\n\n let pi = 0;\n for (let i = 0; i < data.length; i += 4) {\n const rEnc = raw[pi++] / maxScale + 0.5;\n const gEnc = raw[pi++] / maxScale + 0.5;\n data[i] = rEnc * 255;\n data[i + 1] = gEnc * 255;\n data[i + 2] = 0;\n data[i + 3] = 255;\n }\n\n ctx.putImageData(imageData, 0, 0);\n\n return {\n href: canvas.toDataURL('image/png'),\n scale: maxScale / dpi,\n width: w,\n height: h,\n };\n}\n\nfunction roundedRectSDF(\n x: number,\n y: number,\n hw: number,\n hh: number,\n r: number\n): number {\n const qx = Math.abs(x) - hw + r;\n const qy = Math.abs(y) - hh + r;\n return (\n Math.min(Math.max(qx, qy), 0) +\n Math.hypot(Math.max(qx, 0), Math.max(qy, 0)) -\n r\n );\n}\n\nfunction smoothStep(a: number, b: number, t: number): number {\n const x = Math.max(0, Math.min(1, (t - a) / (b - a)));\n return x * x * (3 - 2 * x);\n}\n","/**\n * Safari and Firefox do not apply SVG filters (especially feDisplacementMap) via\n * backdrop-filter: url(#id). The entire declaration is dropped — including blur().\n * Chromium (Cursor preview, Chrome) supports the full chain.\n *\n * @see https://bugs.webkit.org/show_bug.cgi?id=245510\n */\nexport function supportsBackdropSvgRefraction(): boolean {\n if (typeof navigator === 'undefined') return false;\n\n const ua = navigator.userAgent;\n\n // Safari (WebKit without Chromium engine)\n if (/AppleWebKit/i.test(ua) && !/Chrome|Chromium|Edg|OPR|CriOS|FxiOS/i.test(ua)) {\n return false;\n }\n\n // Firefox drops unsupported SVG primitives from the backdrop-filter chain\n if (/Firefox/i.test(ua)) return false;\n\n return true;\n}\n\nexport type GlassBackdropIntensity = 'default' | 'enhanced';\n\nconst FROST_BACKDROP: Record<GlassBackdropIntensity, string> = {\n default: 'blur(4px) saturate(130%)',\n /** Toolbar — slightly stronger frost + refraction chain. */\n enhanced: 'blur(6px) saturate(138%)',\n};\n\n/** Pixel literals — keep in sync with --pa-glass-blur / --pa-glass-saturate in tokens.css */\nexport const FROST_BACKDROP_DEFAULT = FROST_BACKDROP.default;\n\nexport function frostBackdropStyle(\n filterId: string | null,\n intensity: GlassBackdropIntensity = 'default'\n): {\n backdropFilter: string;\n WebkitBackdropFilter: string;\n} {\n const frost = FROST_BACKDROP[intensity];\n const useRefraction = filterId !== null && supportsBackdropSvgRefraction();\n const value = useRefraction ? `${frost} url(#${filterId})` : frost;\n return {\n backdropFilter: value,\n WebkitBackdropFilter: value,\n };\n}\n","import { useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport type { CSSProperties, ReactNode } from 'react';\nimport { generateLiquidGlassMap, type DisplacementMap } from './displacementMap';\nimport {\n frostBackdropStyle,\n supportsBackdropSvgRefraction,\n type GlassBackdropIntensity,\n} from './backdropSupport';\nimport { REFRACTION_GAIN_DEFAULT, REFRACTION_GAIN_ENHANCED } from './displacementMap';\n\nexport type GlassShape = 'capsule' | 'rect';\nexport type GlassTint = 'neutral' | 'accent';\n\ninterface GlassSurfaceProps {\n shape?: GlassShape;\n cornerRadius?: number;\n tint?: GlassTint;\n /** `enhanced` = stronger blur + rim refraction (toolbar). */\n intensity?: GlassBackdropIntensity;\n className?: string;\n style?: CSSProperties;\n children: ReactNode;\n}\n\nlet filterCounter = 0;\n\nexport function GlassSurface({\n shape = 'rect',\n cornerRadius,\n tint = 'neutral',\n intensity = 'default',\n className = '',\n style,\n children,\n}: GlassSurfaceProps) {\n const radius = cornerRadius ?? (shape === 'capsule' ? 9999 : 20);\n const refractionGain =\n intensity === 'enhanced' ? REFRACTION_GAIN_ENHANCED : REFRACTION_GAIN_DEFAULT;\n const surfaceRef = useRef<HTMLDivElement>(null);\n const filterId = useMemo(() => `pa-lg-${++filterCounter}`, []);\n const [map, setMap] = useState<DisplacementMap | null>(null);\n\n useLayoutEffect(() => {\n const el = surfaceRef.current;\n if (!el) return;\n\n let raf = 0;\n const update = () => {\n cancelAnimationFrame(raf);\n raf = requestAnimationFrame(() => {\n const rect = el.getBoundingClientRect();\n const w = Math.round(rect.width);\n const h = Math.round(rect.height);\n if (w < 8 || h < 8) return;\n const effectiveRadius =\n shape === 'capsule' ? h / 2 : Math.min(radius, w / 2, h / 2);\n const result = generateLiquidGlassMap(w, h, effectiveRadius, refractionGain);\n if (result) setMap(result);\n });\n };\n\n update();\n const observer = new ResizeObserver(update);\n observer.observe(el);\n return () => {\n cancelAnimationFrame(raf);\n observer.disconnect();\n };\n }, [shape, radius, refractionGain]);\n\n const filterPortal =\n map && supportsBackdropSvgRefraction() && typeof document !== 'undefined'\n ? createPortal(\n <svg\n aria-hidden\n width=\"0\"\n height=\"0\"\n style={{\n position: 'fixed',\n top: 0,\n left: 0,\n width: 0,\n height: 0,\n overflow: 'hidden',\n pointerEvents: 'none',\n }}\n >\n <defs>\n <filter\n id={filterId}\n filterUnits=\"userSpaceOnUse\"\n colorInterpolationFilters=\"sRGB\"\n x=\"0\"\n y=\"0\"\n width={map.width}\n height={map.height}\n >\n <feImage\n href={map.href}\n xlinkHref={map.href}\n width={map.width}\n height={map.height}\n preserveAspectRatio=\"none\"\n result=\"map\"\n />\n <feDisplacementMap\n in=\"SourceGraphic\"\n in2=\"map\"\n scale={map.scale}\n xChannelSelector=\"R\"\n yChannelSelector=\"G\"\n />\n </filter>\n </defs>\n </svg>,\n document.body\n )\n : null;\n\n return (\n <>\n {filterPortal}\n <div\n ref={surfaceRef}\n className={`pa-glass-surface pa-glass-surface--${shape} pa-glass-surface--${tint} ${className}`.trim()}\n style={{\n borderRadius: shape === 'capsule' ? '999px' : `${radius}px`,\n ...frostBackdropStyle(\n map && supportsBackdropSvgRefraction() ? filterId : null,\n intensity\n ),\n ...style,\n }}\n >\n <div className=\"pa-glass-surface-bg\" aria-hidden=\"true\" />\n <div className=\"pa-glass-surface-shine\" aria-hidden=\"true\" />\n <div className=\"pa-glass-surface-content\">{children}</div>\n </div>\n </>\n );\n}\n","import type { ButtonHTMLAttributes, ReactNode } from 'react';\n\nexport type GlassButtonVariant = 'regular' | 'ghost' | 'glass-primary' | 'icon';\n\ninterface GlassButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: GlassButtonVariant;\n children: ReactNode;\n}\n\nexport function GlassButton({\n variant = 'regular',\n className = '',\n children,\n ...props\n}: GlassButtonProps) {\n return (\n <button\n type=\"button\"\n className={`pa-glass-btn pa-glass-btn--${variant} ${className}`.trim()}\n {...props}\n >\n {children}\n </button>\n );\n}\n","import type { CSSProperties, ReactNode } from 'react';\nimport { GlassSurface } from './GlassSurface';\n\nexport type GlassPanelVariant = 'sheet' | 'popover';\nexport type GlassPanelSide = 'left' | 'right' | 'bottom';\n\ninterface GlassPanelProps {\n variant?: GlassPanelVariant;\n side?: GlassPanelSide;\n className?: string;\n style?: CSSProperties;\n children: ReactNode;\n}\n\nexport function GlassPanel({\n variant = 'sheet',\n side = 'left',\n className = '',\n style,\n children,\n}: GlassPanelProps) {\n const radius = variant === 'popover' ? 16 : 20;\n\n return (\n <GlassSurface\n shape=\"rect\"\n cornerRadius={radius}\n className={`pa-glass-panel pa-glass-panel--${variant} pa-glass-panel--${side} ${className}`.trim()}\n style={style}\n >\n {children}\n </GlassSurface>\n );\n}\n","import { useCallback, useEffect, useRef, useState, type CSSProperties } from 'react';\n\ninterface Position {\n x: number;\n y: number;\n}\n\ninterface UseDraggableOptions {\n /** Initial position; null = computed on first layout */\n defaultPosition?: Position | null;\n /** Custom default placement when position is not set */\n computeDefaultPosition?: (rect: DOMRect) => Position;\n}\n\nexport function useDraggable({\n defaultPosition = null,\n computeDefaultPosition,\n}: UseDraggableOptions = {}) {\n const [position, setPosition] = useState<Position | null>(defaultPosition);\n const [isDragging, setIsDragging] = useState(false);\n const dragRef = useRef<{\n pointerId: number;\n startX: number;\n startY: number;\n originX: number;\n originY: number;\n } | null>(null);\n const elementRef = useRef<HTMLDivElement>(null);\n\n const initDefaultPosition = useCallback(() => {\n if (position !== null) return;\n const el = elementRef.current;\n if (!el) return;\n\n const rect = el.getBoundingClientRect();\n setPosition(\n computeDefaultPosition\n ? computeDefaultPosition(rect)\n : {\n x: (window.innerWidth - rect.width) / 2,\n y: window.innerHeight - rect.height - 24,\n }\n );\n }, [position, computeDefaultPosition]);\n\n useEffect(() => {\n initDefaultPosition();\n }, [initDefaultPosition]);\n\n useEffect(() => {\n const onResize = () => {\n setPosition((prev) => {\n if (!prev || !elementRef.current) return prev;\n const rect = elementRef.current.getBoundingClientRect();\n return {\n x: Math.min(prev.x, window.innerWidth - rect.width),\n y: Math.min(prev.y, window.innerHeight - rect.height),\n };\n });\n };\n window.addEventListener('resize', onResize);\n return () => window.removeEventListener('resize', onResize);\n }, []);\n\n const onPointerDown = useCallback(\n (e: React.PointerEvent) => {\n if (e.button !== 0) return;\n\n const el = elementRef.current;\n if (!el) return;\n\n let origin = position;\n if (!origin) {\n const rect = el.getBoundingClientRect();\n origin = { x: rect.left, y: rect.top };\n setPosition(origin);\n }\n\n dragRef.current = {\n pointerId: e.pointerId,\n startX: e.clientX,\n startY: e.clientY,\n originX: origin.x,\n originY: origin.y,\n };\n setIsDragging(true);\n e.currentTarget.setPointerCapture(e.pointerId);\n e.preventDefault();\n },\n [position]\n );\n\n const onPointerMove = useCallback((e: React.PointerEvent) => {\n if (!dragRef.current || dragRef.current.pointerId !== e.pointerId) return;\n\n const el = elementRef.current;\n const width = el?.offsetWidth ?? 320;\n const height = el?.offsetHeight ?? 48;\n\n const dx = e.clientX - dragRef.current.startX;\n const dy = e.clientY - dragRef.current.startY;\n\n const x = Math.max(8, Math.min(window.innerWidth - width - 8, dragRef.current.originX + dx));\n const y = Math.max(8, Math.min(window.innerHeight - height - 8, dragRef.current.originY + dy));\n\n setPosition({ x, y });\n }, []);\n\n const onPointerUp = useCallback((e: React.PointerEvent) => {\n if (!dragRef.current || dragRef.current.pointerId !== e.pointerId) return;\n dragRef.current = null;\n setIsDragging(false);\n try {\n e.currentTarget.releasePointerCapture(e.pointerId);\n } catch {\n // already released\n }\n }, []);\n\n const style: CSSProperties | undefined =\n position !== null\n ? {\n position: 'fixed',\n left: position.x,\n top: position.y,\n transform: 'none',\n marginLeft: 0,\n bottom: 'auto',\n }\n : undefined;\n\n return {\n elementRef,\n position,\n isDragging,\n style,\n dragHandleProps: {\n onPointerDown,\n onPointerMove,\n onPointerUp,\n onPointerCancel: onPointerUp,\n },\n };\n}\n","interface IconProps {\n className?: string;\n}\n\nexport function IconUndo({ className }: IconProps) {\n return (\n <svg className={className} width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.35\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M3.25 8a4.75 4.75 0 0 1 8.1-2.35\"\n />\n <path\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.35\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M5.1 5.35 3.25 7.2 5.1 9.05\"\n />\n </svg>\n );\n}\n\nexport function IconReset({ className }: IconProps) {\n return (\n <svg className={className} width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.35\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M11.1 3.65a4.75 4.75 0 0 1 1.15 7.75M12.05 11.35v2.15h-2.15\"\n />\n <path\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.35\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M4.9 12.35a4.75 4.75 0 0 1-1.15-7.75M3.95 4.65V2.5h2.15\"\n />\n </svg>\n );\n}\n","export interface Rgb {\n r: number;\n g: number;\n b: number;\n}\n\nexport interface Hsv {\n h: number;\n s: number;\n v: number;\n}\n\nconst clamp = (n: number, min: number, max: number) => Math.min(max, Math.max(min, n));\n\nexport function parseCssColor(value: string): Rgb | null {\n const trimmed = value.trim();\n if (!trimmed) return null;\n\n const hex6 = trimmed.match(/^#([0-9a-f]{6})$/i);\n if (hex6) {\n return {\n r: parseInt(hex6[1].slice(0, 2), 16),\n g: parseInt(hex6[1].slice(2, 4), 16),\n b: parseInt(hex6[1].slice(4, 6), 16),\n };\n }\n\n const hex3 = trimmed.match(/^#([0-9a-f]{3})$/i);\n if (hex3) {\n const [r, g, b] = hex3[1].split('');\n return {\n r: parseInt(r + r, 16),\n g: parseInt(g + g, 16),\n b: parseInt(b + b, 16),\n };\n }\n\n const rgb = trimmed.match(/^rgba?\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)/i);\n if (rgb) {\n return {\n r: clamp(parseInt(rgb[1], 10), 0, 255),\n g: clamp(parseInt(rgb[2], 10), 0, 255),\n b: clamp(parseInt(rgb[3], 10), 0, 255),\n };\n }\n\n return null;\n}\n\nexport function rgbToHex(rgb: Rgb): string {\n const h = (n: number) => clamp(Math.round(n), 0, 255).toString(16).padStart(2, '0');\n return `#${h(rgb.r)}${h(rgb.g)}${h(rgb.b)}`;\n}\n\nexport function rgbToCss(rgb: Rgb): string {\n return `rgb(${rgb.r}, ${rgb.g}, ${rgb.b})`;\n}\n\nexport function rgbToHsv({ r, g, b }: Rgb): Hsv {\n const rn = r / 255;\n const gn = g / 255;\n const bn = b / 255;\n const max = Math.max(rn, gn, bn);\n const min = Math.min(rn, gn, bn);\n const d = max - min;\n\n let h = 0;\n if (d !== 0) {\n if (max === rn) h = ((gn - bn) / d) % 6;\n else if (max === gn) h = (bn - rn) / d + 2;\n else h = (rn - gn) / d + 4;\n h *= 60;\n if (h < 0) h += 360;\n }\n\n const s = max === 0 ? 0 : (d / max) * 100;\n const v = max * 100;\n\n return { h, s, v };\n}\n\nexport function hsvToRgb({ h, s, v }: Hsv): Rgb {\n const sn = clamp(s, 0, 100) / 100;\n const vn = clamp(v, 0, 100) / 100;\n const c = vn * sn;\n const x = c * (1 - Math.abs(((h / 60) % 2) - 1));\n const m = vn - c;\n\n let rp = 0;\n let gp = 0;\n let bp = 0;\n const hue = ((h % 360) + 360) % 360;\n\n if (hue < 60) {\n rp = c;\n gp = x;\n } else if (hue < 120) {\n rp = x;\n gp = c;\n } else if (hue < 180) {\n gp = c;\n bp = x;\n } else if (hue < 240) {\n gp = x;\n bp = c;\n } else if (hue < 300) {\n rp = x;\n bp = c;\n } else {\n rp = c;\n bp = x;\n }\n\n return {\n r: Math.round((rp + m) * 255),\n g: Math.round((gp + m) * 255),\n b: Math.round((bp + m) * 255),\n };\n}\n\nexport function hsvFromCss(value: string): Hsv {\n const rgb = parseCssColor(value);\n return rgb ? rgbToHsv(rgb) : { h: 0, s: 0, v: 45 };\n}\n\n/** @deprecated use parseCssColor + rgbToHex */\nexport function colorToHexInput(value: string): string | null {\n const rgb = parseCssColor(value);\n return rgb ? rgbToHex(rgb) : null;\n}\n\nexport function formatHexInput(value: string): string {\n return value.replace(/^#/, '').toUpperCase().slice(0, 6);\n}\n\nexport function parseHexInput(raw: string, fallback: Rgb): Rgb {\n const cleaned = raw.replace(/[^0-9a-f]/gi, '').slice(0, 6);\n if (cleaned.length < 6) return fallback;\n return (\n parseCssColor(`#${cleaned}`) ?? fallback\n );\n}\n","import { useCallback, useEffect, useId, useRef, useState, type MouseEvent as ReactMouseEvent } from 'react';\nimport { createPortal } from 'react-dom';\nimport type { Hsv, Rgb } from './colorModel.js';\nimport {\n formatHexInput,\n hsvFromCss,\n hsvToRgb,\n parseCssColor,\n parseHexInput,\n rgbToCss,\n rgbToHex,\n rgbToHsv,\n} from './colorModel.js';\n\ninterface ColorPickerPopoverProps {\n label: string;\n value: string;\n onChange: (value: string) => void;\n}\n\nfunction cssFromHsv(hsv: Hsv): string {\n return rgbToHex(hsvToRgb(hsv));\n}\n\nfunction pointerPercent(clientX: number, clientY: number, rect: DOMRect) {\n const x = clamp01((clientX - rect.left) / rect.width);\n const y = clamp01((clientY - rect.top) / rect.height);\n return { x: x * 100, y: y * 100 };\n}\n\nfunction clamp01(n: number) {\n return Math.min(1, Math.max(0, n));\n}\n\nfunction getPickerPortalRootAttributes(): Record<string, string> {\n if (typeof document === 'undefined') return {};\n const root =\n document.querySelector('[data-pixelagent-root]') ??\n document.querySelector('[data-pixelagent-toolbar-portal]');\n const chrome = root?.getAttribute('data-pa-chrome');\n return chrome ? { 'data-pa-chrome': chrome } : {};\n}\n\nexport function ColorPickerPopover({ label, value, onChange }: ColorPickerPopoverProps) {\n const [open, setOpen] = useState(false);\n const [hsv, setHsv] = useState<Hsv>(() => hsvFromCss(value));\n const triggerRef = useRef<HTMLButtonElement>(null);\n const popoverRef = useRef<HTMLDivElement>(null);\n const sbRef = useRef<HTMLDivElement>(null);\n const listboxId = useId();\n const [pos, setPos] = useState({ top: 0, left: 0, width: 260 });\n\n const rgb = hsvToRgb(hsv);\n const hex = formatHexInput(rgbToHex(rgb));\n const preview = parseCssColor(value) ? value : rgbToCss(rgb);\n const headerLabel = label.toLowerCase().includes('color') ? label : `${label} color`;\n\n useEffect(() => {\n setHsv(hsvFromCss(value));\n }, [value]);\n\n const updateHsv = useCallback(\n (next: Hsv) => {\n setHsv(next);\n onChange(cssFromHsv(next));\n },\n [onChange]\n );\n\n const updateRgb = useCallback(\n (next: Rgb) => {\n updateHsv(rgbToHsv(next));\n },\n [updateHsv]\n );\n\n const reposition = useCallback(() => {\n const el = triggerRef.current;\n if (!el) return;\n const rect = el.getBoundingClientRect();\n const width = 260;\n let left = rect.left;\n if (left + width > window.innerWidth - 12) {\n left = window.innerWidth - width - 12;\n }\n left = Math.max(12, left);\n\n let top = rect.bottom + 8;\n const estimatedHeight = 320;\n if (top + estimatedHeight > window.innerHeight - 12) {\n top = Math.max(12, rect.top - estimatedHeight - 8);\n }\n\n setPos({ top, left, width });\n }, []);\n\n useEffect(() => {\n if (!open) return;\n reposition();\n\n const onDocPointer = (e: MouseEvent) => {\n const t = e.target;\n if (\n triggerRef.current?.contains(t as Node) ||\n popoverRef.current?.contains(t as Node)\n ) {\n return;\n }\n setOpen(false);\n };\n\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') setOpen(false);\n };\n\n window.addEventListener('mousedown', onDocPointer, true);\n window.addEventListener('keydown', onKey);\n window.addEventListener('resize', reposition);\n window.addEventListener('scroll', reposition, true);\n\n return () => {\n window.removeEventListener('mousedown', onDocPointer, true);\n window.removeEventListener('keydown', onKey);\n window.removeEventListener('resize', reposition);\n window.removeEventListener('scroll', reposition, true);\n };\n }, [open, reposition]);\n\n const handleSbPointer = (clientX: number, clientY: number) => {\n const rect = sbRef.current?.getBoundingClientRect();\n if (!rect) return;\n const { x, y } = pointerPercent(clientX, clientY, rect);\n updateHsv({ ...hsv, s: x, v: 100 - y });\n };\n\n const startSbDrag = (e: ReactMouseEvent<HTMLDivElement>) => {\n e.preventDefault();\n handleSbPointer(e.clientX, e.clientY);\n\n const onMove = (ev: MouseEvent) => handleSbPointer(ev.clientX, ev.clientY);\n const onUp = () => {\n window.removeEventListener('mousemove', onMove);\n window.removeEventListener('mouseup', onUp);\n };\n window.addEventListener('mousemove', onMove);\n window.addEventListener('mouseup', onUp);\n };\n\n const popover = open\n ? createPortal(\n <div\n className=\"pa-root pa-root--toolbar-portal pa-color-picker-portal\"\n data-pixelagent-picker-portal\n {...getPickerPortalRootAttributes()}\n >\n <div\n ref={popoverRef}\n id={listboxId}\n role=\"dialog\"\n aria-label={headerLabel}\n className=\"pa-color-picker\"\n style={{ top: pos.top, left: pos.left, width: pos.width }}\n >\n <header className=\"pa-color-picker-header\">\n <span\n className=\"pa-color-picker-preview\"\n style={{ backgroundColor: preview }}\n aria-hidden=\"true\"\n />\n <span className=\"pa-color-picker-header-label\">{headerLabel}</span>\n </header>\n\n <div\n ref={sbRef}\n className=\"pa-color-picker-sb\"\n style={{ ['--pa-picker-h' as string]: String(Math.round(hsv.h)) }}\n onMouseDown={startSbDrag}\n >\n <span\n className=\"pa-color-picker-sb-thumb\"\n style={{ left: `${hsv.s}%`, top: `${100 - hsv.v}%` }}\n aria-hidden=\"true\"\n />\n </div>\n\n <div className=\"pa-color-picker-hue\">\n <input\n type=\"range\"\n className=\"pa-color-picker-hue-input\"\n min={0}\n max={360}\n value={Math.round(hsv.h)}\n aria-label=\"Hue\"\n onChange={(e) => updateHsv({ ...hsv, h: parseFloat(e.target.value) })}\n />\n <span\n className=\"pa-color-picker-hue-thumb\"\n style={{ left: `${(hsv.h / 360) * 100}%` }}\n aria-hidden=\"true\"\n />\n </div>\n\n <label className=\"pa-color-picker-field\">\n <span className=\"pa-color-picker-field-label\">Hex</span>\n <input\n className=\"pa-input pa-color-picker-input\"\n type=\"text\"\n value={hex}\n spellCheck={false}\n onChange={(e) => updateRgb(parseHexInput(e.target.value, rgb))}\n />\n </label>\n\n <div className=\"pa-color-picker-rgb\">\n {(['r', 'g', 'b'] as const).map((channel) => (\n <label key={channel} className=\"pa-color-picker-field pa-color-picker-field--rgb\">\n <span className=\"pa-color-picker-field-label\">{channel.toUpperCase()}</span>\n <input\n className=\"pa-input pa-color-picker-input\"\n type=\"number\"\n min={0}\n max={255}\n value={rgb[channel]}\n onChange={(e) => {\n const n = clamp01Channel(parseInt(e.target.value, 10));\n updateRgb({ ...rgb, [channel]: n });\n }}\n />\n </label>\n ))}\n </div>\n </div>\n </div>,\n document.body\n )\n : null;\n\n return (\n <div className=\"pa-color-field\">\n <span className=\"pa-edit-field-label\">{label}</span>\n <button\n ref={triggerRef}\n type=\"button\"\n className=\"pa-color-field-trigger\"\n aria-expanded={open}\n aria-haspopup=\"dialog\"\n aria-controls={open ? listboxId : undefined}\n onClick={() => {\n if (!open) reposition();\n setOpen((v) => !v);\n }}\n >\n <span className=\"pa-color-field-swatch\" style={{ backgroundColor: preview }} aria-hidden=\"true\" />\n <input\n className=\"pa-input pa-color-field-hex\"\n type=\"text\"\n value={value}\n readOnly\n tabIndex={-1}\n aria-hidden=\"true\"\n />\n </button>\n {popover}\n </div>\n );\n}\n\nfunction clamp01Channel(n: number) {\n if (!Number.isFinite(n)) return 0;\n return Math.min(255, Math.max(0, n));\n}\n","import { useState, type ReactNode } from 'react';\n\ninterface EditSectionProps {\n title: string;\n children: ReactNode;\n defaultOpen?: boolean;\n badge?: string;\n}\n\nexport function EditSection({ title, children, defaultOpen = true, badge }: EditSectionProps) {\n const [open, setOpen] = useState(defaultOpen);\n\n return (\n <section className={`pa-edit-section ${open ? 'pa-edit-section--open' : ''}`}>\n <button\n type=\"button\"\n className=\"pa-edit-section-header\"\n aria-expanded={open}\n onClick={() => setOpen((v) => !v)}\n >\n <span className=\"pa-edit-section-title\">{title}</span>\n {badge ? <span className=\"pa-edit-section-badge\">{badge}</span> : null}\n <span className=\"pa-edit-section-chevron\" aria-hidden=\"true\" />\n </button>\n {open ? <div className=\"pa-edit-section-body\">{children}</div> : null}\n </section>\n );\n}\n","export interface FontFamilyOption {\n value: string;\n label: string;\n}\n\n/** Preset stacks for the font family dropdown (Figma-style). */\nexport const FONT_FAMILY_PRESETS: FontFamilyOption[] = [\n { value: 'Inter, system-ui, sans-serif', label: 'Inter' },\n { value: 'system-ui, sans-serif', label: 'System UI' },\n {\n value: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n label: 'System',\n },\n { value: 'Georgia, \"Times New Roman\", Times, serif', label: 'Georgia' },\n { value: '\"Times New Roman\", Times, serif', label: 'Times New Roman' },\n { value: 'Arial, Helvetica, sans-serif', label: 'Arial' },\n { value: 'Helvetica, Arial, sans-serif', label: 'Helvetica' },\n { value: '\"JetBrains Mono\", ui-monospace, monospace', label: 'JetBrains Mono' },\n { value: 'ui-monospace, monospace', label: 'Monospace' },\n];\n\nconst PLACEHOLDER_VALUE = '';\n\nexport function primaryFontName(fontFamily: string): string {\n const first = fontFamily.split(',')[0]?.trim() ?? '';\n return first.replace(/^[\"']|[\"']$/g, '');\n}\n\n/** Match computed font-family to a preset value, or return custom stack. */\nexport function resolveFontFamilySelectValue(fontFamily: string): {\n selectValue: string;\n options: FontFamilyOption[];\n} {\n const trimmed = fontFamily.trim();\n if (!trimmed) {\n return {\n selectValue: PLACEHOLDER_VALUE,\n options: FONT_FAMILY_PRESETS,\n };\n }\n\n const primary = primaryFontName(trimmed).toLowerCase();\n\n const exact = FONT_FAMILY_PRESETS.find(\n (p) => p.value === trimmed || primaryFontName(p.value).toLowerCase() === primary\n );\n if (exact) {\n return { selectValue: exact.value, options: FONT_FAMILY_PRESETS };\n }\n\n const partial = FONT_FAMILY_PRESETS.find((p) => {\n const presetPrimary = primaryFontName(p.value).toLowerCase();\n return (\n trimmed.toLowerCase().includes(presetPrimary) ||\n presetPrimary.includes(primary)\n );\n });\n if (partial) {\n return { selectValue: partial.value, options: FONT_FAMILY_PRESETS };\n }\n\n return {\n selectValue: trimmed,\n options: [\n ...FONT_FAMILY_PRESETS,\n { value: trimmed, label: primaryFontName(trimmed) || 'Custom' },\n ],\n };\n}\n\nexport { PLACEHOLDER_VALUE as FONT_FAMILY_PLACEHOLDER };\n","import { useMemo } from 'react';\nimport { FONT_FAMILY_PLACEHOLDER, resolveFontFamilySelectValue } from './fontFamilies.js';\n\ninterface FontFamilySelectProps {\n value: string;\n onChange: (value: string) => void;\n}\n\nexport function FontFamilySelect({ value, onChange }: FontFamilySelectProps) {\n const { selectValue, options } = useMemo(\n () => resolveFontFamilySelectValue(value),\n [value]\n );\n\n return (\n <label className=\"pa-edit-stack-field\">\n <span className=\"pa-edit-field-label\">Font family</span>\n <select\n className=\"pa-select pa-font-family-select\"\n value={selectValue || FONT_FAMILY_PLACEHOLDER}\n onChange={(e) => {\n const next = e.target.value;\n if (next && next !== FONT_FAMILY_PLACEHOLDER) onChange(next);\n }}\n >\n <option value={FONT_FAMILY_PLACEHOLDER} disabled>\n Select font style\n </option>\n {options.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n </label>\n );\n}\n","/** Parse a single px length from computed CSS (e.g. \"72px\"). */\nexport function parsePx(value: string): number | null {\n const match = value.trim().match(/^(-?\\d+(?:\\.\\d+)?)px$/i);\n return match ? parseFloat(match[1]) : null;\n}\n\n/** Parse opacity from \"0.85\" or \"85%\". */\nexport function parseOpacity(value: string): number | null {\n const trimmed = value.trim();\n if (!trimmed) return null;\n if (trimmed.endsWith('%')) {\n const n = parseFloat(trimmed);\n return Number.isFinite(n) ? n / 100 : null;\n }\n const n = parseFloat(trimmed);\n return Number.isFinite(n) && n >= 0 && n <= 1 ? n : null;\n}\n\n/** True when a border-width value represents a visible stroke (uniform or single px). */\nexport function hasPositiveBorderWidth(value: string): boolean {\n const uniform = parseUniformPx(value);\n if (uniform !== null) return uniform > 0;\n const single = parsePx(value);\n return single !== null && single > 0;\n}\n\n/** True when all sides share the same px length (slider-safe). */\nexport function parseUniformPx(value: string): number | null {\n const parts = value.trim().split(/\\s+/).filter(Boolean);\n if (parts.length === 0) return null;\n\n const parsed = parts.map((p) => parsePx(p));\n if (parsed.some((n) => n === null)) return null;\n const first = parsed[0]!;\n if (parsed.every((n) => n === first)) return first;\n return null;\n}\n\nexport type PropControlKind = 'text' | 'opacity' | 'px' | 'uniform-px';\n\nexport interface PropControlConfig {\n kind: PropControlKind;\n min?: number;\n max?: number;\n step?: number;\n}\n\nexport const PROP_CONTROLS: Record<string, PropControlConfig> = {\n padding: { kind: 'uniform-px', min: 0, max: 80, step: 1 },\n margin: { kind: 'uniform-px', min: 0, max: 80, step: 1 },\n width: { kind: 'text' },\n height: { kind: 'text' },\n 'background-color': { kind: 'text' },\n color: { kind: 'text' },\n 'font-size': { kind: 'px', min: 8, max: 128, step: 1 },\n 'line-height': { kind: 'text' },\n gap: { kind: 'uniform-px', min: 0, max: 80, step: 1 },\n 'border-width': { kind: 'uniform-px', min: 0, max: 24, step: 1 },\n 'border-radius': { kind: 'px', min: 0, max: 48, step: 1 },\n opacity: { kind: 'opacity', min: 0, max: 1, step: 0.01 },\n};\n\nexport function sliderValueForProperty(\n _property: string,\n cssValue: string,\n config: PropControlConfig\n): number | null {\n switch (config.kind) {\n case 'opacity':\n return parseOpacity(cssValue);\n case 'px':\n return parsePx(cssValue);\n case 'uniform-px':\n return parseUniformPx(cssValue);\n default:\n return null;\n }\n}\n\nexport function formatSliderValue(_property: string, num: number, config: PropControlConfig): string {\n switch (config.kind) {\n case 'opacity':\n return String(Math.round(num * 100) / 100);\n case 'px':\n case 'uniform-px':\n return `${Math.round(num)}px`;\n default:\n return String(num);\n }\n}\n","import {\n formatSliderValue,\n PROP_CONTROLS,\n sliderValueForProperty,\n} from './propertyControls';\n\ninterface PropertyFieldProps {\n property: string;\n label: string;\n value: string;\n onChange: (value: string) => void;\n /** Inside a named section — smaller label, no extra uppercase row chrome. */\n compact?: boolean;\n}\n\nexport function PropertyField({\n property,\n label,\n value,\n onChange,\n compact = false,\n}: PropertyFieldProps) {\n const config = PROP_CONTROLS[property] ?? { kind: 'text' as const };\n const numeric = sliderValueForProperty(property, value, config);\n const useSlider = config.kind !== 'text' && numeric !== null;\n\n const rowClass = compact ? 'pa-prop-row pa-prop-row--compact' : 'pa-prop-row';\n const labelClass = compact ? 'pa-edit-field-label' : 'pa-prop-label';\n\n if (!useSlider) {\n return (\n <label className={rowClass}>\n <span className={labelClass}>{label}</span>\n <input\n className=\"pa-input\"\n type=\"text\"\n value={value}\n onChange={(e) => onChange(e.target.value)}\n />\n </label>\n );\n }\n\n const min = config.min ?? 0;\n const max = config.max ?? 100;\n const step = config.step ?? 1;\n\n const handleSlider = (next: number) => {\n onChange(formatSliderValue(property, next, config));\n };\n\n return (\n <label className={`${rowClass} pa-prop-row--slider`}>\n <span className={labelClass}>{label}</span>\n <div className=\"pa-prop-slider-wrap\">\n <input\n type=\"range\"\n className=\"pa-slider\"\n min={min}\n max={max}\n step={step}\n value={numeric}\n aria-valuetext={value}\n onChange={(e) => handleSlider(parseFloat(e.target.value))}\n />\n <input\n className=\"pa-input pa-prop-slider-value\"\n type=\"text\"\n value={value}\n onChange={(e) => onChange(e.target.value)}\n aria-label={`${label} value`}\n />\n </div>\n </label>\n );\n}\n","import { useEffect, useState } from 'react';\nimport type { ReactNode } from 'react';\n\ninterface SpacingFieldProps {\n property: 'margin' | 'padding';\n label: string;\n value: string;\n onChange: (value: string) => void;\n}\n\ninterface Sides {\n top: string;\n right: string;\n bottom: string;\n left: string;\n}\n\nfunction parseShorthand(value: string): Sides {\n const parts = value.trim().split(/\\s+/).filter(Boolean);\n const a = parts[0] ?? '0px';\n if (parts.length <= 1) return { top: a, right: a, bottom: a, left: a };\n const b = parts[1];\n if (parts.length === 2) return { top: a, right: b, bottom: a, left: b };\n const c = parts[2];\n if (parts.length === 3) return { top: a, right: b, bottom: c, left: b };\n return { top: a, right: b, bottom: c, left: parts[3] };\n}\n\nfunction formatShorthand({ top, right, bottom, left }: Sides): string {\n if (top === right && right === bottom && bottom === left) return top;\n if (top === bottom && right === left) return `${top} ${right}`;\n if (right === left) return `${top} ${right} ${bottom}`;\n return `${top} ${right} ${bottom} ${left}`;\n}\n\n/** Strip \"px\" suffix from a numeric px value for display in compact inputs. */\nfunction displayNum(value: string): string {\n const m = value.trim().match(/^(-?\\d+(?:\\.\\d+)?)px$/i);\n return m ? m[1] : value;\n}\n\n/** Re-suffix when user types a bare number. Leave other values (auto, 0, %, calc()) untouched. */\nfunction normalizeWrite(raw: string): string {\n const trimmed = raw.trim();\n if (trimmed === '') return '0px';\n if (/^-?\\d+(?:\\.\\d+)?$/.test(trimmed)) return `${trimmed}px`;\n return trimmed;\n}\n\n/** Pair display: single value if equal, comma-joined when mixed. */\nfunction formatPairDisplay(a: string, b: string): string {\n if (a === b) return displayNum(a);\n return `${displayNum(a)}, ${displayNum(b)}`;\n}\n\n/**\n * Parse a pair-cell commit. Accepts either:\n * - single value → both sides get it\n * - \"a, b\" (comma-separated) → first→primary, second→secondary\n * Returns [primary, secondary] as normalized CSS values.\n */\nfunction parsePairCommit(raw: string, fallback: string): [string, string] {\n const parts = raw\n .split(',')\n .map((p) => p.trim())\n .filter(Boolean);\n if (parts.length === 0) return [fallback, fallback];\n if (parts.length === 1) {\n const v = normalizeWrite(parts[0]);\n return [v, v];\n }\n return [normalizeWrite(parts[0]), normalizeWrite(parts[1])];\n}\n\n// ── Icons ─────────────────────────────────────────────────────────────────\n\nconst ICON_SIZE = 12;\nconst ICON_PROPS = {\n width: ICON_SIZE,\n height: ICON_SIZE,\n viewBox: '0 0 12 12',\n fill: 'none',\n 'aria-hidden': true,\n} as const;\n\nfunction IconHorizontalPair() {\n return (\n <svg {...ICON_PROPS}>\n <rect x=\"1.5\" y=\"1.5\" width=\"9\" height=\"9\" stroke=\"currentColor\" strokeOpacity=\"0.35\" />\n <line x1=\"1.5\" y1=\"1.5\" x2=\"1.5\" y2=\"10.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <line x1=\"10.5\" y1=\"1.5\" x2=\"10.5\" y2=\"10.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n </svg>\n );\n}\n\nfunction IconVerticalPair() {\n return (\n <svg {...ICON_PROPS}>\n <rect x=\"1.5\" y=\"1.5\" width=\"9\" height=\"9\" stroke=\"currentColor\" strokeOpacity=\"0.35\" />\n <line x1=\"1.5\" y1=\"1.5\" x2=\"10.5\" y2=\"1.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <line x1=\"1.5\" y1=\"10.5\" x2=\"10.5\" y2=\"10.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n </svg>\n );\n}\n\nfunction IconSide({ side }: { side: keyof Sides }) {\n const edges = {\n top: { x1: 1.5, y1: 1.5, x2: 10.5, y2: 1.5 },\n right: { x1: 10.5, y1: 1.5, x2: 10.5, y2: 10.5 },\n bottom: { x1: 1.5, y1: 10.5, x2: 10.5, y2: 10.5 },\n left: { x1: 1.5, y1: 1.5, x2: 1.5, y2: 10.5 },\n }[side];\n return (\n <svg {...ICON_PROPS}>\n <rect x=\"1.5\" y=\"1.5\" width=\"9\" height=\"9\" stroke=\"currentColor\" strokeOpacity=\"0.35\" />\n <line {...edges} stroke=\"currentColor\" strokeWidth=\"1.5\" />\n </svg>\n );\n}\n\nfunction IconExpand() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <rect x=\"2\" y=\"2\" width=\"4\" height=\"4\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n <rect x=\"8\" y=\"2\" width=\"4\" height=\"4\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n <rect x=\"2\" y=\"8\" width=\"4\" height=\"4\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n <rect x=\"8\" y=\"8\" width=\"4\" height=\"4\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n </svg>\n );\n}\n\n// ── Cell ──────────────────────────────────────────────────────────────────\n\ninterface CellProps {\n icon: ReactNode;\n /** Pre-formatted display string (already px-stripped, optionally comma-joined). */\n display: string;\n ariaLabel: string;\n mixed?: boolean;\n /** Called on blur/Enter with the raw draft string. Caller normalizes. */\n onCommit: (raw: string) => void;\n}\n\nfunction Cell({ icon, display, ariaLabel, mixed, onCommit }: CellProps) {\n const [draft, setDraft] = useState(display);\n\n // Sync external value into draft (no focus tracking yet — accept the flicker\n // for now; rare to type and have the same field externally mutate).\n useEffect(() => {\n setDraft(display);\n }, [display]);\n\n return (\n <label className={`pa-spacing-cell ${mixed ? 'pa-spacing-cell--mixed' : ''}`}>\n <span className=\"pa-spacing-cell-icon\">{icon}</span>\n <input\n className=\"pa-input pa-spacing-cell-input\"\n type=\"text\"\n value={draft}\n onChange={(e) => setDraft(e.target.value)}\n onBlur={() => onCommit(draft)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') (e.target as HTMLInputElement).blur();\n if (e.key === 'Escape') {\n setDraft(display);\n (e.target as HTMLInputElement).blur();\n }\n }}\n aria-label={ariaLabel}\n spellCheck={false}\n />\n </label>\n );\n}\n\n// ── Field ─────────────────────────────────────────────────────────────────\n\nexport function SpacingField({ label, value, onChange }: SpacingFieldProps) {\n const sides = parseShorthand(value);\n // Pure user intent — pair view can show mixed values via comma notation,\n // so we never force-split based on data anymore.\n const [showSplit, setShowSplit] = useState(false);\n\n const writeSides = (next: Partial<Sides>) => {\n onChange(formatShorthand({ ...sides, ...next }));\n };\n\n const horizontalMixed = sides.left !== sides.right;\n const verticalMixed = sides.top !== sides.bottom;\n\n return (\n <div className=\"pa-prop-row pa-prop-row--compact pa-spacing-row\">\n <span className=\"pa-edit-field-label\">{label}</span>\n <div\n className={`pa-spacing-control ${\n showSplit ? 'pa-spacing-control--split' : 'pa-spacing-control--pair'\n }`}\n >\n {showSplit ? (\n // Grid mirrors pair-view columns:\n // Col 1 (horizontal pair) → L on top, R on bottom\n // Col 2 (vertical pair) → T on top, B on bottom\n <div className=\"pa-spacing-grid\">\n <Cell\n icon={<IconSide side=\"left\" />}\n display={displayNum(sides.left)}\n ariaLabel={`${label} left`}\n onCommit={(raw) => writeSides({ left: normalizeWrite(raw) })}\n />\n <Cell\n icon={<IconSide side=\"top\" />}\n display={displayNum(sides.top)}\n ariaLabel={`${label} top`}\n onCommit={(raw) => writeSides({ top: normalizeWrite(raw) })}\n />\n <Cell\n icon={<IconSide side=\"right\" />}\n display={displayNum(sides.right)}\n ariaLabel={`${label} right`}\n onCommit={(raw) => writeSides({ right: normalizeWrite(raw) })}\n />\n <Cell\n icon={<IconSide side=\"bottom\" />}\n display={displayNum(sides.bottom)}\n ariaLabel={`${label} bottom`}\n onCommit={(raw) => writeSides({ bottom: normalizeWrite(raw) })}\n />\n </div>\n ) : (\n <div className=\"pa-spacing-pair\">\n <Cell\n icon={<IconHorizontalPair />}\n display={formatPairDisplay(sides.left, sides.right)}\n mixed={horizontalMixed}\n ariaLabel={`${label} horizontal`}\n onCommit={(raw) => {\n const [left, right] = parsePairCommit(raw, sides.left);\n writeSides({ left, right });\n }}\n />\n <Cell\n icon={<IconVerticalPair />}\n display={formatPairDisplay(sides.top, sides.bottom)}\n mixed={verticalMixed}\n ariaLabel={`${label} vertical`}\n onCommit={(raw) => {\n const [top, bottom] = parsePairCommit(raw, sides.top);\n writeSides({ top, bottom });\n }}\n />\n </div>\n )}\n <button\n type=\"button\"\n className={`pa-spacing-toggle ${showSplit ? 'pa-spacing-toggle--on' : ''}`}\n onClick={() => setShowSplit((s) => !s)}\n aria-pressed={showSplit}\n aria-label={showSplit ? 'Collapse to pair view' : 'Expand to per-side view'}\n title={showSplit ? 'Collapse to pair view' : 'Expand to per-side view'}\n >\n <IconExpand />\n </button>\n </div>\n </div>\n );\n}\n","import type { ReactNode } from 'react';\n\nexport interface SegmentOption<T extends string> {\n value: T;\n title: string;\n content: ReactNode;\n}\n\ninterface SegmentedControlProps<T extends string> {\n options: SegmentOption<T>[];\n value?: T;\n ariaLabel: string;\n onChange?: (value: T) => void;\n}\n\n/** Single-choice segmented bar (align). */\nexport function SegmentedControl<T extends string>({\n options,\n value,\n ariaLabel,\n onChange,\n}: SegmentedControlProps<T>) {\n return (\n <div className=\"pa-segmented\" role=\"group\" aria-label={ariaLabel}>\n {options.map((opt) => (\n <button\n key={opt.value}\n type=\"button\"\n className={`pa-segmented-btn ${value === opt.value ? 'pa-segmented-btn--on' : ''}`}\n title={opt.title}\n aria-pressed={value === opt.value}\n aria-label={opt.title}\n onClick={() => onChange?.(opt.value)}\n >\n {opt.content}\n </button>\n ))}\n </div>\n );\n}\n\nexport interface MultiSegmentOption {\n id: string;\n title: string;\n content: ReactNode;\n pressed: boolean;\n}\n\ninterface MultiSegmentedControlProps {\n options: MultiSegmentOption[];\n ariaLabel: string;\n onToggle: (id: string) => void;\n}\n\n/** Multi-select segmented bar (bold / italic / underline / strike). */\nexport function MultiSegmentedControl({\n options,\n ariaLabel,\n onToggle,\n}: MultiSegmentedControlProps) {\n return (\n <div className=\"pa-segmented\" role=\"group\" aria-label={ariaLabel}>\n {options.map((opt) => (\n <button\n key={opt.id}\n type=\"button\"\n className={`pa-segmented-btn ${opt.pressed ? 'pa-segmented-btn--on' : ''}`}\n title={opt.title}\n aria-pressed={opt.pressed}\n aria-label={opt.title}\n onClick={() => onToggle(opt.id)}\n >\n {opt.content}\n </button>\n ))}\n </div>\n );\n}\n","interface IconProps {\n className?: string;\n}\n\nexport function IconAlignLeft({ className }: IconProps) {\n return (\n <svg className={className} width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n fill=\"currentColor\"\n d=\"M2 3h10v1.5H2V3zm0 3.5h7v1.5H2V6.5zm0 3.5h10v1.5H2V10zm0 3.5h7v1.5H2V13.5z\"\n />\n </svg>\n );\n}\n\nexport function IconAlignCenter({ className }: IconProps) {\n return (\n <svg className={className} width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n fill=\"currentColor\"\n d=\"M3 3h10v1.5H3V3zm1.5 3.5h7v1.5h-7V6.5zm-1.5 3.5h10v1.5H3V10zm1.5 3.5h7v1.5h-7V13.5z\"\n />\n </svg>\n );\n}\n\nexport function IconAlignRight({ className }: IconProps) {\n return (\n <svg className={className} width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n fill=\"currentColor\"\n d=\"M4 3h10v1.5H4V3zm3 3.5h7v1.5H7V6.5zm-3 3.5h10v1.5H4V10zm3 3.5h7v1.5H7V13.5z\"\n />\n </svg>\n );\n}\n\nexport function IconAlignJustify({ className }: IconProps) {\n return (\n <svg className={className} width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path fill=\"currentColor\" d=\"M2 3h12v1.5H2V3zm0 3.5h12v1.5H2V6.5zm0 3.5h12v1.5H2V10zm0 3.5h12v1.5H2V13.5z\" />\n </svg>\n );\n}\n\nexport function IconStrikethrough({ className }: IconProps) {\n return (\n <svg className={className} width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n fill=\"currentColor\"\n d=\"M11.2 9.25H4.8c.35 1.05 1.2 1.75 2.45 1.75 1.05 0 1.85-.45 2.2-1.15l1.35.55C10.15 11.85 8.7 12.5 7.25 12.5 4.85 12.5 3 10.85 3 8.5h1.5c0 1.55 1.15 2.75 2.75 2.75.55 0 1.05-.15 1.45-.4L3 7.5h10l-1.8 1.75z\"\n />\n </svg>\n );\n}\n","/** Numeric font-weight for bold toggle (400 ↔ 700). */\nexport function isBoldWeight(value: string): boolean {\n const n = parseInt(value.trim(), 10);\n if (Number.isFinite(n)) return n >= 600;\n return value.trim() === 'bold' || value.trim() === 'bolder';\n}\n\nexport function toggleBoldWeight(value: string): string {\n return isBoldWeight(value) ? '400' : '700';\n}\n\nexport function isItalicStyle(value: string): boolean {\n return value.trim() === 'italic' || value.trim() === 'oblique';\n}\n\nexport function toggleItalicStyle(value: string): string {\n return isItalicStyle(value) ? 'normal' : 'italic';\n}\n\nexport function hasTextDecoration(value: string, token: 'underline' | 'line-through'): boolean {\n return value.split(/\\s+/).includes(token);\n}\n\nexport function toggleTextDecoration(\n value: string,\n token: 'underline' | 'line-through'\n): string {\n const parts = new Set(\n value\n .trim()\n .split(/\\s+/)\n .filter((p) => p && p !== 'none')\n );\n if (parts.has(token)) parts.delete(token);\n else parts.add(token);\n return parts.size === 0 ? 'none' : Array.from(parts).join(' ');\n}\n\nexport type TextAlignValue = 'left' | 'center' | 'right' | 'justify';\n\nexport function normalizeTextAlign(value: string): TextAlignValue {\n const v = value.trim() as TextAlignValue;\n if (v === 'center' || v === 'right' || v === 'justify') return v;\n return 'left';\n}\n\nexport { colorToHexInput } from './colorModel.js';\n","import type { ElementState, TargetScope, TextEditKind } from '@pixelagent/shared';\nimport { ColorField } from './ColorField';\nimport { EditSection } from './EditSection';\nimport { FontFamilySelect } from './FontFamilySelect';\nimport { PropertyField } from './PropertyField';\nimport { SpacingField } from './SpacingField';\nimport { MultiSegmentedControl, SegmentedControl } from './SegmentedControl';\nimport {\n IconAlignCenter,\n IconAlignJustify,\n IconAlignLeft,\n IconAlignRight,\n IconStrikethrough,\n} from './TypographyIcons';\nimport {\n hasTextDecoration,\n isBoldWeight,\n isItalicStyle,\n normalizeTextAlign,\n toggleBoldWeight,\n toggleItalicStyle,\n toggleTextDecoration,\n type TextAlignValue,\n} from './styleUtils';\n\nconst BORDER_STYLE_OPTIONS = [\n 'none',\n 'solid',\n 'dashed',\n 'dotted',\n 'double',\n 'groove',\n 'ridge',\n 'inset',\n 'outset',\n] as const;\n\nconst DISPLAY_OPTIONS = [\n 'block',\n 'inline',\n 'inline-block',\n 'flex',\n 'inline-flex',\n 'grid',\n 'inline-grid',\n 'none',\n 'contents',\n] as const;\n\nconst FLEX_GRID_DISPLAYS = new Set(['flex', 'inline-flex', 'grid', 'inline-grid']);\n\nexport interface EditPropertiesPanelProps {\n values: Record<string, string>;\n onPropertyChange: (property: string, value: string) => void;\n textKind: TextEditKind;\n textValue: string;\n onTextChange: (value: string) => void;\n targetScope: TargetScope;\n onTargetScopeChange: (scope: TargetScope) => void;\n elementState: ElementState;\n onElementStateChange: (state: ElementState) => void;\n instanceCount: number;\n scopeHint?: string | null;\n stateHint?: string | null;\n}\n\nexport function EditPropertiesPanel({\n values,\n onPropertyChange,\n textKind,\n textValue,\n onTextChange,\n targetScope,\n onTargetScopeChange,\n elementState,\n onElementStateChange,\n instanceCount,\n scopeHint,\n stateHint,\n}: EditPropertiesPanelProps) {\n const fontWeight = values['font-weight'] ?? '';\n const fontStyle = values['font-style'] ?? 'normal';\n const textDecoration = values['text-decoration'] ?? 'none';\n const textAlign = normalizeTextAlign(values['text-align'] ?? 'left');\n\n const displayValue = values.display?.trim() ?? '';\n const showDisplay = Boolean(displayValue);\n const showGap = FLEX_GRID_DISPLAYS.has(displayValue);\n const displayOptions: string[] = [...DISPLAY_OPTIONS];\n if (\n displayValue &&\n !DISPLAY_OPTIONS.includes(displayValue as (typeof DISPLAY_OPTIONS)[number])\n ) {\n displayOptions.push(displayValue);\n }\n const rawGap = values.gap?.trim() ?? '';\n const gapValue = rawGap === 'normal' || rawGap === '' ? '0px' : rawGap;\n const borderStyle = values['border-style'] ?? 'none';\n const borderStyleOptions: string[] = [...BORDER_STYLE_OPTIONS];\n if (\n borderStyle &&\n !BORDER_STYLE_OPTIONS.includes(borderStyle as (typeof BORDER_STYLE_OPTIONS)[number])\n ) {\n borderStyleOptions.push(borderStyle);\n }\n\n return (\n <div className=\"pa-edit-sections\">\n <EditSection title=\"Targeting\" defaultOpen>\n <div className=\"pa-edit-field-grid pa-edit-field-grid--2\">\n <label className=\"pa-edit-mini-field\">\n <span className=\"pa-edit-field-label\">Scope</span>\n <select\n className=\"pa-select\"\n value={targetScope}\n onChange={(e) => onTargetScopeChange(e.target.value as TargetScope)}\n >\n <option value=\"this-instance\">This instance</option>\n <option value=\"all-instances\" disabled={instanceCount <= 1}>\n All ({instanceCount})\n </option>\n </select>\n </label>\n <label className=\"pa-edit-mini-field\">\n <span className=\"pa-edit-field-label\">State</span>\n <select\n className=\"pa-select\"\n value={elementState}\n onChange={(e) => onElementStateChange(e.target.value as ElementState)}\n >\n <option value=\"normal\">Normal</option>\n <option value=\"hover\">Hover</option>\n <option value=\"focus\">Focus</option>\n <option value=\"active\">Active</option>\n <option value=\"disabled\">Disabled</option>\n </select>\n </label>\n </div>\n {scopeHint ? <p className=\"pa-edit-inline-hint\">{scopeHint}</p> : null}\n {stateHint ? <p className=\"pa-edit-inline-hint\">{stateHint}</p> : null}\n </EditSection>\n\n {textKind !== 'none' && (\n <EditSection title=\"Content\" defaultOpen>\n <label className=\"pa-edit-stack-field\">\n <span className=\"pa-edit-field-label\">Text</span>\n <textarea\n className=\"pa-textarea pa-edit-text-input\"\n value={textValue}\n onChange={(e) => onTextChange(e.target.value)}\n rows={textKind === 'value' ? 2 : 3}\n placeholder=\"Edit visible text…\"\n />\n </label>\n </EditSection>\n )}\n\n <EditSection title=\"Typography\" defaultOpen>\n <FontFamilySelect\n value={values['font-family'] ?? ''}\n onChange={(v) => onPropertyChange('font-family', v)}\n />\n\n <div className=\"pa-edit-field-block\">\n <span className=\"pa-edit-field-label\">Style</span>\n <MultiSegmentedControl\n ariaLabel=\"Text style\"\n options={[\n {\n id: 'bold',\n title: 'Bold',\n pressed: isBoldWeight(fontWeight),\n content: <span className=\"pa-segmented-type pa-segmented-type--bold\">B</span>,\n },\n {\n id: 'italic',\n title: 'Italic',\n pressed: isItalicStyle(fontStyle),\n content: <span className=\"pa-segmented-type pa-segmented-type--italic\">I</span>,\n },\n {\n id: 'underline',\n title: 'Underline',\n pressed: hasTextDecoration(textDecoration, 'underline'),\n content: (\n <span className=\"pa-segmented-type pa-segmented-type--underline\">U</span>\n ),\n },\n {\n id: 'strikethrough',\n title: 'Strikethrough',\n pressed: hasTextDecoration(textDecoration, 'line-through'),\n content: <IconStrikethrough className=\"pa-segmented-icon\" />,\n },\n ]}\n onToggle={(id) => {\n if (id === 'bold') onPropertyChange('font-weight', toggleBoldWeight(fontWeight));\n else if (id === 'italic') onPropertyChange('font-style', toggleItalicStyle(fontStyle));\n else if (id === 'underline') {\n onPropertyChange(\n 'text-decoration',\n toggleTextDecoration(textDecoration, 'underline')\n );\n } else if (id === 'strikethrough') {\n onPropertyChange(\n 'text-decoration',\n toggleTextDecoration(textDecoration, 'line-through')\n );\n }\n }}\n />\n </div>\n\n <div className=\"pa-edit-field-block\">\n <span className=\"pa-edit-field-label\">Align</span>\n <SegmentedControl<TextAlignValue>\n ariaLabel=\"Text align\"\n value={textAlign}\n onChange={(v) => onPropertyChange('text-align', v)}\n options={[\n {\n value: 'left',\n title: 'Align left',\n content: <IconAlignLeft className=\"pa-segmented-icon\" />,\n },\n {\n value: 'center',\n title: 'Align center',\n content: <IconAlignCenter className=\"pa-segmented-icon\" />,\n },\n {\n value: 'right',\n title: 'Align right',\n content: <IconAlignRight className=\"pa-segmented-icon\" />,\n },\n {\n value: 'justify',\n title: 'Justify',\n content: <IconAlignJustify className=\"pa-segmented-icon\" />,\n },\n ]}\n />\n </div>\n\n <div className=\"pa-edit-field-grid pa-edit-field-grid--2 pa-edit-size-row\">\n <PropertyField\n compact\n property=\"font-size\"\n label=\"Font size (px)\"\n value={values['font-size'] ?? ''}\n onChange={(v) => onPropertyChange('font-size', v)}\n />\n <PropertyField\n compact\n property=\"line-height\"\n label=\"Line height (px)\"\n value={values['line-height'] ?? ''}\n onChange={(v) => onPropertyChange('line-height', v)}\n />\n </div>\n <ColorField\n label=\"Color\"\n value={values.color ?? ''}\n onChange={(v) => onPropertyChange('color', v)}\n />\n </EditSection>\n\n <EditSection title=\"Layout\" defaultOpen>\n <div className=\"pa-edit-split-fields\">\n <PropertyField\n compact\n property=\"width\"\n label=\"Width\"\n value={values.width ?? ''}\n onChange={(v) => onPropertyChange('width', v)}\n />\n <PropertyField\n compact\n property=\"height\"\n label=\"Height\"\n value={values.height ?? ''}\n onChange={(v) => onPropertyChange('height', v)}\n />\n </div>\n <SpacingField\n property=\"padding\"\n label=\"Padding\"\n value={values.padding ?? ''}\n onChange={(v) => onPropertyChange('padding', v)}\n />\n <SpacingField\n property=\"margin\"\n label=\"Margin\"\n value={values.margin ?? ''}\n onChange={(v) => onPropertyChange('margin', v)}\n />\n {showDisplay && (\n <label className=\"pa-prop-row pa-prop-row--compact\">\n <span className=\"pa-edit-field-label\">Display</span>\n <select\n className=\"pa-select\"\n value={displayValue}\n onChange={(e) => onPropertyChange('display', e.target.value)}\n >\n {displayOptions.map((opt) => (\n <option key={opt} value={opt}>\n {opt}\n </option>\n ))}\n </select>\n </label>\n )}\n {showGap && (\n <PropertyField\n compact\n property=\"gap\"\n label=\"Gap\"\n value={gapValue}\n onChange={(v) => onPropertyChange('gap', v)}\n />\n )}\n </EditSection>\n\n <EditSection title=\"Fill\">\n <ColorField\n label=\"Background\"\n value={values['background-color'] ?? ''}\n onChange={(v) => onPropertyChange('background-color', v)}\n />\n <PropertyField\n compact\n property=\"opacity\"\n label=\"Opacity\"\n value={values.opacity ?? ''}\n onChange={(v) => onPropertyChange('opacity', v)}\n />\n </EditSection>\n\n <EditSection title=\"Border\" defaultOpen>\n <ColorField\n label=\"Border color\"\n value={values['border-color'] ?? ''}\n onChange={(v) => onPropertyChange('border-color', v)}\n />\n <label className=\"pa-edit-stack-field\">\n <span className=\"pa-edit-field-label\">Style</span>\n <select\n className=\"pa-select\"\n value={borderStyle}\n onChange={(e) => onPropertyChange('border-style', e.target.value)}\n >\n {borderStyleOptions.map((style) => (\n <option key={style} value={style}>\n {style}\n </option>\n ))}\n </select>\n </label>\n <PropertyField\n compact\n property=\"border-width\"\n label=\"Stroke width (px)\"\n value={values['border-width'] ?? ''}\n onChange={(v) => onPropertyChange('border-width', v)}\n />\n <PropertyField\n compact\n property=\"border-radius\"\n label=\"Radius (px)\"\n value={values['border-radius'] ?? ''}\n onChange={(v) => onPropertyChange('border-radius', v)}\n />\n </EditSection>\n </div>\n );\n}\n","import { useCallback, useEffect, useRef, useState } from 'react';\nimport type { ElementState, StyleChange, TargetScope } from '@pixelagent/shared';\nimport {\n applyTailwindStatePreview,\n captureInlineStyles,\n captureTextSnapshot,\n clearTailwindStatePreview,\n getEditableTextInfo,\n getPreviewTargets,\n getRelevantComputedStyles,\n restoreInlineStyles,\n restoreTextSnapshot,\n setEditableTextPreview,\n type InlineStyleSnapshot,\n type TextEditKind,\n type TextSnapshot,\n} from '@pixelagent/shared';\nimport { hasPositiveBorderWidth } from './propertyControls.js';\n\nconst MAX_UNDO = 50;\n\nconst STYLE_PROP_KEYS = [\n 'font-family',\n 'font-size',\n 'font-weight',\n 'font-style',\n 'line-height',\n 'text-align',\n 'text-decoration',\n 'color',\n 'background-color',\n 'padding',\n 'margin',\n 'width',\n 'height',\n 'gap',\n 'display',\n 'border-width',\n 'border-style',\n 'border-color',\n 'border-radius',\n 'opacity',\n] as const;\n\ninterface HistoryFrame {\n inline: InlineStyleSnapshot[];\n text: TextSnapshot | null;\n}\n\nexport interface EditPreviewApi {\n clearPreviews: () => void;\n revertPreviews: () => void;\n}\n\nexport function useEditPreview(\n selectedElement: Element | null,\n targetScope: TargetScope,\n elementState: ElementState\n) {\n const targetsRef = useRef<HTMLElement[]>([]);\n const touchedRef = useRef<Set<HTMLElement>>(new Set());\n const initialInlineRef = useRef<InlineStyleSnapshot[]>([]);\n const initialTextRef = useRef<TextSnapshot | null>(null);\n const undoStackRef = useRef<HistoryFrame[]>([]);\n\n const [values, setValues] = useState<Record<string, string>>({});\n const [originalValues, setOriginalValues] = useState<Record<string, string>>({});\n const [textKind, setTextKind] = useState<TextEditKind>('none');\n const [textValue, setTextValue] = useState('');\n const [originalText, setOriginalText] = useState('');\n // Pending changes are kept per-element so switching layers does not wipe\n // in-progress edits. The badge sums across all tracked elements; Apply\n // iterates entries to dispatch one payload per element.\n const [pendingByElement, setPendingByElement] = useState<Map<Element, StyleChange[]>>(\n () => new Map()\n );\n const [canUndo, setCanUndo] = useState(false);\n\n const captureFrame = useCallback((): HistoryFrame => {\n const elements = Array.from(touchedRef.current);\n return {\n inline: captureInlineStyles(elements, [...STYLE_PROP_KEYS]),\n text:\n selectedElement && textKind !== 'none'\n ? captureTextSnapshot(selectedElement as HTMLElement, textKind)\n : null,\n };\n }, [selectedElement, textKind]);\n\n const pushUndo = useCallback(() => {\n undoStackRef.current.push(captureFrame());\n if (undoStackRef.current.length > MAX_UNDO) {\n undoStackRef.current.shift();\n }\n setCanUndo(undoStackRef.current.length > 0);\n }, [captureFrame]);\n\n const syncTargets = useCallback(\n (reapplyPending: boolean) => {\n if (!selectedElement) return;\n\n const prevTouched = Array.from(touchedRef.current);\n restoreInlineStyles(initialInlineRef.current.filter((s) => prevTouched.includes(s.element)));\n if (initialTextRef.current) {\n restoreTextSnapshot(initialTextRef.current);\n }\n\n const targets = getPreviewTargets(selectedElement, targetScope);\n targetsRef.current = targets;\n touchedRef.current = new Set(targets);\n\n clearTailwindStatePreview(prevTouched);\n applyTailwindStatePreview(targets, elementState);\n\n const currentPending = selectedElement\n ? (pendingByElement.get(selectedElement) ?? [])\n : [];\n if (reapplyPending && currentPending.length > 0) {\n for (const change of currentPending) {\n if (change.property === 'textContent' || change.property === 'value') {\n for (const el of targets) {\n setEditableTextPreview(el, change.property as TextEditKind, change.newValue);\n }\n } else {\n for (const el of targets) {\n el.style.setProperty(change.property, change.newValue);\n }\n }\n }\n }\n },\n [selectedElement, targetScope, elementState, pendingByElement]\n );\n\n useEffect(() => {\n if (!selectedElement) {\n targetsRef.current = [];\n touchedRef.current = new Set();\n initialInlineRef.current = [];\n initialTextRef.current = null;\n undoStackRef.current = [];\n setValues({});\n setOriginalValues({});\n setTextKind('none');\n setTextValue('');\n setOriginalText('');\n setPendingByElement(new Map());\n setCanUndo(false);\n return;\n }\n\n const targets = getPreviewTargets(selectedElement, targetScope);\n targetsRef.current = targets;\n touchedRef.current = new Set(targets);\n initialInlineRef.current = captureInlineStyles(targets, [...STYLE_PROP_KEYS]);\n undoStackRef.current = [];\n setCanUndo(false);\n\n const styles = getRelevantComputedStyles(selectedElement);\n setValues(styles);\n setOriginalValues(styles);\n\n const textInfo = getEditableTextInfo(selectedElement);\n setTextKind(textInfo.kind);\n setTextValue(textInfo.value);\n setOriginalText(textInfo.value);\n initialTextRef.current =\n textInfo.kind !== 'none'\n ? captureTextSnapshot(selectedElement as HTMLElement, textInfo.kind)\n : null;\n\n // Intentionally NOT clearing pendingByElement on element switch — pending\n // edits on other elements stay tracked so the badge accumulates across\n // layers and switching back restores in-progress work.\n applyTailwindStatePreview(targets, elementState);\n\n return () => clearTailwindStatePreview(targets);\n }, [selectedElement]);\n\n useEffect(() => {\n if (!selectedElement) return;\n syncTargets(true);\n }, [targetScope]);\n\n useEffect(() => {\n if (!selectedElement) return;\n const targets = getPreviewTargets(selectedElement, targetScope);\n targetsRef.current = targets;\n clearTailwindStatePreview(Array.from(touchedRef.current));\n applyTailwindStatePreview(targets, elementState);\n touchedRef.current = new Set(targets);\n }, [elementState, selectedElement, targetScope]);\n\n const upsertChange = useCallback(\n (property: string, oldValue: string, newValue: string) => {\n if (!selectedElement) return;\n setPendingByElement((prev) => {\n const next = new Map(prev);\n const existing = next.get(selectedElement) ?? [];\n const filtered = existing.filter((c) => c.property !== property);\n if (newValue === oldValue) {\n if (filtered.length === 0) {\n next.delete(selectedElement);\n } else {\n next.set(selectedElement, filtered);\n }\n } else {\n next.set(selectedElement, [...filtered, { property, oldValue, newValue }]);\n }\n return next;\n });\n },\n [selectedElement]\n );\n\n const updateProperty = useCallback(\n (property: string, newValue: string) => {\n if (!selectedElement) return;\n\n const batch: Record<string, string> = { [property]: newValue };\n if (\n property === 'border-width' &&\n (values['border-style'] ?? 'none') === 'none' &&\n hasPositiveBorderWidth(newValue)\n ) {\n batch['border-style'] = 'solid';\n }\n\n pushUndo();\n setValues((prev) => ({ ...prev, ...batch }));\n for (const [prop, val] of Object.entries(batch)) {\n const oldValue = originalValues[prop] ?? '';\n for (const el of targetsRef.current) {\n el.style.setProperty(prop, val);\n touchedRef.current.add(el);\n }\n upsertChange(prop, oldValue, val);\n }\n },\n [selectedElement, originalValues, values, pushUndo, upsertChange]\n );\n\n const updateText = useCallback(\n (newValue: string) => {\n if (!selectedElement || textKind === 'none') return;\n pushUndo();\n setTextValue(newValue);\n for (const el of targetsRef.current) {\n setEditableTextPreview(el, textKind, newValue);\n touchedRef.current.add(el);\n }\n upsertChange(textKind, originalText, newValue);\n },\n [selectedElement, textKind, originalText, pushUndo, upsertChange]\n );\n\n const undo = useCallback(() => {\n const frame = undoStackRef.current.pop();\n if (!frame) return;\n restoreInlineStyles(frame.inline);\n if (frame.text) restoreTextSnapshot(frame.text);\n setCanUndo(undoStackRef.current.length > 0);\n\n if (selectedElement) {\n setValues(getRelevantComputedStyles(selectedElement));\n const textInfo = getEditableTextInfo(selectedElement);\n if (textInfo.kind !== 'none') setTextValue(textInfo.value);\n }\n }, [selectedElement]);\n\n const reset = useCallback(() => {\n restoreInlineStyles(initialInlineRef.current);\n if (initialTextRef.current) restoreTextSnapshot(initialTextRef.current);\n undoStackRef.current = [];\n setCanUndo(false);\n setPendingByElement(new Map());\n if (selectedElement) {\n setValues(getRelevantComputedStyles(selectedElement));\n const textInfo = getEditableTextInfo(selectedElement);\n setTextValue(textInfo.value);\n }\n }, [selectedElement]);\n\n const revertPreviews = useCallback(() => {\n restoreInlineStyles(initialInlineRef.current);\n if (initialTextRef.current) restoreTextSnapshot(initialTextRef.current);\n }, []);\n\n const clearPreviews = useCallback(() => {\n revertPreviews();\n clearTailwindStatePreview(Array.from(touchedRef.current));\n undoStackRef.current = [];\n setCanUndo(false);\n setPendingByElement(new Map());\n if (selectedElement) {\n setValues(getRelevantComputedStyles(selectedElement));\n const textInfo = getEditableTextInfo(selectedElement);\n if (textInfo.kind !== 'none') setTextValue(textInfo.value);\n }\n }, [revertPreviews, selectedElement]);\n\n const currentPending = selectedElement\n ? (pendingByElement.get(selectedElement) ?? [])\n : [];\n\n let totalPendingCount = 0;\n for (const arr of pendingByElement.values()) totalPendingCount += arr.length;\n\n const clearAllPending = useCallback(() => {\n setPendingByElement(new Map());\n }, []);\n\n return {\n values,\n textKind,\n textValue,\n pendingChanges: currentPending,\n pendingByElement,\n totalPendingCount,\n clearAllPending,\n canUndo,\n updateProperty,\n updateText,\n undo,\n reset,\n clearPreviews,\n revertPreviews,\n };\n}\n","import { useCallback, useEffect, useMemo } from 'react';\nimport type { ElementState, StyleChange, TargetScope } from '@pixelagent/shared';\nimport {\n countElementInstances,\n detectStylingSystem,\n getCssSelector,\n getElementDisplayLabel,\n getPreviewTargets,\n getScopeSelector,\n readReactSource,\n} from '@pixelagent/shared';\nimport { ElementOverlay } from '../annotate/ElementOverlay';\nimport { GlassButton, GlassPanel } from '../glass';\nimport { useDraggable } from '../hooks/useDraggable';\nimport { IconReset, IconUndo } from './EditActionIcons';\nimport { EditPropertiesPanel } from './EditPropertiesPanel';\nimport type { EditPreviewApi } from './useEditPreview';\nimport { useEditPreview } from './useEditPreview';\n\ninterface EditPanelProps {\n selectedElement: Element | null;\n hoveredElement: Element | null;\n onSelectElement: (el: Element | null) => void;\n onHoverElement: (el: Element | null) => void;\n targetScope: TargetScope;\n onTargetScopeChange: (scope: TargetScope) => void;\n elementState: ElementState;\n onElementStateChange: (state: ElementState) => void;\n onApply: (pendingByElement: Map<Element, StyleChange[]>) => void | Promise<void>;\n applyStatus: string | null;\n isToolbarTarget: (target: EventTarget | null) => boolean;\n onPreviewApi?: (api: EditPreviewApi | null) => void;\n}\n\nexport function EditPanel({\n selectedElement,\n hoveredElement,\n onSelectElement,\n onHoverElement,\n targetScope,\n onTargetScopeChange,\n elementState,\n onElementStateChange,\n onApply,\n applyStatus,\n isToolbarTarget,\n onPreviewApi,\n}: EditPanelProps) {\n const {\n values,\n textKind,\n textValue,\n pendingChanges,\n pendingByElement,\n totalPendingCount,\n clearAllPending,\n canUndo,\n updateProperty,\n updateText,\n undo,\n reset,\n clearPreviews,\n revertPreviews,\n } = useEditPreview(selectedElement, targetScope, elementState);\n\n const { elementRef: panelRef, isDragging, style, dragHandleProps } = useDraggable({\n computeDefaultPosition: (rect) => ({\n x: window.innerWidth - rect.width - 16,\n y: 16,\n }),\n });\n\n useEffect(() => {\n onPreviewApi?.({ clearPreviews, revertPreviews });\n return () => onPreviewApi?.(null);\n }, [onPreviewApi, clearPreviews, revertPreviews]);\n\n const handleMouseMove = useCallback(\n (e: MouseEvent) => {\n if (isToolbarTarget(e.target)) return;\n\n const elements = document.elementsFromPoint(e.clientX, e.clientY);\n const target = elements.find(\n (el) =>\n el instanceof Element &&\n !el.closest(\n '[data-pixelagent-root],[data-pixelagent-toolbar-portal],[data-pixelagent-picker-portal]'\n )\n );\n onHoverElement(target ?? null);\n },\n [isToolbarTarget, onHoverElement]\n );\n\n const handleClick = useCallback(\n (e: MouseEvent) => {\n if (isToolbarTarget(e.target)) return;\n\n e.preventDefault();\n e.stopPropagation();\n\n const elements = document.elementsFromPoint(e.clientX, e.clientY);\n const target = elements.find(\n (el) =>\n el instanceof Element &&\n !el.closest(\n '[data-pixelagent-root],[data-pixelagent-toolbar-portal],[data-pixelagent-picker-portal]'\n )\n );\n onSelectElement(target ?? null);\n },\n [isToolbarTarget, onSelectElement]\n );\n\n useEffect(() => {\n document.addEventListener('mousemove', handleMouseMove, true);\n document.addEventListener('click', handleClick, true);\n return () => {\n document.removeEventListener('mousemove', handleMouseMove, true);\n document.removeEventListener('click', handleClick, true);\n };\n }, [handleMouseMove, handleClick]);\n\n const handleApply = async () => {\n if (totalPendingCount === 0) return;\n await onApply(pendingByElement);\n // Pending edits are now in source; reset the tracker so badge zeroes out.\n clearAllPending();\n };\n\n const source = selectedElement ? readReactSource(selectedElement) : null;\n const stylingSystem = selectedElement ? detectStylingSystem(selectedElement) : null;\n const instanceCount = selectedElement ? countElementInstances(selectedElement) : 0;\n const scopeSelector = selectedElement\n ? getScopeSelector(selectedElement, 'all-instances')\n : '';\n\n const stateHint =\n elementState !== 'normal' && stylingSystem === 'tailwind'\n ? 'Tailwind variant preview: matching hover:/focus:/… classes are applied without the prefix.'\n : elementState !== 'normal'\n ? 'State preview uses focus/disabled simulation where possible.'\n : null;\n\n const scopeHint =\n instanceCount > 1\n ? targetScope === 'all-instances'\n ? `Preview & Apply on ${instanceCount} elements (${scopeSelector}).`\n : `This instance only — ${instanceCount - 1} other on page.`\n : targetScope === 'all-instances'\n ? 'Only one match — scope has no effect.'\n : null;\n\n const scopeMatchedElements = useMemo(() => {\n if (!selectedElement || targetScope !== 'all-instances') return [];\n return getPreviewTargets(selectedElement, 'all-instances');\n }, [selectedElement, targetScope]);\n\n return (\n <>\n <ElementOverlay\n element={targetScope === 'all-instances' ? null : hoveredElement}\n selected={selectedElement}\n multiSelected={scopeMatchedElements}\n primarySelected={selectedElement}\n />\n\n <div\n ref={panelRef}\n className={`pa-edit-panel-float ${isDragging ? 'pa-edit-panel-float--dragging' : ''}`}\n style={style}\n >\n <GlassPanel variant=\"sheet\" side=\"right\" className=\"pa-edit-panel-glass\">\n <div className=\"pa-edit-panel-inner\">\n <div className=\"pa-edit-panel-header\">\n <button\n type=\"button\"\n className=\"pa-edit-panel-drag\"\n aria-label=\"Drag edit panel\"\n title=\"Drag to move\"\n {...dragHandleProps}\n >\n <span className=\"pa-edit-panel-grip\" aria-hidden=\"true\">\n <span /><span /><span /><span /><span /><span />\n </span>\n </button>\n <h3 className=\"pa-edit-title\">Edit</h3>\n </div>\n\n {!selectedElement ? (\n <p className=\"pa-edit-hint\">Click an element to edit its text and styles.</p>\n ) : (\n <>\n <div className=\"pa-edit-meta\">\n <code\n className=\"pa-edit-meta-label\"\n title={`This instance: ${getCssSelector(selectedElement)}\\nAll instances: ${scopeSelector}`}\n >\n {getElementDisplayLabel(selectedElement)}\n </code>\n {(source?.sourceFile || stylingSystem) && (\n <span className=\"pa-edit-source\">\n {source?.sourceFile && (\n <>\n {source.sourceFile}\n {source.lineNumber ? `:${source.lineNumber}` : ''}\n </>\n )}\n {source?.sourceFile && stylingSystem ? ' · ' : ''}\n {stylingSystem ?? ''}\n </span>\n )}\n </div>\n\n <div className=\"pa-edit-panel-scroll\">\n <EditPropertiesPanel\n values={values}\n onPropertyChange={updateProperty}\n textKind={textKind}\n textValue={textValue}\n onTextChange={updateText}\n targetScope={targetScope}\n onTargetScopeChange={onTargetScopeChange}\n elementState={elementState}\n onElementStateChange={onElementStateChange}\n instanceCount={instanceCount}\n scopeHint={scopeHint}\n stateHint={stateHint}\n />\n </div>\n\n <div className=\"pa-edit-panel-sticky\">\n <div className=\"pa-edit-actions\">\n <GlassButton variant=\"regular\" onClick={undo} disabled={!canUndo}>\n <span className=\"pa-glass-btn-inner\">\n <IconUndo className=\"pa-glass-btn-icon\" />\n <span>Undo</span>\n </span>\n </GlassButton>\n <GlassButton\n variant=\"regular\"\n onClick={reset}\n disabled={pendingChanges.length === 0}\n >\n <span className=\"pa-glass-btn-inner\">\n <IconReset className=\"pa-glass-btn-icon\" />\n <span>Reset</span>\n </span>\n </GlassButton>\n </div>\n\n <div className=\"pa-edit-footer\">\n <span\n className={\n applyStatus\n ? /fail/i.test(applyStatus)\n ? 'pa-change-count pa-change-count--error'\n : 'pa-change-count pa-change-count--success'\n : 'pa-change-count'\n }\n >\n {applyStatus ??\n `${totalPendingCount} pending change${totalPendingCount !== 1 ? 's' : ''}`}\n </span>\n <GlassButton\n variant=\"glass-primary\"\n onClick={handleApply}\n disabled={totalPendingCount === 0}\n title={\n source?.sourceFile\n ? undefined\n : 'No source file — Apply copies selector + changes to clipboard'\n }\n >\n Apply\n </GlassButton>\n </div>\n </div>\n </>\n )}\n </div>\n </GlassPanel>\n </div>\n </>\n );\n}\n","import type { ApplyPayload, ApplyVisualDiffResult } from '@pixelagent/shared';\nimport { copyToClipboard } from '@pixelagent/shared';\n\nexport type ApplyTransportResult =\n | { mode: 'mcp'; result: ApplyVisualDiffResult }\n | { mode: 'clipboard' }\n | { mode: 'error'; message: string };\n\nexport interface SubmitApplyOptions {\n applyEndpoint?: string;\n onApply?: (payload: ApplyPayload) => Promise<ApplyVisualDiffResult | null>;\n}\n\nexport async function submitApply(\n payload: ApplyPayload,\n options: SubmitApplyOptions = {}\n): Promise<ApplyTransportResult> {\n if (options.onApply) {\n try {\n const result = await options.onApply(payload);\n if (result) return { mode: 'mcp', result };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { mode: 'error', message };\n }\n }\n\n const endpoint = options.applyEndpoint;\n if (endpoint) {\n try {\n const res = await fetch(endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ payload }),\n });\n const data = (await res.json()) as ApplyVisualDiffResult & { error?: string };\n if (!res.ok) {\n return { mode: 'error', message: data.error ?? res.statusText };\n }\n return { mode: 'mcp', result: data };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { mode: 'error', message };\n }\n }\n\n await copyToClipboard(JSON.stringify(payload, null, 2));\n return { mode: 'clipboard' };\n}\n\n/**\n * Two outcomes only: applied or failed. Anything that didn't actually write\n * source (errors, clipboard fallback, partial-success without lines changed)\n * collapses to \"Apply failed\". Detail goes to the console for debugging.\n */\nexport function formatApplyFeedback(transport: ApplyTransportResult): string {\n if (\n transport.mode === 'mcp' &&\n transport.result.success &&\n transport.result.linesChanged.length > 0\n ) {\n if (transport.result.warnings?.length) {\n console.warn('[pixelagent] Apply succeeded with warnings:', transport.result.warnings);\n }\n return 'Change applied';\n }\n\n if (transport.mode === 'error') {\n console.error('[pixelagent] Apply failed:', transport.message);\n } else if (transport.mode === 'mcp') {\n console.warn('[pixelagent] Apply reported no changes:', transport.result);\n } else {\n console.warn('[pixelagent] Apply fell back to clipboard — no source patched');\n }\n return 'Apply failed';\n}\n","import { useEffect, useState } from 'react';\n\nexport function useElementRect(target: Element | null): DOMRect | null {\n const [rect, setRect] = useState<DOMRect | null>(null);\n\n useEffect(() => {\n if (!target) {\n setRect(null);\n return;\n }\n\n const update = () => setRect(target.getBoundingClientRect());\n\n update();\n\n const observer = new ResizeObserver(update);\n observer.observe(target);\n window.addEventListener('scroll', update, true);\n window.addEventListener('resize', update);\n\n return () => {\n observer.disconnect();\n window.removeEventListener('scroll', update, true);\n window.removeEventListener('resize', update);\n };\n }, [target]);\n\n return rect;\n}\n","const VIEWPORT_MARGIN = 8;\nconst ANCHOR_GAP = 8;\nconst TOOLBAR_PAD = 12;\nconst DEFAULT_PANEL_WIDTH = 300;\nconst DEFAULT_PANEL_HEIGHT = 280;\n\ntype Box = {\n top: number;\n left: number;\n right: number;\n bottom: number;\n width: number;\n height: number;\n};\n\nfunction positionToBox(top: number, left: number, width: number, height: number): Box {\n return {\n top,\n left,\n right: left + width,\n bottom: top + height,\n width,\n height,\n };\n}\n\nfunction boxesOverlap(a: Box, b: Box): boolean {\n return a.left < b.right && a.right > b.left && a.top < b.bottom && a.bottom > b.top;\n}\n\nfunction inflateRect(rect: DOMRect, pad: number): Box {\n return {\n top: rect.top - pad,\n left: rect.left - pad,\n right: rect.right + pad,\n bottom: rect.bottom + pad,\n width: rect.width + pad * 2,\n height: rect.height + pad * 2,\n };\n}\n\n/** Floating toolbar portal — treat as a no-go zone for the annotate popover. */\nexport function getToolbarObstacle(): Box | null {\n if (typeof document === 'undefined') return null;\n const toolbar = document.querySelector(\n '[data-pixelagent-toolbar-portal] .pa-toolbar-float'\n );\n if (!toolbar) return null;\n return inflateRect(toolbar.getBoundingClientRect(), TOOLBAR_PAD);\n}\n\nfunction clampHorizontal(left: number, panelWidth: number): number {\n return Math.min(\n Math.max(VIEWPORT_MARGIN, left),\n window.innerWidth - panelWidth - VIEWPORT_MARGIN\n );\n}\n\nfunction clampVertical(top: number, panelHeight: number): number {\n return Math.min(\n Math.max(VIEWPORT_MARGIN, top),\n window.innerHeight - panelHeight - VIEWPORT_MARGIN\n );\n}\n\nfunction fitsViewport(box: Box): boolean {\n return (\n box.top >= VIEWPORT_MARGIN &&\n box.left >= VIEWPORT_MARGIN &&\n box.right <= window.innerWidth - VIEWPORT_MARGIN &&\n box.bottom <= window.innerHeight - VIEWPORT_MARGIN\n );\n}\n\nfunction isValidPlacement(box: Box, obstacle: Box | null): boolean {\n if (obstacle && boxesOverlap(box, obstacle)) return false;\n return fitsViewport(box);\n}\n\n/**\n * Place the annotate note popover beside the anchor without covering the toolbar.\n * Prefers above when the anchor sits in the lower half of the viewport.\n */\nexport function computeAnnotationPopoverPosition(\n anchorRect: DOMRect,\n panelWidth = DEFAULT_PANEL_WIDTH,\n panelHeight = DEFAULT_PANEL_HEIGHT\n): { top: number; left: number } {\n const obstacle = getToolbarObstacle();\n const preferAbove = anchorRect.top > window.innerHeight * 0.45;\n\n const candidates: Array<{ placement: 'below' | 'above' | 'right' | 'left'; top: number; left: number }> =\n preferAbove\n ? [\n { placement: 'above', top: anchorRect.top - panelHeight - ANCHOR_GAP, left: anchorRect.left },\n { placement: 'below', top: anchorRect.bottom + ANCHOR_GAP, left: anchorRect.left },\n { placement: 'right', top: anchorRect.top, left: anchorRect.right + ANCHOR_GAP },\n { placement: 'left', top: anchorRect.top, left: anchorRect.left - panelWidth - ANCHOR_GAP },\n ]\n : [\n { placement: 'below', top: anchorRect.bottom + ANCHOR_GAP, left: anchorRect.left },\n { placement: 'above', top: anchorRect.top - panelHeight - ANCHOR_GAP, left: anchorRect.left },\n { placement: 'right', top: anchorRect.top, left: anchorRect.right + ANCHOR_GAP },\n { placement: 'left', top: anchorRect.top, left: anchorRect.left - panelWidth - ANCHOR_GAP },\n ];\n\n for (const { top, left } of candidates) {\n const box = positionToBox(\n clampVertical(top, panelHeight),\n clampHorizontal(left, panelWidth),\n panelWidth,\n panelHeight\n );\n if (isValidPlacement(box, obstacle)) {\n return { top: box.top, left: box.left };\n }\n }\n\n // Fallback: nudge away from toolbar, prefer above anchor\n let top = clampVertical(anchorRect.top - panelHeight - ANCHOR_GAP, panelHeight);\n let left = clampHorizontal(anchorRect.left, panelWidth);\n\n if (obstacle) {\n let box = positionToBox(top, left, panelWidth, panelHeight);\n if (boxesOverlap(box, obstacle)) {\n top = clampVertical(obstacle.top - panelHeight - ANCHOR_GAP, panelHeight);\n box = positionToBox(top, left, panelWidth, panelHeight);\n }\n if (boxesOverlap(box, obstacle)) {\n top = clampVertical(anchorRect.bottom + ANCHOR_GAP, panelHeight);\n left = clampHorizontal(\n Math.min(anchorRect.left, obstacle.left - panelWidth - ANCHOR_GAP),\n panelWidth\n );\n }\n }\n\n return { top, left };\n}\n","import { useEffect, useRef, useState } from 'react';\nimport {\n getEditableTextInfo,\n getElementDisplayLabel,\n getWindowSelectionText,\n} from '@pixelagent/shared';\nimport { GlassButton, GlassPanel } from '../glass';\nimport { useElementRect } from '../hooks/useElementRect';\nimport { computeAnnotationPopoverPosition } from './popoverPosition';\n\ninterface AnnotationPopoverProps {\n elements: Element[];\n areaBbox?: { x: number; y: number; width: number; height: number };\n onSubmit: (note: string, continuous: boolean) => void;\n onCancel: () => void;\n}\n\nexport function AnnotationPopover({\n elements,\n areaBbox,\n onSubmit,\n onCancel,\n}: AnnotationPopoverProps) {\n const [note, setNote] = useState('');\n const inputRef = useRef<HTMLTextAreaElement>(null);\n const panelRef = useRef<HTMLDivElement>(null);\n const primary = elements[0] ?? null;\n\n const anchorRect = areaBbox\n ? new DOMRect(areaBbox.x, areaBbox.y, areaBbox.width, areaBbox.height)\n : null;\n const elementRect = useElementRect(primary);\n const rect = anchorRect ?? elementRect;\n\n const selectedText = getWindowSelectionText();\n const textInfo = primary ? getEditableTextInfo(primary) : { kind: 'none' as const, value: '' };\n const elementText = textInfo.kind !== 'none' ? textInfo.value : undefined;\n\n useEffect(() => {\n inputRef.current?.focus();\n }, [elements]);\n\n useEffect(() => {\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onCancel();\n };\n document.addEventListener('keydown', onKeyDown);\n return () => document.removeEventListener('keydown', onKeyDown);\n }, [onCancel]);\n\n if (!rect) return null;\n\n const pos = computeAnnotationPopoverPosition(rect);\n const selectorLabel =\n elements.length > 1\n ? `${elements.length} selected`\n : primary\n ? getElementDisplayLabel(primary)\n : 'Area selection';\n\n const handleSubmit = (continuous: boolean) => {\n if (note.trim()) onSubmit(note, continuous);\n };\n\n return (\n <GlassPanel\n variant=\"popover\"\n style={{ top: pos.top, left: pos.left }}\n >\n <div\n ref={panelRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Add annotation\"\n className=\"pa-popover-body\"\n >\n <div className=\"pa-popover-header\">\n <span className=\"pa-popover-selector\">{selectorLabel}</span>\n </div>\n\n {(selectedText || elementText) && (\n <div className=\"pa-popover-context\">\n {selectedText && (\n <p className=\"pa-popover-context-line\">\n <span className=\"pa-popover-context-label\">Selected</span>\n {selectedText}\n </p>\n )}\n {elementText && elementText !== selectedText && (\n <p className=\"pa-popover-context-line\">\n <span className=\"pa-popover-context-label\">Element</span>\n {elementText}\n </p>\n )}\n </div>\n )}\n\n <label className=\"pa-label\">\n Note\n <textarea\n ref={inputRef}\n className=\"pa-textarea\"\n value={note}\n onChange={(e) => setNote(e.target.value)}\n placeholder=\"Describe the change...\"\n rows={3}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) {\n e.preventDefault();\n handleSubmit(e.shiftKey);\n }\n if (e.key === 'Escape') onCancel();\n }}\n />\n </label>\n\n <p className=\"pa-popover-hint\">⌘↵ Add · ⇧⌘↵ Add &amp; next · Esc Cancel</p>\n\n <div className=\"pa-popover-actions\">\n <GlassButton variant=\"ghost\" onClick={onCancel}>\n Cancel\n </GlassButton>\n <GlassButton\n variant=\"ghost\"\n onClick={() => handleSubmit(true)}\n disabled={!note.trim()}\n >\n Add &amp; next\n </GlassButton>\n <GlassButton\n variant=\"glass-primary\"\n onClick={() => handleSubmit(false)}\n disabled={!note.trim()}\n >\n Add\n </GlassButton>\n </div>\n </div>\n </GlassPanel>\n );\n}\n","interface AreaRect {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\ninterface AreaSelectOverlayProps {\n area: AreaRect | null;\n isDragging: boolean;\n}\n\nexport function AreaSelectOverlay({ area, isDragging }: AreaSelectOverlayProps) {\n if (!area || area.width < 2 || area.height < 2) return null;\n\n return (\n <div\n className={`pa-area-select ${isDragging ? 'pa-area-select--dragging' : ''}`}\n style={{\n top: area.y,\n left: area.x,\n width: area.width,\n height: area.height,\n }}\n aria-hidden=\"true\"\n />\n );\n}","import type { AnnotationEntry } from '@pixelagent/shared';\nimport {\n getCssSelector,\n getDomPath,\n getEditableTextInfo,\n getNearestReactComponentName,\n getWindowSelectionText,\n readReactSource,\n} from '@pixelagent/shared';\n\nexport interface BuildAnnotationInput {\n elements: Element[];\n note: string;\n areaBbox?: { x: number; y: number; width: number; height: number };\n}\n\nexport function buildAnnotationEntry(input: BuildAnnotationInput): AnnotationEntry {\n const { elements, note, areaBbox } = input;\n const primary = elements[0];\n\n if (!primary && areaBbox) {\n return {\n id: crypto.randomUUID(),\n selector: 'area-selection',\n note: note.trim(),\n areaBbox,\n position: { x: Math.round(areaBbox.x), y: Math.round(areaBbox.y) },\n bbox: {\n x: Math.round(areaBbox.x),\n y: Math.round(areaBbox.y),\n width: Math.round(areaBbox.width),\n height: Math.round(areaBbox.height),\n },\n createdAt: Date.now(),\n };\n }\n\n if (!primary) {\n throw new Error('buildAnnotationEntry requires at least one element or areaBbox');\n }\n\n const rect = primary.getBoundingClientRect();\n const source = readReactSource(primary);\n const selectedText = getWindowSelectionText();\n const textInfo = getEditableTextInfo(primary);\n const elementText = textInfo.kind !== 'none' ? textInfo.value : undefined;\n const selectors = elements.map((el) => getCssSelector(el));\n\n return {\n id: crypto.randomUUID(),\n selector: selectors[0],\n selectors: selectors.length > 1 ? selectors : undefined,\n note: note.trim(),\n position: { x: Math.round(rect.x), y: Math.round(rect.y) },\n bbox: {\n x: Math.round(rect.x),\n y: Math.round(rect.y),\n width: Math.round(rect.width),\n height: Math.round(rect.height),\n },\n areaBbox,\n domPath: getDomPath(primary),\n selectedText,\n elementText,\n sourceFile: source.sourceFile,\n lineNumber: source.lineNumber,\n componentName: getNearestReactComponentName(primary) ?? source.componentName,\n createdAt: Date.now(),\n };\n}\n","import type { AnnotationEntry } from '@pixelagent/shared';\nimport { resolveElementFromEntry } from '@pixelagent/shared';\n\n/** Screen-space anchor for an annotation pin (live element preferred). */\nexport function getAnnotationAnchorRect(entry: AnnotationEntry): DOMRect | null {\n const el = resolveElementFromEntry(entry);\n if (el) return el.getBoundingClientRect();\n\n if (entry.bbox) {\n const { x, y, width, height } = entry.bbox;\n return new DOMRect(x, y, width, height);\n }\n\n if (entry.areaBbox) {\n const { x, y, width, height } = entry.areaBbox;\n return new DOMRect(x, y, width, height);\n }\n\n if (entry.position) {\n const { x, y } = entry.position;\n return new DOMRect(x, y, 1, 1);\n }\n\n return null;\n}\n\nexport function anchorRectKey(rect: DOMRect): string {\n return `${Math.round(rect.top)}:${Math.round(rect.left)}:${Math.round(rect.width)}:${Math.round(rect.height)}`;\n}\n","import { useEffect, useState } from 'react';\nimport type { AnnotationEntry } from '@pixelagent/shared';\nimport { resolveElementFromEntry } from '@pixelagent/shared';\nimport {\n anchorRectKey,\n getAnnotationAnchorRect,\n} from './annotationAnchor';\n\nexport interface AnnotationBadgePin {\n id: string;\n index: number;\n top: number;\n left: number;\n}\n\ninterface AnnotationBadgesOverlayProps {\n annotations: AnnotationEntry[];\n}\n\nconst STACK_OFFSET_PX = 20;\n\nexport function AnnotationBadgesOverlay({ annotations }: AnnotationBadgesOverlayProps) {\n const [pins, setPins] = useState<AnnotationBadgePin[]>([]);\n\n useEffect(() => {\n if (annotations.length === 0) {\n setPins([]);\n return;\n }\n\n const stackAtKey = new Map<string, number>();\n\n const update = () => {\n const next: AnnotationBadgePin[] = [];\n\n annotations.forEach((entry, i) => {\n const rect = getAnnotationAnchorRect(entry);\n if (!rect) return;\n\n const key = anchorRectKey(rect);\n const stack = stackAtKey.get(key) ?? 0;\n stackAtKey.set(key, stack + 1);\n\n next.push({\n id: entry.id,\n index: i + 1,\n top: rect.top - 6 - stack * STACK_OFFSET_PX,\n left: rect.right - 6,\n });\n });\n\n setPins(next);\n };\n\n update();\n\n const observed = new Set<Element>();\n for (const entry of annotations) {\n const el = resolveElementFromEntry(entry);\n if (el) observed.add(el);\n }\n\n const observers = Array.from(observed).map((el) => {\n const observer = new ResizeObserver(update);\n observer.observe(el);\n return observer;\n });\n\n window.addEventListener('scroll', update, true);\n window.addEventListener('resize', update);\n\n return () => {\n for (const observer of observers) observer.disconnect();\n window.removeEventListener('scroll', update, true);\n window.removeEventListener('resize', update);\n };\n }, [annotations]);\n\n if (pins.length === 0) return null;\n\n return (\n <>\n {pins.map((pin) => (\n <span\n key={pin.id}\n className=\"pa-annotation-badge\"\n style={{ top: pin.top, left: pin.left }}\n aria-hidden=\"true\"\n >\n {pin.index}\n </span>\n ))}\n </>\n );\n}\n","export const PA_OWN_SELECTOR =\n '[data-pixelagent-root],[data-pixelagent-toolbar-portal],[data-pixelagent-picker-portal]';\n\nexport function isPixelAgentElement(target: EventTarget | null): boolean {\n if (!(target instanceof Element)) return false;\n return !!target.closest(PA_OWN_SELECTOR);\n}\n\nexport function pickElementAt(x: number, y: number): Element | null {\n const elements = document.elementsFromPoint(x, y);\n return (\n elements.find(\n (el) => el instanceof Element && !el.closest(PA_OWN_SELECTOR)\n ) ?? null\n );\n}\n","import type { ReactNode } from 'react';\n\nexport function isCopyAllFeedback(status: string | null): boolean {\n if (!status) return false;\n return status === 'Copied all!' || status.startsWith('Copy failed');\n}\n\ninterface CopyFeedbackSlotProps {\n feedback: string | null;\n slotClassName: string;\n children: ReactNode;\n}\n\nexport function CopyFeedbackSlot({\n feedback,\n slotClassName,\n children,\n}: CopyFeedbackSlotProps) {\n if (feedback && isCopyAllFeedback(feedback)) {\n return (\n <span\n className={`pa-status pa-copy-feedback-slot ${slotClassName}`}\n role=\"status\"\n aria-live=\"polite\"\n >\n {feedback}\n </span>\n );\n }\n\n return <>{children}</>;\n}\n","import { useEffect, useState } from 'react';\nimport type { AnnotationEntry } from '@pixelagent/shared';\nimport { getAnnotationSessionDisplay } from '@pixelagent/shared';\nimport { GlassButton, GlassPanel } from '../glass';\nimport { CopyFeedbackSlot } from '../ui/CopyFeedbackSlot';\n\ninterface SessionPanelProps {\n annotations: AnnotationEntry[];\n collapsed: boolean;\n onToggleCollapsed: () => void;\n onClose: () => void;\n onCopyAll: () => void | Promise<void>;\n onCopyOne: (id: string) => void | Promise<void>;\n onRemove: (id: string) => void;\n onUpdate: (id: string, patch: Partial<AnnotationEntry>) => void;\n copyStatus: string | null;\n copiedEntryId: string | null;\n copyAllFrom: 'toolbar' | 'session' | null;\n}\n\nexport function SessionPanel({\n annotations,\n collapsed,\n onToggleCollapsed,\n onClose,\n onCopyAll,\n onCopyOne,\n onRemove,\n onUpdate,\n copyStatus,\n copiedEntryId,\n copyAllFrom,\n}: SessionPanelProps) {\n const [editingId, setEditingId] = useState<string | null>(null);\n const [draftNote, setDraftNote] = useState('');\n\n useEffect(() => {\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key !== 'Escape') return;\n if (collapsed) onClose();\n else onToggleCollapsed();\n };\n document.addEventListener('keydown', onKeyDown);\n return () => document.removeEventListener('keydown', onKeyDown);\n }, [collapsed, onClose, onToggleCollapsed]);\n\n const startEdit = (entry: AnnotationEntry) => {\n setEditingId(entry.id);\n setDraftNote(entry.note);\n };\n\n const saveEdit = (id: string) => {\n if (!draftNote.trim()) return;\n onUpdate(id, { note: draftNote.trim() });\n setEditingId(null);\n };\n\n return (\n <GlassPanel\n variant=\"sheet\"\n side=\"right\"\n className={collapsed ? 'pa-session-panel--collapsed' : undefined}\n >\n <div className=\"pa-session-header\">\n <div className=\"pa-session-header-main\">\n <GlassButton\n variant=\"ghost\"\n className=\"pa-glass-btn--sm pa-session-collapse-btn\"\n onClick={onToggleCollapsed}\n aria-expanded={!collapsed}\n aria-label={collapsed ? 'Expand session panel' : 'Collapse session panel'}\n >\n <span className=\"pa-session-chevron\" aria-hidden=\"true\">\n {collapsed ? '▶' : '▼'}\n </span>\n </GlassButton>\n <h3 className=\"pa-session-title\">Session ({annotations.length})</h3>\n </div>\n {!collapsed && (\n <p className=\"pa-session-subtitle\">Persists until tab close</p>\n )}\n <div className=\"pa-session-actions\">\n <CopyFeedbackSlot\n feedback={copyAllFrom === 'session' ? copyStatus : null}\n slotClassName=\"pa-copy-feedback-slot--session\"\n >\n <GlassButton\n variant=\"glass-primary\"\n className=\"pa-glass-btn--sm\"\n onClick={onCopyAll}\n disabled={annotations.length === 0}\n >\n Copy all\n </GlassButton>\n </CopyFeedbackSlot>\n <GlassButton variant=\"ghost\" onClick={onClose} aria-label=\"Close session panel\">\n ✕\n </GlassButton>\n </div>\n </div>\n\n {!collapsed && (\n <ul className=\"pa-session-list\">\n {annotations.length === 0 && (\n <li className=\"pa-session-empty\">\n No annotations yet. Click an element, drag an area, or Shift+click for multi-select.\n </li>\n )}\n {annotations.map((entry) => {\n const display = getAnnotationSessionDisplay(entry);\n return (\n <li key={entry.id} className=\"pa-session-item\">\n {editingId === entry.id ? (\n <div className=\"pa-session-edit\">\n <label className=\"pa-label\">\n Note\n <textarea\n className=\"pa-textarea\"\n value={draftNote}\n onChange={(e) => setDraftNote(e.target.value)}\n rows={3}\n />\n </label>\n <div className=\"pa-session-item-actions\">\n <GlassButton variant=\"ghost\" onClick={() => setEditingId(null)}>\n Cancel\n </GlassButton>\n <GlassButton\n variant=\"glass-primary\"\n onClick={() => saveEdit(entry.id)}\n disabled={!draftNote.trim()}\n >\n Save\n </GlassButton>\n </div>\n </div>\n ) : (\n <>\n <div className=\"pa-session-content\">\n <span className=\"pa-session-target\">{display.target}</span>\n <p className=\"pa-session-note\">{display.note}</p>\n {display.meta && (\n <p className=\"pa-session-meta-line\">{display.meta}</p>\n )}\n </div>\n <div className=\"pa-session-item-actions\">\n {copyStatus === 'Copied!' && copiedEntryId === entry.id ? (\n <span\n className=\"pa-status pa-copy-feedback-slot pa-copy-feedback-slot--item\"\n role=\"status\"\n aria-live=\"polite\"\n >\n Copied!\n </span>\n ) : (\n <GlassButton\n variant=\"glass-primary\"\n className=\"pa-glass-btn--sm\"\n onClick={() => onCopyOne(entry.id)}\n aria-label=\"Copy annotation\"\n >\n Copy\n </GlassButton>\n )}\n <GlassButton\n variant=\"ghost\"\n className=\"pa-glass-btn--sm\"\n onClick={() => startEdit(entry)}\n aria-label=\"Edit annotation note\"\n >\n ✎\n </GlassButton>\n <GlassButton\n variant=\"ghost\"\n className=\"pa-glass-btn--sm\"\n onClick={() => onRemove(entry.id)}\n aria-label=\"Remove annotation\"\n >\n ✕\n </GlassButton>\n </div>\n </>\n )}\n </li>\n );\n })}\n </ul>\n )}\n </GlassPanel>\n );\n}\n","export function SettingsIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M8 10.25a2.25 2.25 0 1 0 0-4.5 2.25 2.25 0 0 0 0 4.5Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.25\"\n />\n <path\n d=\"M12.1 9.2c.08-.42.08-.86 0-1.28l1.12-.87a.75.75 0 0 0 .18-.97l-1.06-1.84a.75.75 0 0 0-.92-.34l-1.32.53a5.2 5.2 0 0 0-1.1-.64l-.2-1.4A.75.75 0 0 0 8.9 2h-2.1a.75.75 0 0 0-.74.63l-.2 1.4c-.39.16-.76.37-1.1.64l-1.32-.53a.75.75 0 0 0-.92.34L1.56 6.08a.75.75 0 0 0 .18.97l1.12.87c-.08.42-.08.86 0 1.28l-1.12.87a.75.75 0 0 0-.18.97l1.06 1.84c.2.35.6.5.97.34l1.32-.53c.34.27.71.48 1.1.64l.2 1.4c.08.37.4.63.74.63h2.1c.37 0 .68-.28.74-.63l.2-1.4c.39-.16.76-.37 1.1-.64l1.32.53c.37.15.77 0 .97-.34l1.06-1.84a.75.75 0 0 0-.18-.97l-1.12-.87Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.1\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nexport function SunIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <circle cx=\"8\" cy=\"8\" r=\"2.75\" stroke=\"currentColor\" strokeWidth=\"1.25\" />\n <path\n d=\"M8 1.25v1.5M8 13.25v1.5M1.25 8h1.5M13.25 8h1.5M3.05 3.05l1.06 1.06M11.89 11.89l1.06 1.06M3.05 12.95l1.06-1.06M11.89 4.11l1.06-1.06\"\n stroke=\"currentColor\"\n strokeWidth=\"1.25\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n\nexport function MoonIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M11.2 9.4a4.25 4.25 0 0 1-5.6-5.6A4.75 4.75 0 1 0 11.2 9.4Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.25\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n","import { useEffect, useRef } from 'react';\nimport type { HostTheme, PixelAgentChrome } from '@pixelagent/shared';\nimport { GlassButton, GlassPanel } from '../glass';\nimport { MoonIcon, SunIcon } from './icons';\n\ninterface ToolbarSettingsMenuProps {\n open: boolean;\n onClose: () => void;\n hostTheme: HostTheme;\n chrome: PixelAgentChrome;\n onToggleHostTheme: () => void;\n}\n\nexport function ToolbarSettingsMenu({\n open,\n onClose,\n hostTheme,\n chrome,\n onToggleHostTheme,\n}: ToolbarSettingsMenuProps) {\n const panelRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!open) return;\n\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose();\n };\n\n const onPointerDown = (e: MouseEvent) => {\n const target = e.target as Node;\n if (panelRef.current?.contains(target)) return;\n if ((target as Element).closest?.('[data-pa-settings-trigger]')) return;\n onClose();\n };\n\n window.addEventListener('keydown', onKeyDown);\n window.addEventListener('mousedown', onPointerDown);\n return () => {\n window.removeEventListener('keydown', onKeyDown);\n window.removeEventListener('mousedown', onPointerDown);\n };\n }, [open, onClose]);\n\n if (!open) return null;\n\n return (\n <div ref={panelRef} className=\"pa-settings-menu\" role=\"dialog\" aria-label=\"PixelAgent settings\">\n <GlassPanel variant=\"popover\" className=\"pa-settings-menu-panel\">\n <div className=\"pa-settings-menu-inner\">\n <header className=\"pa-settings-menu-header\">\n <h4 className=\"pa-settings-menu-title\">Settings</h4>\n <p className=\"pa-settings-menu-subtitle\">Appearance and chrome</p>\n </header>\n\n <section className=\"pa-settings-section\">\n <span className=\"pa-settings-section-label\">Host theme</span>\n <div className=\"pa-settings-row\">\n <span className=\"pa-settings-row-value\">\n {hostTheme === 'dark' ? 'Dark canvas' : 'Light canvas'}\n </span>\n <GlassButton\n variant=\"icon\"\n onClick={onToggleHostTheme}\n aria-label={\n hostTheme === 'dark' ? 'Switch host to light theme' : 'Switch host to dark theme'\n }\n title={hostTheme === 'dark' ? 'Light theme' : 'Dark theme'}\n >\n {hostTheme === 'dark' ? <SunIcon /> : <MoonIcon />}\n </GlassButton>\n </div>\n </section>\n\n <section className=\"pa-settings-section\">\n <span className=\"pa-settings-section-label\">Glass chrome</span>\n <p className=\"pa-settings-hint\">\n {chrome === 'dim'\n ? 'Dim gray glass for readability on bright pages.'\n : 'Frosted glass for dark pages.'}\n {' '}\n (auto)\n </p>\n </section>\n </div>\n </GlassPanel>\n </div>\n );\n}\n","export type PixelAgentIconVariant = 'cursor' | 'pointer';\n\ninterface PixelAgentIconProps {\n /** Render size in CSS pixels (SVG scales via viewBox). */\n size?: number;\n /** `cursor` = minimal geometric pointer (default); `pointer` = classic arrow. */\n variant?: PixelAgentIconVariant;\n}\n\nconst VIEWBOX = '0 0 24 24';\n\n/** ShiftClick-style mark: square tail + right-triangle head (hotspot top-left). */\nfunction MinimalCursorMark() {\n return (\n <>\n <rect x=\"3\" y=\"14\" width=\"4\" height=\"4\" fill=\"currentColor\" />\n <path fill=\"currentColor\" d=\"M7 5h12v12L7 5z\" />\n </>\n );\n}\n\nconst CLASSIC_ARROW =\n 'M4.5 2.5L4.5 17.25L9.1 12.9L11.35 19.15L13.55 17.95L11.05 11.85L16.85 11.85L4.5 2.5Z';\n\n/** Toolbar brand — minimal cursor SVG, scales with `size`. */\nexport function PixelAgentIcon({ size = 22, variant = 'cursor' }: PixelAgentIconProps) {\n if (variant === 'pointer') {\n return (\n <svg\n className=\"pa-brand-cursor pa-brand-cursor--pointer\"\n width={size}\n height={size}\n viewBox={VIEWBOX}\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <path\n fill=\"currentColor\"\n d={CLASSIC_ARROW}\n />\n </svg>\n );\n }\n\n return (\n <svg\n className=\"pa-brand-cursor pa-brand-cursor--minimal\"\n width={size}\n height={size}\n viewBox={VIEWBOX}\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <MinimalCursorMark />\n </svg>\n );\n}\n","import { createPortal } from 'react-dom';\nimport type { AnnotateCaptureMode, HostTheme, PixelAgentChrome } from '@pixelagent/shared';\nimport type { PixelAgentMode } from '../PixelAgent';\nimport { GlassButton, GlassSurface } from '../glass';\nimport { useDraggable } from '../hooks/useDraggable';\nimport { SettingsIcon } from '../ui/icons';\nimport { ToolbarSettingsMenu } from '../ui/ToolbarSettingsMenu';\nimport { CopyFeedbackSlot, isCopyAllFeedback } from '../ui/CopyFeedbackSlot';\nimport { PixelAgentIcon } from './PixelAgentIcon';\n\ninterface ToolbarProps {\n rootAttributes: Record<string, string>;\n hostTheme: HostTheme;\n chrome: PixelAgentChrome;\n settingsOpen: boolean;\n onToggleSettings: () => void;\n onCloseSettings: () => void;\n onToggleHostTheme: () => void;\n active: boolean;\n mode: PixelAgentMode;\n captureMode: AnnotateCaptureMode;\n annotationCount: number;\n multiSelectCount: number;\n copyStatus: string | null;\n copyAllFrom: 'toolbar' | 'session' | null;\n onActivateAnnotate: () => void;\n onActivateEdit: () => void;\n onDeactivate: () => void;\n onCopyAll: () => void;\n onCaptureModeChange: (mode: AnnotateCaptureMode) => void;\n onConfirmMultiSelect: () => void;\n}\n\nconst CAPTURE_OPTIONS: AnnotateCaptureMode[] = ['element', 'area', 'multi'];\n\nconst CAPTURE_LABELS: Record<AnnotateCaptureMode, string> = {\n element: 'Click',\n area: 'Area',\n multi: 'Multi',\n};\n\nexport function Toolbar({\n rootAttributes,\n hostTheme,\n chrome,\n settingsOpen,\n onToggleSettings,\n onCloseSettings,\n onToggleHostTheme,\n active,\n mode,\n captureMode,\n annotationCount,\n multiSelectCount,\n copyStatus,\n copyAllFrom,\n onActivateAnnotate,\n onActivateEdit,\n onDeactivate,\n onCopyAll,\n onCaptureModeChange,\n onConfirmMultiSelect,\n}: ToolbarProps) {\n const { elementRef, isDragging, style, dragHandleProps } = useDraggable();\n const toolbar = (\n <div\n ref={elementRef}\n className={`pa-toolbar-float ${isDragging ? 'pa-toolbar-float--dragging' : ''}`}\n style={style}\n role=\"toolbar\"\n aria-label=\"PixelAgent\"\n >\n {!active && (\n <ToolbarSettingsMenu\n open={settingsOpen}\n onClose={onCloseSettings}\n hostTheme={hostTheme}\n chrome={chrome}\n onToggleHostTheme={onToggleHostTheme}\n />\n )}\n\n <GlassSurface shape=\"capsule\" className=\"pa-toolbar-glass\" intensity=\"enhanced\">\n <div className=\"pa-toolbar-inner\">\n <button\n type=\"button\"\n className=\"pa-toolbar-drag\"\n aria-label=\"Drag PixelAgent toolbar\"\n title=\"Drag to move\"\n {...dragHandleProps}\n >\n <PixelAgentIcon size={22} />\n </button>\n\n <span className=\"pa-toolbar-divider\" aria-hidden=\"true\" />\n\n {!active ? (\n <div className=\"pa-toolbar-segment\">\n <GlassButton onClick={onActivateAnnotate}>Annotate</GlassButton>\n <GlassButton onClick={onActivateEdit}>Edit</GlassButton>\n </div>\n ) : (\n <>\n <div className=\"pa-toolbar-segment\">\n <span className=\"pa-mode-badge\">{mode}</span>\n {mode === 'annotate' && (\n <>\n <select\n className=\"pa-select pa-toolbar-capture-select\"\n value={captureMode}\n onChange={(e) =>\n onCaptureModeChange(e.target.value as AnnotateCaptureMode)\n }\n aria-label=\"Capture mode\"\n >\n {CAPTURE_OPTIONS.map((option) => (\n <option key={option} value={option}>\n {CAPTURE_LABELS[option]}\n </option>\n ))}\n </select>\n {multiSelectCount > 0 && (\n <GlassButton\n variant=\"glass-primary\"\n onClick={onConfirmMultiSelect}\n aria-label=\"Annotate selected elements\"\n >\n {multiSelectCount}\n </GlassButton>\n )}\n <CopyFeedbackSlot\n feedback={\n copyAllFrom === 'toolbar' ? copyStatus : null\n }\n slotClassName=\"pa-copy-feedback-slot--toolbar\"\n >\n <GlassButton\n variant=\"glass-primary\"\n onClick={onCopyAll}\n disabled={annotationCount === 0}\n aria-label={\n annotationCount > 0\n ? `Copy all annotations (${annotationCount})`\n : 'Copy all annotations'\n }\n >\n {annotationCount > 0 ? `Copy (${annotationCount})` : 'Copy'}\n </GlassButton>\n </CopyFeedbackSlot>\n </>\n )}\n </div>\n\n <GlassButton\n variant=\"icon\"\n className=\"pa-toolbar-close\"\n onClick={onDeactivate}\n aria-label=\"Close\"\n >\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M3 3L11 11M11 3L3 11\"\n stroke=\"currentColor\"\n strokeWidth=\"1.75\"\n strokeLinecap=\"round\"\n />\n </svg>\n </GlassButton>\n </>\n )}\n\n {!active && (\n <>\n <span className=\"pa-toolbar-divider\" aria-hidden=\"true\" />\n\n <GlassButton\n variant=\"icon\"\n className=\"pa-toolbar-settings\"\n data-pa-settings-trigger\n onClick={onToggleSettings}\n aria-label=\"PixelAgent settings\"\n aria-expanded={settingsOpen}\n title=\"Settings\"\n >\n <SettingsIcon />\n </GlassButton>\n </>\n )}\n\n {copyStatus && !isCopyAllFeedback(copyStatus) && copyStatus !== 'Copied!' && (\n <span className=\"pa-status pa-toolbar-status\" role=\"status\">\n {copyStatus}\n </span>\n )}\n </div>\n </GlassSurface>\n </div>\n );\n\n if (typeof document === 'undefined') return toolbar;\n return createPortal(\n <div\n className=\"pa-root pa-root--toolbar-portal\"\n data-pixelagent-toolbar-portal\n {...rootAttributes}\n >\n {toolbar}\n </div>,\n document.body\n );\n}\n","import { useCallback, useEffect, useRef, useState } from 'react';\nimport type { AnnotationEntry } from '@pixelagent/shared';\nimport { loadAnnotationSession, saveAnnotationSession } from '@pixelagent/shared';\n\nexport function useAnnotationSession() {\n const restored = useRef(loadAnnotationSession());\n const [annotations, setAnnotations] = useState<AnnotationEntry[]>(\n () => restored.current?.annotations ?? []\n );\n\n useEffect(() => {\n saveAnnotationSession({ annotations });\n }, [annotations]);\n\n const updateAnnotation = useCallback((id: string, patch: Partial<AnnotationEntry>) => {\n setAnnotations((prev) =>\n prev.map((entry) => (entry.id === id ? { ...entry, ...patch } : entry))\n );\n }, []);\n\n const removeAnnotation = useCallback((id: string) => {\n setAnnotations((prev) => prev.filter((entry) => entry.id !== id));\n }, []);\n\n return {\n annotations,\n setAnnotations,\n updateAnnotation,\n removeAnnotation,\n };\n}\n","import { useCallback, useEffect, useMemo, useState } from 'react';\nimport {\n applyHostThemeToDocument,\n DEFAULT_PIXEL_AGENT_UI_SETTINGS,\n pixelAgentRootAttributes,\n readHostThemeFromDocument,\n resolvePixelAgentChrome,\n type HostTheme,\n type PixelAgentUiSettings,\n} from '@pixelagent/shared';\n\nexport interface UsePixelAgentUiOptions {\n ui?: PixelAgentUiSettings;\n hostTheme?: HostTheme;\n onHostThemeChange?: (theme: HostTheme) => void;\n}\n\nexport function usePixelAgentUi({\n ui,\n hostTheme: controlledHostTheme,\n onHostThemeChange,\n}: UsePixelAgentUiOptions) {\n const mergedUi = useMemo(\n () => ({ ...DEFAULT_PIXEL_AGENT_UI_SETTINGS, ...ui }),\n [ui]\n );\n\n const [internalHostTheme, setInternalHostTheme] = useState<HostTheme>(\n () => controlledHostTheme ?? readHostThemeFromDocument(mergedUi) ?? 'dark'\n );\n\n const [settingsOpen, setSettingsOpen] = useState(false);\n\n const hostTheme = controlledHostTheme ?? internalHostTheme;\n\n useEffect(() => {\n if (controlledHostTheme !== undefined) return;\n\n const sync = () => {\n const read = readHostThemeFromDocument(mergedUi);\n if (read) setInternalHostTheme(read);\n };\n\n sync();\n const attr = mergedUi.hostThemeAttribute;\n const observer = new MutationObserver(sync);\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: [attr],\n });\n return () => observer.disconnect();\n }, [controlledHostTheme, mergedUi]);\n\n const chrome = useMemo(\n () => resolvePixelAgentChrome(mergedUi, hostTheme),\n [mergedUi, hostTheme]\n );\n\n const toggleHostTheme = useCallback(() => {\n const next: HostTheme = hostTheme === 'dark' ? 'light' : 'dark';\n if (onHostThemeChange) {\n onHostThemeChange(next);\n return;\n }\n setInternalHostTheme(next);\n applyHostThemeToDocument(next, mergedUi);\n }, [hostTheme, onHostThemeChange, mergedUi]);\n\n const toggleSettings = useCallback(() => {\n setSettingsOpen((open) => !open);\n }, []);\n\n return {\n chrome,\n rootAttributes: pixelAgentRootAttributes(chrome),\n hostTheme,\n toggleHostTheme,\n settingsOpen,\n setSettingsOpen,\n toggleSettings,\n uiSettings: mergedUi,\n };\n}\n","import { useCallback, useEffect, useRef, useState } from 'react';\nimport type {\n AnnotateCaptureMode,\n ApplyPayload,\n ApplyVisualDiffResult,\n ElementState,\n HostTheme,\n PixelAgentUiSettings,\n TargetScope,\n} from '@pixelagent/shared';\nimport {\n copyToClipboard,\n detectStylingSystem,\n formatAllAnnotations,\n formatAnnotation,\n countElementInstances,\n getScopeSelector,\n getElementsInArea,\n readReactSource,\n} from '@pixelagent/shared';\nimport { EditPanel } from './edit/EditPanel';\nimport { submitApply } from './edit/submitApply';\nimport { AnnotationPopover } from './annotate/AnnotationPopover';\nimport { AreaSelectOverlay } from './annotate/AreaSelectOverlay';\nimport { buildAnnotationEntry } from './annotate/buildAnnotationEntry';\nimport { AnnotationBadgesOverlay } from './annotate/AnnotationBadgesOverlay';\nimport { ElementOverlay } from './annotate/ElementOverlay';\nimport { isPixelAgentElement, pickElementAt, PA_OWN_SELECTOR } from './annotate/pickElement';\nimport { SessionPanel } from './annotate/SessionPanel';\nimport { Toolbar } from './shadow/Toolbar';\nimport { useAnnotationSession } from './hooks/useAnnotationSession';\nimport { usePixelAgentUi } from './ui/usePixelAgentUi';\nimport './styles/pixelagent.css';\n\nexport type PixelAgentMode = 'annotate' | 'edit' | 'idle';\n\nexport interface PixelAgentProps {\n /** Glass chrome + host theme sync; extend as new UI knobs ship. */\n ui?: PixelAgentUiSettings;\n /** Controlled host page theme (e.g. demo `data-theme`). */\n hostTheme?: HostTheme;\n onHostThemeChange?: (theme: HostTheme) => void;\n /**\n * Explicit POST endpoint for Apply. When unset, the component auto-probes\n * the standard Vite plugin path (`/__pixelagent/apply`) at mount; if that\n * fails it falls back to clipboard.\n */\n applyEndpoint?: string;\n /** Custom transport. Takes precedence over `applyEndpoint`. */\n onApply?: (payload: ApplyPayload) => Promise<ApplyVisualDiffResult | null>;\n}\n\nconst AUTO_APPLY_PATH = '/__pixelagent/apply';\n\ninterface AreaDragState {\n startX: number;\n startY: number;\n currentX: number;\n currentY: number;\n}\n\ninterface PendingAnnotation {\n elements: Element[];\n areaBbox?: { x: number; y: number; width: number; height: number };\n}\n\nfunction normalizeAreaRect(drag: AreaDragState) {\n const x = Math.min(drag.startX, drag.currentX);\n const y = Math.min(drag.startY, drag.currentY);\n const width = Math.abs(drag.currentX - drag.startX);\n const height = Math.abs(drag.currentY - drag.startY);\n return { x, y, width, height };\n}\n\nexport function PixelAgent({\n ui,\n hostTheme,\n onHostThemeChange,\n applyEndpoint,\n onApply,\n}: PixelAgentProps = {}) {\n const pixelAgentUi = usePixelAgentUi({ ui, hostTheme, onHostThemeChange });\n const [autoEndpoint, setAutoEndpoint] = useState<string | null>(null);\n\n // Auto-probe the Vite plugin endpoint. The plugin returns 405 for non-POST,\n // which uniquely confirms the middleware is mounted. 404 / network error → skip.\n useEffect(() => {\n if (applyEndpoint || onApply) return;\n let cancelled = false;\n fetch(AUTO_APPLY_PATH, { method: 'GET' })\n .then((res) => {\n if (!cancelled && res.status === 405) setAutoEndpoint(AUTO_APPLY_PATH);\n })\n .catch(() => {\n /* no plugin — clipboard fallback */\n });\n return () => {\n cancelled = true;\n };\n }, [applyEndpoint, onApply]);\n const [active, setActive] = useState(false);\n const [mode, setMode] = useState<PixelAgentMode>('idle');\n const [captureMode, setCaptureMode] = useState<AnnotateCaptureMode>('element');\n const {\n annotations,\n setAnnotations,\n updateAnnotation,\n removeAnnotation,\n } = useAnnotationSession();\n\n const [hoveredElement, setHoveredElement] = useState<Element | null>(null);\n const [selectedElement, setSelectedElement] = useState<Element | null>(null);\n const [multiSelected, setMultiSelected] = useState<Element[]>([]);\n const [pendingAnnotation, setPendingAnnotation] = useState<PendingAnnotation | null>(null);\n const [areaDrag, setAreaDrag] = useState<AreaDragState | null>(null);\n const [sessionDismissed, setSessionDismissed] = useState(false);\n const [sessionCollapsed, setSessionCollapsed] = useState(false);\n\n const sessionVisible =\n active && mode === 'annotate' && annotations.length > 0 && !sessionDismissed;\n const [targetScope, setTargetScope] = useState<TargetScope>('this-instance');\n const [elementState, setElementState] = useState<ElementState>('normal');\n const [copyStatus, setCopyStatus] = useState<string | null>(null);\n const [copiedEntryId, setCopiedEntryId] = useState<string | null>(null);\n const [copyAllFrom, setCopyAllFrom] = useState<'toolbar' | 'session' | null>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const copyStatusTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const showCopyStatus = useCallback(\n (message: string, options?: { entryId?: string; copyAllFrom?: 'toolbar' | 'session' }) => {\n if (copyStatusTimer.current) clearTimeout(copyStatusTimer.current);\n setCopyStatus(message);\n setCopiedEntryId(options?.entryId ?? null);\n setCopyAllFrom(options?.copyAllFrom ?? null);\n copyStatusTimer.current = setTimeout(() => {\n setCopyStatus(null);\n setCopiedEntryId(null);\n setCopyAllFrom(null);\n }, 2500);\n },\n []\n );\n\n const copyText = useCallback(\n async (\n text: string,\n successMessage: string,\n options?: { entryId?: string; copyAllFrom?: 'toolbar' | 'session' }\n ) => {\n if (!text) return;\n try {\n await copyToClipboard(text);\n showCopyStatus(successMessage, options);\n } catch {\n showCopyStatus('Copy failed — check clipboard permissions', options);\n }\n },\n [showCopyStatus]\n );\n\n const openAnnotationPopover = useCallback(\n (elements: Element[], areaBbox?: PendingAnnotation['areaBbox']) => {\n if (elements.length === 0 && !areaBbox) return;\n setPendingAnnotation({ elements, areaBbox });\n setSelectedElement(elements[0] ?? null);\n },\n []\n );\n\n const handleMouseMove = useCallback(\n (e: MouseEvent) => {\n if (!active || mode !== 'annotate' || isPixelAgentElement(e.target)) return;\n\n if (areaDrag) {\n setAreaDrag((prev) =>\n prev ? { ...prev, currentX: e.clientX, currentY: e.clientY } : prev\n );\n return;\n }\n\n if (captureMode !== 'area') {\n setHoveredElement(pickElementAt(e.clientX, e.clientY));\n }\n },\n [active, mode, areaDrag, captureMode]\n );\n\n const handleMouseDown = useCallback(\n (e: MouseEvent) => {\n if (!active || mode !== 'annotate' || isPixelAgentElement(e.target)) return;\n if (captureMode !== 'area' || e.button !== 0) return;\n\n e.preventDefault();\n e.stopPropagation();\n setAreaDrag({\n startX: e.clientX,\n startY: e.clientY,\n currentX: e.clientX,\n currentY: e.clientY,\n });\n setPendingAnnotation(null);\n },\n [active, mode, captureMode]\n );\n\n const handleMouseUp = useCallback(() => {\n if (!areaDrag) return;\n\n const area = normalizeAreaRect(areaDrag);\n setAreaDrag(null);\n\n if (area.width < 8 || area.height < 8) return;\n\n const elements = getElementsInArea(area, PA_OWN_SELECTOR);\n openAnnotationPopover(elements, area);\n }, [areaDrag, openAnnotationPopover]);\n\n const handleClick = useCallback(\n (e: MouseEvent) => {\n if (!active || mode !== 'annotate' || isPixelAgentElement(e.target)) return;\n if (captureMode === 'area') return;\n\n e.preventDefault();\n e.stopPropagation();\n\n const target = pickElementAt(e.clientX, e.clientY);\n if (!target) return;\n\n if (e.shiftKey || captureMode === 'multi') {\n setMultiSelected((prev) => {\n const exists = prev.includes(target);\n return exists ? prev.filter((el) => el !== target) : [...prev, target];\n });\n setSelectedElement(target);\n return;\n }\n\n const elements = multiSelected.length > 0 ? multiSelected : [target];\n openAnnotationPopover(elements.includes(target) ? elements : [target]);\n },\n [active, mode, captureMode, multiSelected, openAnnotationPopover]\n );\n\n useEffect(() => {\n if (!selectedElement || targetScope !== 'all-instances') return;\n if (countElementInstances(selectedElement) <= 1) {\n setTargetScope('this-instance');\n }\n }, [selectedElement, targetScope]);\n\n useEffect(() => {\n if (!active) return;\n\n document.addEventListener('mousemove', handleMouseMove, true);\n document.addEventListener('mousedown', handleMouseDown, true);\n document.addEventListener('mouseup', handleMouseUp, true);\n document.addEventListener('click', handleClick, true);\n\n return () => {\n document.removeEventListener('mousemove', handleMouseMove, true);\n document.removeEventListener('mousedown', handleMouseDown, true);\n document.removeEventListener('mouseup', handleMouseUp, true);\n document.removeEventListener('click', handleClick, true);\n };\n }, [active, handleMouseMove, handleMouseDown, handleMouseUp, handleClick]);\n\n const addAnnotation = useCallback(\n (note: string, continuous: boolean) => {\n if (!pendingAnnotation || !note.trim()) return;\n\n const { elements, areaBbox } = pendingAnnotation;\n if (elements.length === 0 && !areaBbox) return;\n\n const entry = buildAnnotationEntry({\n elements,\n note,\n areaBbox,\n });\n\n setAnnotations((prev) => [...prev, entry]);\n setSessionDismissed(false);\n setSessionCollapsed(false);\n\n if (continuous) {\n setPendingAnnotation(null);\n setSelectedElement(null);\n } else {\n setPendingAnnotation(null);\n setSelectedElement(null);\n setMultiSelected([]);\n }\n },\n [pendingAnnotation, setAnnotations]\n );\n\n const cancelAnnotation = useCallback(() => {\n setPendingAnnotation(null);\n setSelectedElement(null);\n }, []);\n\n const copyAllAnnotations = useCallback(\n async (from: 'toolbar' | 'session') => {\n const markdown = formatAllAnnotations(annotations);\n await copyText(markdown, 'Copied all!', { copyAllFrom: from });\n },\n [annotations, copyText]\n );\n\n const copyOneAnnotation = useCallback(\n async (id: string) => {\n const entry = annotations.find((a) => a.id === id);\n if (!entry) return;\n await copyText(formatAnnotation(entry), 'Copied!', { entryId: id });\n },\n [annotations, copyText]\n );\n\n const handleApply = useCallback(\n async (pendingByElement: Map<Element, ApplyPayload['changes']>) => {\n const entries = Array.from(pendingByElement.entries()).filter(\n ([, changes]) => changes.length > 0\n );\n if (entries.length === 0) return;\n\n const effectiveEndpoint = applyEndpoint ?? autoEndpoint ?? undefined;\n const results = [];\n for (const [element, changes] of entries) {\n const source = readReactSource(element);\n const payload: ApplyPayload = {\n schemaVersion: 1,\n elementSelector: getScopeSelector(element, targetScope),\n sourceFile: source.sourceFile,\n lineNumber: source.lineNumber,\n targetScope,\n state: elementState,\n stylingSystem: detectStylingSystem(element),\n changes,\n };\n results.push(await submitApply(payload, { applyEndpoint: effectiveEndpoint, onApply }));\n }\n\n const allApplied = results.every(\n (r) =>\n r.mode === 'mcp' && r.result.success && r.result.linesChanged.length > 0\n );\n showCopyStatus(allApplied ? 'Change applied' : 'Apply failed');\n\n // Surface per-payload detail to the console for debugging.\n results.forEach((r, i) => {\n if (r.mode === 'error') console.error(`[pixelagent] Apply #${i} failed:`, r.message);\n else if (r.mode === 'clipboard')\n console.warn(`[pixelagent] Apply #${i} fell back to clipboard`);\n else if (r.mode === 'mcp' && !r.result.success)\n console.warn(`[pixelagent] Apply #${i} reported no changes:`, r.result);\n });\n },\n [targetScope, elementState, applyEndpoint, autoEndpoint, onApply, showCopyStatus]\n );\n\n const activateMode = (nextMode: PixelAgentMode) => {\n pixelAgentUi.setSettingsOpen(false);\n setActive(true);\n setMode(nextMode);\n setSelectedElement(null);\n setHoveredElement(null);\n setPendingAnnotation(null);\n setMultiSelected([]);\n setAreaDrag(null);\n if (nextMode === 'annotate') setSessionDismissed(false);\n };\n\n const deactivate = () => {\n setActive(false);\n setMode('idle');\n setSelectedElement(null);\n setHoveredElement(null);\n setPendingAnnotation(null);\n setMultiSelected([]);\n setAreaDrag(null);\n setSessionDismissed(false);\n setSessionCollapsed(false);\n };\n\n const areaRect = areaDrag ? normalizeAreaRect(areaDrag) : null;\n\n return (\n <div\n ref={containerRef}\n className=\"pa-root\"\n data-pixelagent-root\n {...pixelAgentUi.rootAttributes}\n >\n <Toolbar\n rootAttributes={pixelAgentUi.rootAttributes}\n hostTheme={pixelAgentUi.hostTheme}\n chrome={pixelAgentUi.chrome}\n settingsOpen={pixelAgentUi.settingsOpen}\n onToggleSettings={pixelAgentUi.toggleSettings}\n onCloseSettings={() => pixelAgentUi.setSettingsOpen(false)}\n onToggleHostTheme={pixelAgentUi.toggleHostTheme}\n active={active}\n mode={mode}\n captureMode={captureMode}\n annotationCount={annotations.length}\n multiSelectCount={multiSelected.length}\n copyStatus={copyStatus}\n copyAllFrom={copyAllFrom}\n onActivateAnnotate={() => activateMode('annotate')}\n onActivateEdit={() => activateMode('edit')}\n onDeactivate={deactivate}\n onCopyAll={() => copyAllAnnotations('toolbar')}\n onCaptureModeChange={setCaptureMode}\n onConfirmMultiSelect={() => {\n if (multiSelected.length > 0) openAnnotationPopover(multiSelected);\n }}\n />\n\n {active && mode === 'annotate' && (\n <>\n <ElementOverlay\n element={hoveredElement}\n selected={selectedElement}\n multiSelected={multiSelected}\n />\n <AnnotationBadgesOverlay annotations={annotations} />\n <AreaSelectOverlay area={areaRect} isDragging={!!areaDrag} />\n </>\n )}\n\n {active && mode === 'annotate' && pendingAnnotation && (\n <AnnotationPopover\n elements={pendingAnnotation.elements}\n areaBbox={pendingAnnotation.areaBbox}\n onSubmit={addAnnotation}\n onCancel={cancelAnnotation}\n />\n )}\n\n {active && mode === 'edit' && (\n <EditPanel\n selectedElement={selectedElement}\n hoveredElement={hoveredElement}\n onSelectElement={setSelectedElement}\n onHoverElement={setHoveredElement}\n targetScope={targetScope}\n onTargetScopeChange={setTargetScope}\n elementState={elementState}\n onElementStateChange={setElementState}\n onApply={handleApply}\n applyStatus={mode === 'edit' ? copyStatus : null}\n isToolbarTarget={isPixelAgentElement}\n />\n )}\n\n {sessionVisible && (\n <SessionPanel\n annotations={annotations}\n collapsed={sessionCollapsed}\n onToggleCollapsed={() => setSessionCollapsed((c) => !c)}\n onClose={() => {\n setSessionDismissed(true);\n setSessionCollapsed(false);\n }}\n onCopyAll={() => copyAllAnnotations('session')}\n onCopyOne={copyOneAnnotation}\n onRemove={removeAnnotation}\n onUpdate={updateAnnotation}\n copyStatus={copyStatus}\n copiedEntryId={copiedEntryId}\n copyAllFrom={copyAllFrom}\n />\n )}\n </div>\n );\n}\n\nexport { PixelAgent as default };\n","import { PixelAgent } from './PixelAgent';\n\nexport { PixelAgent };\nexport type { PixelAgentMode, PixelAgentProps } from './PixelAgent';\nexport type { PixelAgentIconVariant } from './shadow/PixelAgentIcon';\n\nexport function isDevEnvironment(): boolean {\n return typeof process !== 'undefined' && process.env.NODE_ENV !== 'production';\n}\n\n/**\n * Dev-only wrapper. Renders null in production builds.\n */\nexport function PixelAgentDev() {\n if (!isDevEnvironment()) return null;\n return <PixelAgent />;\n}\n\nexport * from '@pixelagent/shared';\n"],"names":["ElementOverlay","element","selected","multiSelected","primarySelected","highlights","setHighlights","useState","primary","useEffect","targets","scopeMode","el","update","isSelected","getElementDisplayLabel","observers","observer","tooltipAnchor","h","selectedCount","jsxs","Fragment","item","index","jsx","REFRACTION_GAIN_DEFAULT","REFRACTION_GAIN_ENHANCED","generateLiquidGlassMap","width","height","borderRadiusPx","refractionGain","dpi","w","canvas","ctx","imageData","data","r","hx","hy","sdfRadius","maxScale","raw","ri","y","x","ux","uy","sdf","roundedRectSDF","d","smoothStep","scaled","dx","dy","pi","i","rEnc","gEnc","hw","hh","qx","qy","a","b","t","supportsBackdropSvgRefraction","ua","FROST_BACKDROP","frostBackdropStyle","filterId","intensity","frost","value","filterCounter","GlassSurface","shape","cornerRadius","tint","className","style","children","radius","surfaceRef","useRef","useMemo","map","setMap","useLayoutEffect","raf","rect","effectiveRadius","result","filterPortal","createPortal","GlassButton","variant","props","GlassPanel","side","useDraggable","defaultPosition","computeDefaultPosition","position","setPosition","isDragging","setIsDragging","dragRef","elementRef","initDefaultPosition","useCallback","onResize","prev","onPointerDown","e","origin","onPointerMove","onPointerUp","IconUndo","IconReset","clamp","n","min","max","parseCssColor","trimmed","hex6","hex3","g","rgb","rgbToHex","rgbToCss","rgbToHsv","rn","gn","bn","s","v","hsvToRgb","sn","vn","c","m","rp","gp","bp","hue","hsvFromCss","formatHexInput","parseHexInput","fallback","cleaned","cssFromHsv","hsv","pointerPercent","clientX","clientY","clamp01","getPickerPortalRootAttributes","root","chrome","ColorPickerPopover","label","onChange","open","setOpen","setHsv","triggerRef","popoverRef","sbRef","listboxId","useId","pos","setPos","hex","preview","headerLabel","updateHsv","next","updateRgb","reposition","left","top","estimatedHeight","onDocPointer","_a","_b","onKey","handleSbPointer","startSbDrag","onMove","ev","onUp","popover","channel","clamp01Channel","EditSection","title","defaultOpen","badge","FONT_FAMILY_PRESETS","PLACEHOLDER_VALUE","primaryFontName","fontFamily","resolveFontFamilySelectValue","exact","p","partial","presetPrimary","FontFamilySelect","selectValue","options","FONT_FAMILY_PLACEHOLDER","opt","parsePx","match","parseOpacity","hasPositiveBorderWidth","uniform","parseUniformPx","single","parts","parsed","first","PROP_CONTROLS","sliderValueForProperty","_property","cssValue","config","formatSliderValue","num","PropertyField","property","compact","numeric","useSlider","rowClass","labelClass","step","handleSlider","parseShorthand","formatShorthand","right","bottom","displayNum","normalizeWrite","formatPairDisplay","parsePairCommit","ICON_SIZE","ICON_PROPS","IconHorizontalPair","IconVerticalPair","IconSide","edges","IconExpand","Cell","icon","display","ariaLabel","mixed","onCommit","draft","setDraft","SpacingField","sides","showSplit","setShowSplit","writeSides","horizontalMixed","verticalMixed","SegmentedControl","MultiSegmentedControl","onToggle","IconAlignLeft","IconAlignCenter","IconAlignRight","IconAlignJustify","IconStrikethrough","isBoldWeight","toggleBoldWeight","isItalicStyle","toggleItalicStyle","hasTextDecoration","token","toggleTextDecoration","normalizeTextAlign","BORDER_STYLE_OPTIONS","DISPLAY_OPTIONS","FLEX_GRID_DISPLAYS","EditPropertiesPanel","values","onPropertyChange","textKind","textValue","onTextChange","targetScope","onTargetScopeChange","elementState","onElementStateChange","instanceCount","scopeHint","stateHint","fontWeight","fontStyle","textDecoration","textAlign","displayValue","showDisplay","showGap","displayOptions","rawGap","gapValue","borderStyle","borderStyleOptions","id","ColorField","MAX_UNDO","STYLE_PROP_KEYS","useEditPreview","selectedElement","targetsRef","touchedRef","initialInlineRef","initialTextRef","undoStackRef","setValues","originalValues","setOriginalValues","setTextKind","setTextValue","originalText","setOriginalText","pendingByElement","setPendingByElement","canUndo","setCanUndo","captureFrame","elements","captureInlineStyles","captureTextSnapshot","pushUndo","syncTargets","reapplyPending","prevTouched","restoreInlineStyles","restoreTextSnapshot","getPreviewTargets","clearTailwindStatePreview","applyTailwindStatePreview","currentPending","change","setEditableTextPreview","styles","getRelevantComputedStyles","textInfo","getEditableTextInfo","upsertChange","oldValue","newValue","filtered","updateProperty","batch","prop","val","updateText","undo","frame","reset","revertPreviews","clearPreviews","totalPendingCount","arr","clearAllPending","EditPanel","hoveredElement","onSelectElement","onHoverElement","onApply","applyStatus","isToolbarTarget","onPreviewApi","pendingChanges","panelRef","dragHandleProps","handleMouseMove","target","handleClick","handleApply","source","readReactSource","stylingSystem","detectStylingSystem","countElementInstances","scopeSelector","getScopeSelector","scopeMatchedElements","getCssSelector","submitApply","payload","error","endpoint","res","copyToClipboard","useElementRect","setRect","VIEWPORT_MARGIN","ANCHOR_GAP","TOOLBAR_PAD","DEFAULT_PANEL_WIDTH","DEFAULT_PANEL_HEIGHT","positionToBox","boxesOverlap","inflateRect","pad","getToolbarObstacle","toolbar","clampHorizontal","panelWidth","clampVertical","panelHeight","fitsViewport","box","isValidPlacement","obstacle","computeAnnotationPopoverPosition","anchorRect","candidates","AnnotationPopover","areaBbox","onSubmit","onCancel","note","setNote","inputRef","elementRect","selectedText","getWindowSelectionText","elementText","onKeyDown","selectorLabel","handleSubmit","continuous","AreaSelectOverlay","area","buildAnnotationEntry","input","selectors","getDomPath","getNearestReactComponentName","getAnnotationAnchorRect","entry","resolveElementFromEntry","anchorRectKey","STACK_OFFSET_PX","AnnotationBadgesOverlay","annotations","pins","setPins","stackAtKey","key","stack","observed","pin","PA_OWN_SELECTOR","isPixelAgentElement","pickElementAt","isCopyAllFeedback","status","CopyFeedbackSlot","feedback","slotClassName","SessionPanel","collapsed","onToggleCollapsed","onClose","onCopyAll","onCopyOne","onRemove","onUpdate","copyStatus","copiedEntryId","copyAllFrom","editingId","setEditingId","draftNote","setDraftNote","startEdit","saveEdit","getAnnotationSessionDisplay","SettingsIcon","SunIcon","MoonIcon","ToolbarSettingsMenu","hostTheme","onToggleHostTheme","VIEWBOX","MinimalCursorMark","CLASSIC_ARROW","PixelAgentIcon","size","CAPTURE_OPTIONS","CAPTURE_LABELS","Toolbar","rootAttributes","settingsOpen","onToggleSettings","onCloseSettings","active","mode","captureMode","annotationCount","multiSelectCount","onActivateAnnotate","onActivateEdit","onDeactivate","onCaptureModeChange","onConfirmMultiSelect","option","useAnnotationSession","restored","loadAnnotationSession","setAnnotations","saveAnnotationSession","updateAnnotation","patch","removeAnnotation","usePixelAgentUi","ui","controlledHostTheme","onHostThemeChange","mergedUi","DEFAULT_PIXEL_AGENT_UI_SETTINGS","internalHostTheme","setInternalHostTheme","readHostThemeFromDocument","setSettingsOpen","sync","read","attr","resolvePixelAgentChrome","toggleHostTheme","applyHostThemeToDocument","toggleSettings","pixelAgentRootAttributes","AUTO_APPLY_PATH","normalizeAreaRect","drag","PixelAgent","applyEndpoint","pixelAgentUi","autoEndpoint","setAutoEndpoint","cancelled","setActive","setMode","setCaptureMode","setHoveredElement","setSelectedElement","setMultiSelected","pendingAnnotation","setPendingAnnotation","areaDrag","setAreaDrag","sessionDismissed","setSessionDismissed","sessionCollapsed","setSessionCollapsed","sessionVisible","setTargetScope","setElementState","setCopyStatus","setCopiedEntryId","setCopyAllFrom","containerRef","copyStatusTimer","showCopyStatus","message","copyText","text","successMessage","openAnnotationPopover","handleMouseDown","handleMouseUp","getElementsInArea","addAnnotation","cancelAnnotation","copyAllAnnotations","from","markdown","formatAllAnnotations","copyOneAnnotation","formatAnnotation","entries","changes","effectiveEndpoint","results","allApplied","activateMode","nextMode","deactivate","areaRect","isDevEnvironment","PixelAgentDev"],"mappings":"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"}
1
+ {"version":3,"file":"pixelagent.js","sources":["../src/annotate/ElementOverlay.tsx","../src/glass/displacementMap.ts","../src/glass/backdropSupport.ts","../src/glass/GlassSurface.tsx","../src/glass/GlassButton.tsx","../src/glass/GlassPanel.tsx","../src/hooks/useDraggable.ts","../src/edit/EditActionIcons.tsx","../src/edit/colorModel.ts","../src/edit/ColorPickerPopover.tsx","../src/edit/EditSection.tsx","../src/edit/fontFamilies.ts","../src/edit/FontFamilySelect.tsx","../src/edit/propertyControls.ts","../src/edit/PropertyField.tsx","../src/edit/SpacingField.tsx","../src/edit/SegmentedControl.tsx","../src/edit/TypographyIcons.tsx","../src/edit/styleUtils.ts","../src/edit/EditPropertiesPanel.tsx","../src/edit/useEditPreview.ts","../src/edit/EditPanel.tsx","../src/edit/submitApply.ts","../src/hooks/useElementRect.ts","../src/annotate/popoverPosition.ts","../src/annotate/AnnotationPopover.tsx","../src/annotate/AreaSelectOverlay.tsx","../src/annotate/buildAnnotationEntry.ts","../src/annotate/annotationAnchor.ts","../src/annotate/AnnotationBadgesOverlay.tsx","../src/annotate/pickElement.ts","../src/ui/CopyFeedbackSlot.tsx","../src/annotate/SessionPanel.tsx","../src/ui/icons.tsx","../src/ui/ToolbarSettingsMenu.tsx","../src/shadow/PixelAgentIcon.tsx","../src/shadow/Toolbar.tsx","../src/hooks/useAnnotationSession.ts","../src/ui/usePixelAgentUi.ts","../src/PixelAgent.tsx","../src/index.tsx"],"sourcesContent":["import { useEffect, useState } from 'react';\nimport { getElementDisplayLabel } from '@pixelagent/shared';\n\ninterface ElementOverlayProps {\n element: Element | null;\n selected: Element | null;\n multiSelected?: Element[];\n /** Which element was clicked (stronger ring when multiple are selected). */\n primarySelected?: Element | null;\n}\n\nexport function ElementOverlay({\n element,\n selected,\n multiSelected = [],\n primarySelected = null,\n}: ElementOverlayProps) {\n const [highlights, setHighlights] = useState<\n Array<{ rect: DOMRect; label: string; isSelected: boolean; isPrimary: boolean }>\n >([]);\n\n const primary = primarySelected ?? selected;\n\n useEffect(() => {\n const targets = new Map<Element, boolean>();\n const scopeMode = multiSelected.length > 0;\n\n if (element && !selected && !scopeMode) {\n targets.set(element, false);\n }\n if (selected) {\n targets.set(selected, true);\n }\n for (const el of multiSelected) {\n targets.set(el, true);\n }\n\n if (targets.size === 0) {\n setHighlights([]);\n return;\n }\n\n const update = () => {\n setHighlights(\n Array.from(targets.entries()).map(([el, isSelected]) => ({\n rect: el.getBoundingClientRect(),\n label: getElementDisplayLabel(el),\n isSelected,\n isPrimary: primary !== null && el === primary,\n }))\n );\n };\n\n update();\n\n const observers = Array.from(targets.keys()).map((el) => {\n const observer = new ResizeObserver(update);\n observer.observe(el);\n return observer;\n });\n\n window.addEventListener('scroll', update, true);\n window.addEventListener('resize', update);\n\n return () => {\n for (const observer of observers) observer.disconnect();\n window.removeEventListener('scroll', update, true);\n window.removeEventListener('resize', update);\n };\n }, [element, selected, multiSelected, primary]);\n\n if (highlights.length === 0) return null;\n\n const tooltipAnchor =\n highlights.find((h) => h.isPrimary) ?? highlights.find((h) => h.isSelected) ?? highlights[0];\n const selectedCount = highlights.filter((h) => h.isSelected).length;\n\n return (\n <>\n {highlights.map((item, index) => (\n <div\n key={`${item.label}-${index}`}\n className={[\n 'pa-highlight',\n item.isSelected ? 'pa-highlight-selected' : '',\n item.isPrimary ? 'pa-highlight-primary' : '',\n item.isSelected && !item.isPrimary && selectedCount > 1\n ? 'pa-highlight-scope'\n : '',\n ]\n .filter(Boolean)\n .join(' ')}\n style={{\n top: item.rect.top,\n left: item.rect.left,\n width: item.rect.width,\n height: item.rect.height,\n }}\n />\n ))}\n <div\n className=\"pa-tooltip\"\n style={{\n top: Math.max(0, tooltipAnchor.rect.top - 28),\n left: tooltipAnchor.rect.left,\n }}\n >\n {selectedCount > 1\n ? `${selectedCount} instances · ${tooltipAnchor.label}`\n : tooltipAnchor.label}\n </div>\n </>\n );\n}\n","/**\n * Generates a displacement map PNG (data URI) for the Liquid Glass refraction.\n *\n * Each pixel's R/G channels encode a 2D vector telling `feDisplacementMap` how\n * far to pull the underlying backdrop. The vector field comes from a rounded\n * rect SDF: ~0 in the center (no displacement), increasing toward the rim, so\n * content gets \"lens-compressed\" at the edges like a real glass element.\n *\n * Same math as shuding/liquid-glass — adapted for variable element sizes and\n * shapes (capsule vs. rect).\n */\n\nexport interface DisplacementMap {\n href: string;\n scale: number;\n width: number;\n height: number;\n}\n\n/** Rim pull strength — higher = more visible light refraction at edges. */\nexport const REFRACTION_GAIN_DEFAULT = 0.35;\nexport const REFRACTION_GAIN_ENHANCED = 0.48;\n\nexport function generateLiquidGlassMap(\n width: number,\n height: number,\n borderRadiusPx: number,\n refractionGain: number = REFRACTION_GAIN_DEFAULT\n): DisplacementMap | null {\n if (width < 8 || height < 8) return null;\n\n const dpi = 1;\n const w = Math.max(1, Math.round(width * dpi));\n const h = Math.max(1, Math.round(height * dpi));\n\n const canvas = document.createElement('canvas');\n canvas.width = w;\n canvas.height = h;\n const ctx = canvas.getContext('2d');\n if (!ctx) return null;\n\n const imageData = ctx.createImageData(w, h);\n const data = imageData.data;\n\n // Normalized corner radius (capped to half the shortest side)\n const r = Math.min(0.5, borderRadiusPx / Math.min(width, height));\n // Half-extents in normalized [-0.5, 0.5] space.\n // 0.3, 0.2 with radius 0.6 = same proportions as shuding's reference;\n // produces a strong \"pull toward center\" at the rim.\n const hx = 0.3;\n const hy = 0.2;\n const sdfRadius = Math.max(0.4, r + 0.1);\n\n let maxScale = 0;\n const raw = new Float32Array(w * h * 2);\n\n let ri = 0;\n for (let y = 0; y < h; y++) {\n for (let x = 0; x < w; x++) {\n const ux = x / w - 0.5;\n const uy = y / h - 0.5;\n const sdf = roundedRectSDF(ux, uy, hx, hy, sdfRadius);\n const d = smoothStep(0.8, 0, sdf - 0.15);\n const scaled = smoothStep(0, 1, d);\n const dx = (ux * scaled + 0.5) * w - x;\n const dy = (uy * scaled + 0.5) * h - y;\n if (Math.abs(dx) > maxScale) maxScale = Math.abs(dx);\n if (Math.abs(dy) > maxScale) maxScale = Math.abs(dy);\n raw[ri++] = dx;\n raw[ri++] = dy;\n }\n }\n\n if (maxScale === 0) return null;\n maxScale *= 0.4 * refractionGain;\n\n let pi = 0;\n for (let i = 0; i < data.length; i += 4) {\n const rEnc = raw[pi++] / maxScale + 0.5;\n const gEnc = raw[pi++] / maxScale + 0.5;\n data[i] = rEnc * 255;\n data[i + 1] = gEnc * 255;\n data[i + 2] = 0;\n data[i + 3] = 255;\n }\n\n ctx.putImageData(imageData, 0, 0);\n\n return {\n href: canvas.toDataURL('image/png'),\n scale: maxScale / dpi,\n width: w,\n height: h,\n };\n}\n\nfunction roundedRectSDF(\n x: number,\n y: number,\n hw: number,\n hh: number,\n r: number\n): number {\n const qx = Math.abs(x) - hw + r;\n const qy = Math.abs(y) - hh + r;\n return (\n Math.min(Math.max(qx, qy), 0) +\n Math.hypot(Math.max(qx, 0), Math.max(qy, 0)) -\n r\n );\n}\n\nfunction smoothStep(a: number, b: number, t: number): number {\n const x = Math.max(0, Math.min(1, (t - a) / (b - a)));\n return x * x * (3 - 2 * x);\n}\n","/**\n * Safari and Firefox do not apply SVG filters (especially feDisplacementMap) via\n * backdrop-filter: url(#id). The entire declaration is dropped — including blur().\n * Chromium (Cursor preview, Chrome) supports the full chain.\n *\n * @see https://bugs.webkit.org/show_bug.cgi?id=245510\n */\nexport function supportsBackdropSvgRefraction(): boolean {\n if (typeof navigator === 'undefined') return false;\n\n const ua = navigator.userAgent;\n\n // Safari (WebKit without Chromium engine)\n if (/AppleWebKit/i.test(ua) && !/Chrome|Chromium|Edg|OPR|CriOS|FxiOS/i.test(ua)) {\n return false;\n }\n\n // Firefox drops unsupported SVG primitives from the backdrop-filter chain\n if (/Firefox/i.test(ua)) return false;\n\n return true;\n}\n\nexport type GlassBackdropIntensity = 'default' | 'enhanced';\n\nconst FROST_BACKDROP: Record<GlassBackdropIntensity, string> = {\n default: 'blur(4px) saturate(130%)',\n /** Toolbar — slightly stronger frost + refraction chain. */\n enhanced: 'blur(6px) saturate(138%)',\n};\n\n/** Pixel literals — keep in sync with --pa-glass-blur / --pa-glass-saturate in tokens.css */\nexport const FROST_BACKDROP_DEFAULT = FROST_BACKDROP.default;\n\nexport function frostBackdropStyle(\n filterId: string | null,\n intensity: GlassBackdropIntensity = 'default'\n): {\n backdropFilter: string;\n WebkitBackdropFilter: string;\n} {\n const frost = FROST_BACKDROP[intensity];\n const useRefraction = filterId !== null && supportsBackdropSvgRefraction();\n const value = useRefraction ? `${frost} url(#${filterId})` : frost;\n return {\n backdropFilter: value,\n WebkitBackdropFilter: value,\n };\n}\n","import { useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport type { CSSProperties, ReactNode } from 'react';\nimport { generateLiquidGlassMap, type DisplacementMap } from './displacementMap';\nimport {\n frostBackdropStyle,\n supportsBackdropSvgRefraction,\n type GlassBackdropIntensity,\n} from './backdropSupport';\nimport { REFRACTION_GAIN_DEFAULT, REFRACTION_GAIN_ENHANCED } from './displacementMap';\n\nexport type GlassShape = 'capsule' | 'rect';\nexport type GlassTint = 'neutral' | 'accent';\n\ninterface GlassSurfaceProps {\n shape?: GlassShape;\n cornerRadius?: number;\n tint?: GlassTint;\n /** `enhanced` = stronger blur + rim refraction (toolbar). */\n intensity?: GlassBackdropIntensity;\n className?: string;\n style?: CSSProperties;\n children: ReactNode;\n}\n\nlet filterCounter = 0;\n\nexport function GlassSurface({\n shape = 'rect',\n cornerRadius,\n tint = 'neutral',\n intensity = 'default',\n className = '',\n style,\n children,\n}: GlassSurfaceProps) {\n const radius = cornerRadius ?? (shape === 'capsule' ? 9999 : 20);\n const refractionGain =\n intensity === 'enhanced' ? REFRACTION_GAIN_ENHANCED : REFRACTION_GAIN_DEFAULT;\n const surfaceRef = useRef<HTMLDivElement>(null);\n const filterId = useMemo(() => `pa-lg-${++filterCounter}`, []);\n const [map, setMap] = useState<DisplacementMap | null>(null);\n\n useLayoutEffect(() => {\n const el = surfaceRef.current;\n if (!el) return;\n\n let raf = 0;\n const update = () => {\n cancelAnimationFrame(raf);\n raf = requestAnimationFrame(() => {\n const rect = el.getBoundingClientRect();\n const w = Math.round(rect.width);\n const h = Math.round(rect.height);\n if (w < 8 || h < 8) return;\n const effectiveRadius =\n shape === 'capsule' ? h / 2 : Math.min(radius, w / 2, h / 2);\n const result = generateLiquidGlassMap(w, h, effectiveRadius, refractionGain);\n if (result) setMap(result);\n });\n };\n\n update();\n const observer = new ResizeObserver(update);\n observer.observe(el);\n return () => {\n cancelAnimationFrame(raf);\n observer.disconnect();\n };\n }, [shape, radius, refractionGain]);\n\n const filterPortal =\n map && supportsBackdropSvgRefraction() && typeof document !== 'undefined'\n ? createPortal(\n <svg\n aria-hidden\n width=\"0\"\n height=\"0\"\n style={{\n position: 'fixed',\n top: 0,\n left: 0,\n width: 0,\n height: 0,\n overflow: 'hidden',\n pointerEvents: 'none',\n }}\n >\n <defs>\n <filter\n id={filterId}\n filterUnits=\"userSpaceOnUse\"\n colorInterpolationFilters=\"sRGB\"\n x=\"0\"\n y=\"0\"\n width={map.width}\n height={map.height}\n >\n <feImage\n href={map.href}\n xlinkHref={map.href}\n width={map.width}\n height={map.height}\n preserveAspectRatio=\"none\"\n result=\"map\"\n />\n <feDisplacementMap\n in=\"SourceGraphic\"\n in2=\"map\"\n scale={map.scale}\n xChannelSelector=\"R\"\n yChannelSelector=\"G\"\n />\n </filter>\n </defs>\n </svg>,\n document.body\n )\n : null;\n\n return (\n <>\n {filterPortal}\n <div\n ref={surfaceRef}\n className={`pa-glass-surface pa-glass-surface--${shape} pa-glass-surface--${tint} ${className}`.trim()}\n style={{\n borderRadius: shape === 'capsule' ? '999px' : `${radius}px`,\n ...frostBackdropStyle(\n map && supportsBackdropSvgRefraction() ? filterId : null,\n intensity\n ),\n ...style,\n }}\n >\n <div className=\"pa-glass-surface-bg\" aria-hidden=\"true\" />\n <div className=\"pa-glass-surface-shine\" aria-hidden=\"true\" />\n <div className=\"pa-glass-surface-content\">{children}</div>\n </div>\n </>\n );\n}\n","import type { ButtonHTMLAttributes, ReactNode } from 'react';\n\nexport type GlassButtonVariant = 'regular' | 'ghost' | 'glass-primary' | 'icon';\n\ninterface GlassButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: GlassButtonVariant;\n children: ReactNode;\n}\n\nexport function GlassButton({\n variant = 'regular',\n className = '',\n children,\n ...props\n}: GlassButtonProps) {\n return (\n <button\n type=\"button\"\n className={`pa-glass-btn pa-glass-btn--${variant} ${className}`.trim()}\n {...props}\n >\n {children}\n </button>\n );\n}\n","import type { CSSProperties, ReactNode } from 'react';\nimport { GlassSurface } from './GlassSurface';\n\nexport type GlassPanelVariant = 'sheet' | 'popover';\nexport type GlassPanelSide = 'left' | 'right' | 'bottom';\n\ninterface GlassPanelProps {\n variant?: GlassPanelVariant;\n side?: GlassPanelSide;\n className?: string;\n style?: CSSProperties;\n children: ReactNode;\n}\n\nexport function GlassPanel({\n variant = 'sheet',\n side = 'left',\n className = '',\n style,\n children,\n}: GlassPanelProps) {\n const radius = variant === 'popover' ? 16 : 20;\n\n return (\n <GlassSurface\n shape=\"rect\"\n cornerRadius={radius}\n className={`pa-glass-panel pa-glass-panel--${variant} pa-glass-panel--${side} ${className}`.trim()}\n style={style}\n >\n {children}\n </GlassSurface>\n );\n}\n","import { useCallback, useEffect, useRef, useState, type CSSProperties } from 'react';\n\ninterface Position {\n x: number;\n y: number;\n}\n\ninterface UseDraggableOptions {\n /** Initial position; null = computed on first layout */\n defaultPosition?: Position | null;\n /** Custom default placement when position is not set */\n computeDefaultPosition?: (rect: DOMRect) => Position;\n}\n\nexport function useDraggable({\n defaultPosition = null,\n computeDefaultPosition,\n}: UseDraggableOptions = {}) {\n const [position, setPosition] = useState<Position | null>(defaultPosition);\n const [isDragging, setIsDragging] = useState(false);\n const dragRef = useRef<{\n pointerId: number;\n startX: number;\n startY: number;\n originX: number;\n originY: number;\n } | null>(null);\n const elementRef = useRef<HTMLDivElement>(null);\n\n const initDefaultPosition = useCallback(() => {\n if (position !== null) return;\n const el = elementRef.current;\n if (!el) return;\n\n const rect = el.getBoundingClientRect();\n setPosition(\n computeDefaultPosition\n ? computeDefaultPosition(rect)\n : {\n x: (window.innerWidth - rect.width) / 2,\n y: window.innerHeight - rect.height - 24,\n }\n );\n }, [position, computeDefaultPosition]);\n\n useEffect(() => {\n initDefaultPosition();\n }, [initDefaultPosition]);\n\n useEffect(() => {\n const onResize = () => {\n setPosition((prev) => {\n if (!prev || !elementRef.current) return prev;\n const rect = elementRef.current.getBoundingClientRect();\n return {\n x: Math.min(prev.x, window.innerWidth - rect.width),\n y: Math.min(prev.y, window.innerHeight - rect.height),\n };\n });\n };\n window.addEventListener('resize', onResize);\n return () => window.removeEventListener('resize', onResize);\n }, []);\n\n const onPointerDown = useCallback(\n (e: React.PointerEvent) => {\n if (e.button !== 0) return;\n\n const el = elementRef.current;\n if (!el) return;\n\n let origin = position;\n if (!origin) {\n const rect = el.getBoundingClientRect();\n origin = { x: rect.left, y: rect.top };\n setPosition(origin);\n }\n\n dragRef.current = {\n pointerId: e.pointerId,\n startX: e.clientX,\n startY: e.clientY,\n originX: origin.x,\n originY: origin.y,\n };\n setIsDragging(true);\n e.currentTarget.setPointerCapture(e.pointerId);\n e.preventDefault();\n },\n [position]\n );\n\n const onPointerMove = useCallback((e: React.PointerEvent) => {\n if (!dragRef.current || dragRef.current.pointerId !== e.pointerId) return;\n\n const el = elementRef.current;\n const width = el?.offsetWidth ?? 320;\n const height = el?.offsetHeight ?? 48;\n\n const dx = e.clientX - dragRef.current.startX;\n const dy = e.clientY - dragRef.current.startY;\n\n const x = Math.max(8, Math.min(window.innerWidth - width - 8, dragRef.current.originX + dx));\n const y = Math.max(8, Math.min(window.innerHeight - height - 8, dragRef.current.originY + dy));\n\n setPosition({ x, y });\n }, []);\n\n const onPointerUp = useCallback((e: React.PointerEvent) => {\n if (!dragRef.current || dragRef.current.pointerId !== e.pointerId) return;\n dragRef.current = null;\n setIsDragging(false);\n try {\n e.currentTarget.releasePointerCapture(e.pointerId);\n } catch {\n // already released\n }\n }, []);\n\n const style: CSSProperties | undefined =\n position !== null\n ? {\n position: 'fixed',\n left: position.x,\n top: position.y,\n transform: 'none',\n marginLeft: 0,\n bottom: 'auto',\n }\n : undefined;\n\n return {\n elementRef,\n position,\n isDragging,\n style,\n dragHandleProps: {\n onPointerDown,\n onPointerMove,\n onPointerUp,\n onPointerCancel: onPointerUp,\n },\n };\n}\n","interface IconProps {\n className?: string;\n}\n\nexport function IconUndo({ className }: IconProps) {\n return (\n <svg className={className} width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.35\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M3.25 8a4.75 4.75 0 0 1 8.1-2.35\"\n />\n <path\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.35\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M5.1 5.35 3.25 7.2 5.1 9.05\"\n />\n </svg>\n );\n}\n\nexport function IconReset({ className }: IconProps) {\n return (\n <svg className={className} width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.35\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M11.1 3.65a4.75 4.75 0 0 1 1.15 7.75M12.05 11.35v2.15h-2.15\"\n />\n <path\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.35\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M4.9 12.35a4.75 4.75 0 0 1-1.15-7.75M3.95 4.65V2.5h2.15\"\n />\n </svg>\n );\n}\n","export interface Rgb {\n r: number;\n g: number;\n b: number;\n}\n\nexport interface Hsv {\n h: number;\n s: number;\n v: number;\n}\n\nconst clamp = (n: number, min: number, max: number) => Math.min(max, Math.max(min, n));\n\nexport function parseCssColor(value: string): Rgb | null {\n const trimmed = value.trim();\n if (!trimmed) return null;\n\n const hex6 = trimmed.match(/^#([0-9a-f]{6})$/i);\n if (hex6) {\n return {\n r: parseInt(hex6[1].slice(0, 2), 16),\n g: parseInt(hex6[1].slice(2, 4), 16),\n b: parseInt(hex6[1].slice(4, 6), 16),\n };\n }\n\n const hex3 = trimmed.match(/^#([0-9a-f]{3})$/i);\n if (hex3) {\n const [r, g, b] = hex3[1].split('');\n return {\n r: parseInt(r + r, 16),\n g: parseInt(g + g, 16),\n b: parseInt(b + b, 16),\n };\n }\n\n const rgb = trimmed.match(/^rgba?\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)/i);\n if (rgb) {\n return {\n r: clamp(parseInt(rgb[1], 10), 0, 255),\n g: clamp(parseInt(rgb[2], 10), 0, 255),\n b: clamp(parseInt(rgb[3], 10), 0, 255),\n };\n }\n\n return null;\n}\n\nexport function rgbToHex(rgb: Rgb): string {\n const h = (n: number) => clamp(Math.round(n), 0, 255).toString(16).padStart(2, '0');\n return `#${h(rgb.r)}${h(rgb.g)}${h(rgb.b)}`;\n}\n\nexport function rgbToCss(rgb: Rgb): string {\n return `rgb(${rgb.r}, ${rgb.g}, ${rgb.b})`;\n}\n\nexport function rgbToHsv({ r, g, b }: Rgb): Hsv {\n const rn = r / 255;\n const gn = g / 255;\n const bn = b / 255;\n const max = Math.max(rn, gn, bn);\n const min = Math.min(rn, gn, bn);\n const d = max - min;\n\n let h = 0;\n if (d !== 0) {\n if (max === rn) h = ((gn - bn) / d) % 6;\n else if (max === gn) h = (bn - rn) / d + 2;\n else h = (rn - gn) / d + 4;\n h *= 60;\n if (h < 0) h += 360;\n }\n\n const s = max === 0 ? 0 : (d / max) * 100;\n const v = max * 100;\n\n return { h, s, v };\n}\n\nexport function hsvToRgb({ h, s, v }: Hsv): Rgb {\n const sn = clamp(s, 0, 100) / 100;\n const vn = clamp(v, 0, 100) / 100;\n const c = vn * sn;\n const x = c * (1 - Math.abs(((h / 60) % 2) - 1));\n const m = vn - c;\n\n let rp = 0;\n let gp = 0;\n let bp = 0;\n const hue = ((h % 360) + 360) % 360;\n\n if (hue < 60) {\n rp = c;\n gp = x;\n } else if (hue < 120) {\n rp = x;\n gp = c;\n } else if (hue < 180) {\n gp = c;\n bp = x;\n } else if (hue < 240) {\n gp = x;\n bp = c;\n } else if (hue < 300) {\n rp = x;\n bp = c;\n } else {\n rp = c;\n bp = x;\n }\n\n return {\n r: Math.round((rp + m) * 255),\n g: Math.round((gp + m) * 255),\n b: Math.round((bp + m) * 255),\n };\n}\n\nexport function hsvFromCss(value: string): Hsv {\n const rgb = parseCssColor(value);\n return rgb ? rgbToHsv(rgb) : { h: 0, s: 0, v: 45 };\n}\n\n/** @deprecated use parseCssColor + rgbToHex */\nexport function colorToHexInput(value: string): string | null {\n const rgb = parseCssColor(value);\n return rgb ? rgbToHex(rgb) : null;\n}\n\nexport function formatHexInput(value: string): string {\n return value.replace(/^#/, '').toUpperCase().slice(0, 6);\n}\n\nexport function parseHexInput(raw: string, fallback: Rgb): Rgb {\n const cleaned = raw.replace(/[^0-9a-f]/gi, '').slice(0, 6);\n if (cleaned.length < 6) return fallback;\n return (\n parseCssColor(`#${cleaned}`) ?? fallback\n );\n}\n","import { useCallback, useEffect, useId, useRef, useState, type MouseEvent as ReactMouseEvent } from 'react';\nimport { createPortal } from 'react-dom';\nimport type { Hsv, Rgb } from './colorModel.js';\nimport {\n formatHexInput,\n hsvFromCss,\n hsvToRgb,\n parseCssColor,\n parseHexInput,\n rgbToCss,\n rgbToHex,\n rgbToHsv,\n} from './colorModel.js';\n\ninterface ColorPickerPopoverProps {\n label: string;\n value: string;\n onChange: (value: string) => void;\n}\n\nfunction cssFromHsv(hsv: Hsv): string {\n return rgbToHex(hsvToRgb(hsv));\n}\n\nfunction pointerPercent(clientX: number, clientY: number, rect: DOMRect) {\n const x = clamp01((clientX - rect.left) / rect.width);\n const y = clamp01((clientY - rect.top) / rect.height);\n return { x: x * 100, y: y * 100 };\n}\n\nfunction clamp01(n: number) {\n return Math.min(1, Math.max(0, n));\n}\n\nfunction getPickerPortalRootAttributes(): Record<string, string> {\n if (typeof document === 'undefined') return {};\n const root =\n document.querySelector('[data-pixelagent-root]') ??\n document.querySelector('[data-pixelagent-toolbar-portal]');\n const chrome = root?.getAttribute('data-pa-chrome');\n return chrome ? { 'data-pa-chrome': chrome } : {};\n}\n\nexport function ColorPickerPopover({ label, value, onChange }: ColorPickerPopoverProps) {\n const [open, setOpen] = useState(false);\n const [hsv, setHsv] = useState<Hsv>(() => hsvFromCss(value));\n const triggerRef = useRef<HTMLButtonElement>(null);\n const popoverRef = useRef<HTMLDivElement>(null);\n const sbRef = useRef<HTMLDivElement>(null);\n const listboxId = useId();\n const [pos, setPos] = useState({ top: 0, left: 0, width: 260 });\n\n const rgb = hsvToRgb(hsv);\n const hex = formatHexInput(rgbToHex(rgb));\n const preview = parseCssColor(value) ? value : rgbToCss(rgb);\n const headerLabel = label.toLowerCase().includes('color') ? label : `${label} color`;\n\n useEffect(() => {\n setHsv(hsvFromCss(value));\n }, [value]);\n\n const updateHsv = useCallback(\n (next: Hsv) => {\n setHsv(next);\n onChange(cssFromHsv(next));\n },\n [onChange]\n );\n\n const updateRgb = useCallback(\n (next: Rgb) => {\n updateHsv(rgbToHsv(next));\n },\n [updateHsv]\n );\n\n const reposition = useCallback(() => {\n const el = triggerRef.current;\n if (!el) return;\n const rect = el.getBoundingClientRect();\n const width = 260;\n let left = rect.left;\n if (left + width > window.innerWidth - 12) {\n left = window.innerWidth - width - 12;\n }\n left = Math.max(12, left);\n\n let top = rect.bottom + 8;\n const estimatedHeight = 320;\n if (top + estimatedHeight > window.innerHeight - 12) {\n top = Math.max(12, rect.top - estimatedHeight - 8);\n }\n\n setPos({ top, left, width });\n }, []);\n\n useEffect(() => {\n if (!open) return;\n reposition();\n\n const onDocPointer = (e: MouseEvent) => {\n const t = e.target;\n if (\n triggerRef.current?.contains(t as Node) ||\n popoverRef.current?.contains(t as Node)\n ) {\n return;\n }\n setOpen(false);\n };\n\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') setOpen(false);\n };\n\n window.addEventListener('mousedown', onDocPointer, true);\n window.addEventListener('keydown', onKey);\n window.addEventListener('resize', reposition);\n window.addEventListener('scroll', reposition, true);\n\n return () => {\n window.removeEventListener('mousedown', onDocPointer, true);\n window.removeEventListener('keydown', onKey);\n window.removeEventListener('resize', reposition);\n window.removeEventListener('scroll', reposition, true);\n };\n }, [open, reposition]);\n\n const handleSbPointer = (clientX: number, clientY: number) => {\n const rect = sbRef.current?.getBoundingClientRect();\n if (!rect) return;\n const { x, y } = pointerPercent(clientX, clientY, rect);\n updateHsv({ ...hsv, s: x, v: 100 - y });\n };\n\n const startSbDrag = (e: ReactMouseEvent<HTMLDivElement>) => {\n e.preventDefault();\n handleSbPointer(e.clientX, e.clientY);\n\n const onMove = (ev: MouseEvent) => handleSbPointer(ev.clientX, ev.clientY);\n const onUp = () => {\n window.removeEventListener('mousemove', onMove);\n window.removeEventListener('mouseup', onUp);\n };\n window.addEventListener('mousemove', onMove);\n window.addEventListener('mouseup', onUp);\n };\n\n const popover = open\n ? createPortal(\n <div\n className=\"pa-root pa-root--toolbar-portal pa-color-picker-portal\"\n data-pixelagent-picker-portal\n {...getPickerPortalRootAttributes()}\n >\n <div\n ref={popoverRef}\n id={listboxId}\n role=\"dialog\"\n aria-label={headerLabel}\n className=\"pa-color-picker\"\n style={{ top: pos.top, left: pos.left, width: pos.width }}\n >\n <header className=\"pa-color-picker-header\">\n <span\n className=\"pa-color-picker-preview\"\n style={{ backgroundColor: preview }}\n aria-hidden=\"true\"\n />\n <span className=\"pa-color-picker-header-label\">{headerLabel}</span>\n </header>\n\n <div\n ref={sbRef}\n className=\"pa-color-picker-sb\"\n style={{ ['--pa-picker-h' as string]: String(Math.round(hsv.h)) }}\n onMouseDown={startSbDrag}\n >\n <span\n className=\"pa-color-picker-sb-thumb\"\n style={{ left: `${hsv.s}%`, top: `${100 - hsv.v}%` }}\n aria-hidden=\"true\"\n />\n </div>\n\n <div className=\"pa-color-picker-hue\">\n <input\n type=\"range\"\n className=\"pa-color-picker-hue-input\"\n min={0}\n max={360}\n value={Math.round(hsv.h)}\n aria-label=\"Hue\"\n onChange={(e) => updateHsv({ ...hsv, h: parseFloat(e.target.value) })}\n />\n <span\n className=\"pa-color-picker-hue-thumb\"\n style={{ left: `${(hsv.h / 360) * 100}%` }}\n aria-hidden=\"true\"\n />\n </div>\n\n <label className=\"pa-color-picker-field\">\n <span className=\"pa-color-picker-field-label\">Hex</span>\n <input\n className=\"pa-input pa-color-picker-input\"\n type=\"text\"\n value={hex}\n spellCheck={false}\n onChange={(e) => updateRgb(parseHexInput(e.target.value, rgb))}\n />\n </label>\n\n <div className=\"pa-color-picker-rgb\">\n {(['r', 'g', 'b'] as const).map((channel) => (\n <label key={channel} className=\"pa-color-picker-field pa-color-picker-field--rgb\">\n <span className=\"pa-color-picker-field-label\">{channel.toUpperCase()}</span>\n <input\n className=\"pa-input pa-color-picker-input\"\n type=\"number\"\n min={0}\n max={255}\n value={rgb[channel]}\n onChange={(e) => {\n const n = clamp01Channel(parseInt(e.target.value, 10));\n updateRgb({ ...rgb, [channel]: n });\n }}\n />\n </label>\n ))}\n </div>\n </div>\n </div>,\n document.body\n )\n : null;\n\n return (\n <div className=\"pa-color-field\">\n <span className=\"pa-edit-field-label\">{label}</span>\n <button\n ref={triggerRef}\n type=\"button\"\n className=\"pa-color-field-trigger\"\n aria-expanded={open}\n aria-haspopup=\"dialog\"\n aria-controls={open ? listboxId : undefined}\n onClick={() => {\n if (!open) reposition();\n setOpen((v) => !v);\n }}\n >\n <span className=\"pa-color-field-swatch\" style={{ backgroundColor: preview }} aria-hidden=\"true\" />\n <input\n className=\"pa-input pa-color-field-hex\"\n type=\"text\"\n value={value}\n readOnly\n tabIndex={-1}\n aria-hidden=\"true\"\n />\n </button>\n {popover}\n </div>\n );\n}\n\nfunction clamp01Channel(n: number) {\n if (!Number.isFinite(n)) return 0;\n return Math.min(255, Math.max(0, n));\n}\n","import { useState, type ReactNode } from 'react';\n\ninterface EditSectionProps {\n title: string;\n children: ReactNode;\n defaultOpen?: boolean;\n badge?: string;\n}\n\nexport function EditSection({ title, children, defaultOpen = true, badge }: EditSectionProps) {\n const [open, setOpen] = useState(defaultOpen);\n\n return (\n <section className={`pa-edit-section ${open ? 'pa-edit-section--open' : ''}`}>\n <button\n type=\"button\"\n className=\"pa-edit-section-header\"\n aria-expanded={open}\n onClick={() => setOpen((v) => !v)}\n >\n <span className=\"pa-edit-section-title\">{title}</span>\n {badge ? <span className=\"pa-edit-section-badge\">{badge}</span> : null}\n <span className=\"pa-edit-section-chevron\" aria-hidden=\"true\" />\n </button>\n {open ? <div className=\"pa-edit-section-body\">{children}</div> : null}\n </section>\n );\n}\n","export interface FontFamilyOption {\n value: string;\n label: string;\n}\n\n/** Preset stacks for the font family dropdown (Figma-style). */\nexport const FONT_FAMILY_PRESETS: FontFamilyOption[] = [\n { value: 'Inter, system-ui, sans-serif', label: 'Inter' },\n { value: 'system-ui, sans-serif', label: 'System UI' },\n {\n value: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n label: 'System',\n },\n { value: 'Georgia, \"Times New Roman\", Times, serif', label: 'Georgia' },\n { value: '\"Times New Roman\", Times, serif', label: 'Times New Roman' },\n { value: 'Arial, Helvetica, sans-serif', label: 'Arial' },\n { value: 'Helvetica, Arial, sans-serif', label: 'Helvetica' },\n { value: '\"JetBrains Mono\", ui-monospace, monospace', label: 'JetBrains Mono' },\n { value: 'ui-monospace, monospace', label: 'Monospace' },\n];\n\nconst PLACEHOLDER_VALUE = '';\n\nexport function primaryFontName(fontFamily: string): string {\n const first = fontFamily.split(',')[0]?.trim() ?? '';\n return first.replace(/^[\"']|[\"']$/g, '');\n}\n\n/** Match computed font-family to a preset value, or return custom stack. */\nexport function resolveFontFamilySelectValue(fontFamily: string): {\n selectValue: string;\n options: FontFamilyOption[];\n} {\n const trimmed = fontFamily.trim();\n if (!trimmed) {\n return {\n selectValue: PLACEHOLDER_VALUE,\n options: FONT_FAMILY_PRESETS,\n };\n }\n\n const primary = primaryFontName(trimmed).toLowerCase();\n\n const exact = FONT_FAMILY_PRESETS.find(\n (p) => p.value === trimmed || primaryFontName(p.value).toLowerCase() === primary\n );\n if (exact) {\n return { selectValue: exact.value, options: FONT_FAMILY_PRESETS };\n }\n\n const partial = FONT_FAMILY_PRESETS.find((p) => {\n const presetPrimary = primaryFontName(p.value).toLowerCase();\n return (\n trimmed.toLowerCase().includes(presetPrimary) ||\n presetPrimary.includes(primary)\n );\n });\n if (partial) {\n return { selectValue: partial.value, options: FONT_FAMILY_PRESETS };\n }\n\n return {\n selectValue: trimmed,\n options: [\n ...FONT_FAMILY_PRESETS,\n { value: trimmed, label: primaryFontName(trimmed) || 'Custom' },\n ],\n };\n}\n\nexport { PLACEHOLDER_VALUE as FONT_FAMILY_PLACEHOLDER };\n","import { useMemo } from 'react';\nimport { FONT_FAMILY_PLACEHOLDER, resolveFontFamilySelectValue } from './fontFamilies.js';\n\ninterface FontFamilySelectProps {\n value: string;\n onChange: (value: string) => void;\n}\n\nexport function FontFamilySelect({ value, onChange }: FontFamilySelectProps) {\n const { selectValue, options } = useMemo(\n () => resolveFontFamilySelectValue(value),\n [value]\n );\n\n return (\n <label className=\"pa-edit-stack-field\">\n <span className=\"pa-edit-field-label\">Font family</span>\n <select\n className=\"pa-select pa-font-family-select\"\n value={selectValue || FONT_FAMILY_PLACEHOLDER}\n onChange={(e) => {\n const next = e.target.value;\n if (next && next !== FONT_FAMILY_PLACEHOLDER) onChange(next);\n }}\n >\n <option value={FONT_FAMILY_PLACEHOLDER} disabled>\n Select font style\n </option>\n {options.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n </label>\n );\n}\n","/** Parse a single px length from computed CSS (e.g. \"72px\"). */\nexport function parsePx(value: string): number | null {\n const match = value.trim().match(/^(-?\\d+(?:\\.\\d+)?)px$/i);\n return match ? parseFloat(match[1]) : null;\n}\n\n/** Parse opacity from \"0.85\" or \"85%\". */\nexport function parseOpacity(value: string): number | null {\n const trimmed = value.trim();\n if (!trimmed) return null;\n if (trimmed.endsWith('%')) {\n const n = parseFloat(trimmed);\n return Number.isFinite(n) ? n / 100 : null;\n }\n const n = parseFloat(trimmed);\n return Number.isFinite(n) && n >= 0 && n <= 1 ? n : null;\n}\n\n/** True when a border-width value represents a visible stroke (uniform or single px). */\nexport function hasPositiveBorderWidth(value: string): boolean {\n const uniform = parseUniformPx(value);\n if (uniform !== null) return uniform > 0;\n const single = parsePx(value);\n return single !== null && single > 0;\n}\n\n/** True when all sides share the same px length (slider-safe). */\nexport function parseUniformPx(value: string): number | null {\n const parts = value.trim().split(/\\s+/).filter(Boolean);\n if (parts.length === 0) return null;\n\n const parsed = parts.map((p) => parsePx(p));\n if (parsed.some((n) => n === null)) return null;\n const first = parsed[0]!;\n if (parsed.every((n) => n === first)) return first;\n return null;\n}\n\nexport type PropControlKind = 'text' | 'opacity' | 'px' | 'uniform-px';\n\nexport interface PropControlConfig {\n kind: PropControlKind;\n min?: number;\n max?: number;\n step?: number;\n}\n\nexport const PROP_CONTROLS: Record<string, PropControlConfig> = {\n padding: { kind: 'uniform-px', min: 0, max: 80, step: 1 },\n margin: { kind: 'uniform-px', min: 0, max: 80, step: 1 },\n width: { kind: 'text' },\n height: { kind: 'text' },\n 'background-color': { kind: 'text' },\n color: { kind: 'text' },\n 'font-size': { kind: 'px', min: 8, max: 128, step: 1 },\n 'line-height': { kind: 'text' },\n gap: { kind: 'uniform-px', min: 0, max: 80, step: 1 },\n 'border-width': { kind: 'uniform-px', min: 0, max: 24, step: 1 },\n 'border-radius': { kind: 'px', min: 0, max: 48, step: 1 },\n opacity: { kind: 'opacity', min: 0, max: 1, step: 0.01 },\n};\n\nexport function sliderValueForProperty(\n _property: string,\n cssValue: string,\n config: PropControlConfig\n): number | null {\n switch (config.kind) {\n case 'opacity':\n return parseOpacity(cssValue);\n case 'px':\n return parsePx(cssValue);\n case 'uniform-px':\n return parseUniformPx(cssValue);\n default:\n return null;\n }\n}\n\nexport function formatSliderValue(_property: string, num: number, config: PropControlConfig): string {\n switch (config.kind) {\n case 'opacity':\n return String(Math.round(num * 100) / 100);\n case 'px':\n case 'uniform-px':\n return `${Math.round(num)}px`;\n default:\n return String(num);\n }\n}\n","import {\n formatSliderValue,\n PROP_CONTROLS,\n sliderValueForProperty,\n} from './propertyControls';\n\ninterface PropertyFieldProps {\n property: string;\n label: string;\n value: string;\n onChange: (value: string) => void;\n /** Inside a named section — smaller label, no extra uppercase row chrome. */\n compact?: boolean;\n}\n\nexport function PropertyField({\n property,\n label,\n value,\n onChange,\n compact = false,\n}: PropertyFieldProps) {\n const config = PROP_CONTROLS[property] ?? { kind: 'text' as const };\n const numeric = sliderValueForProperty(property, value, config);\n const useSlider = config.kind !== 'text' && numeric !== null;\n\n const rowClass = compact ? 'pa-prop-row pa-prop-row--compact' : 'pa-prop-row';\n const labelClass = compact ? 'pa-edit-field-label' : 'pa-prop-label';\n\n if (!useSlider) {\n return (\n <label className={rowClass}>\n <span className={labelClass}>{label}</span>\n <input\n className=\"pa-input\"\n type=\"text\"\n value={value}\n onChange={(e) => onChange(e.target.value)}\n />\n </label>\n );\n }\n\n const min = config.min ?? 0;\n const max = config.max ?? 100;\n const step = config.step ?? 1;\n\n const handleSlider = (next: number) => {\n onChange(formatSliderValue(property, next, config));\n };\n\n return (\n <label className={`${rowClass} pa-prop-row--slider`}>\n <span className={labelClass}>{label}</span>\n <div className=\"pa-prop-slider-wrap\">\n <input\n type=\"range\"\n className=\"pa-slider\"\n min={min}\n max={max}\n step={step}\n value={numeric}\n aria-valuetext={value}\n onChange={(e) => handleSlider(parseFloat(e.target.value))}\n />\n <input\n className=\"pa-input pa-prop-slider-value\"\n type=\"text\"\n value={value}\n onChange={(e) => onChange(e.target.value)}\n aria-label={`${label} value`}\n />\n </div>\n </label>\n );\n}\n","import { useEffect, useState } from 'react';\nimport type { ReactNode } from 'react';\n\ninterface SpacingFieldProps {\n property: 'margin' | 'padding';\n label: string;\n value: string;\n onChange: (value: string) => void;\n}\n\ninterface Sides {\n top: string;\n right: string;\n bottom: string;\n left: string;\n}\n\nfunction parseShorthand(value: string): Sides {\n const parts = value.trim().split(/\\s+/).filter(Boolean);\n const a = parts[0] ?? '0px';\n if (parts.length <= 1) return { top: a, right: a, bottom: a, left: a };\n const b = parts[1];\n if (parts.length === 2) return { top: a, right: b, bottom: a, left: b };\n const c = parts[2];\n if (parts.length === 3) return { top: a, right: b, bottom: c, left: b };\n return { top: a, right: b, bottom: c, left: parts[3] };\n}\n\nfunction formatShorthand({ top, right, bottom, left }: Sides): string {\n if (top === right && right === bottom && bottom === left) return top;\n if (top === bottom && right === left) return `${top} ${right}`;\n if (right === left) return `${top} ${right} ${bottom}`;\n return `${top} ${right} ${bottom} ${left}`;\n}\n\n/** Strip \"px\" suffix from a numeric px value for display in compact inputs. */\nfunction displayNum(value: string): string {\n const m = value.trim().match(/^(-?\\d+(?:\\.\\d+)?)px$/i);\n return m ? m[1] : value;\n}\n\n/** Re-suffix when user types a bare number. Leave other values (auto, 0, %, calc()) untouched. */\nfunction normalizeWrite(raw: string): string {\n const trimmed = raw.trim();\n if (trimmed === '') return '0px';\n if (/^-?\\d+(?:\\.\\d+)?$/.test(trimmed)) return `${trimmed}px`;\n return trimmed;\n}\n\n/** Pair display: single value if equal, comma-joined when mixed. */\nfunction formatPairDisplay(a: string, b: string): string {\n if (a === b) return displayNum(a);\n return `${displayNum(a)}, ${displayNum(b)}`;\n}\n\n/**\n * Parse a pair-cell commit. Accepts either:\n * - single value → both sides get it\n * - \"a, b\" (comma-separated) → first→primary, second→secondary\n * Returns [primary, secondary] as normalized CSS values.\n */\nfunction parsePairCommit(raw: string, fallback: string): [string, string] {\n const parts = raw\n .split(',')\n .map((p) => p.trim())\n .filter(Boolean);\n if (parts.length === 0) return [fallback, fallback];\n if (parts.length === 1) {\n const v = normalizeWrite(parts[0]);\n return [v, v];\n }\n return [normalizeWrite(parts[0]), normalizeWrite(parts[1])];\n}\n\n// ── Icons ─────────────────────────────────────────────────────────────────\n\nconst ICON_SIZE = 12;\nconst ICON_PROPS = {\n width: ICON_SIZE,\n height: ICON_SIZE,\n viewBox: '0 0 12 12',\n fill: 'none',\n 'aria-hidden': true,\n} as const;\n\nfunction IconHorizontalPair() {\n return (\n <svg {...ICON_PROPS}>\n <rect x=\"1.5\" y=\"1.5\" width=\"9\" height=\"9\" stroke=\"currentColor\" strokeOpacity=\"0.35\" />\n <line x1=\"1.5\" y1=\"1.5\" x2=\"1.5\" y2=\"10.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <line x1=\"10.5\" y1=\"1.5\" x2=\"10.5\" y2=\"10.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n </svg>\n );\n}\n\nfunction IconVerticalPair() {\n return (\n <svg {...ICON_PROPS}>\n <rect x=\"1.5\" y=\"1.5\" width=\"9\" height=\"9\" stroke=\"currentColor\" strokeOpacity=\"0.35\" />\n <line x1=\"1.5\" y1=\"1.5\" x2=\"10.5\" y2=\"1.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <line x1=\"1.5\" y1=\"10.5\" x2=\"10.5\" y2=\"10.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n </svg>\n );\n}\n\nfunction IconSide({ side }: { side: keyof Sides }) {\n const edges = {\n top: { x1: 1.5, y1: 1.5, x2: 10.5, y2: 1.5 },\n right: { x1: 10.5, y1: 1.5, x2: 10.5, y2: 10.5 },\n bottom: { x1: 1.5, y1: 10.5, x2: 10.5, y2: 10.5 },\n left: { x1: 1.5, y1: 1.5, x2: 1.5, y2: 10.5 },\n }[side];\n return (\n <svg {...ICON_PROPS}>\n <rect x=\"1.5\" y=\"1.5\" width=\"9\" height=\"9\" stroke=\"currentColor\" strokeOpacity=\"0.35\" />\n <line {...edges} stroke=\"currentColor\" strokeWidth=\"1.5\" />\n </svg>\n );\n}\n\nfunction IconExpand() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <rect x=\"2\" y=\"2\" width=\"4\" height=\"4\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n <rect x=\"8\" y=\"2\" width=\"4\" height=\"4\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n <rect x=\"2\" y=\"8\" width=\"4\" height=\"4\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n <rect x=\"8\" y=\"8\" width=\"4\" height=\"4\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n </svg>\n );\n}\n\n// ── Cell ──────────────────────────────────────────────────────────────────\n\ninterface CellProps {\n icon: ReactNode;\n /** Pre-formatted display string (already px-stripped, optionally comma-joined). */\n display: string;\n ariaLabel: string;\n mixed?: boolean;\n /** Called on blur/Enter with the raw draft string. Caller normalizes. */\n onCommit: (raw: string) => void;\n}\n\nfunction Cell({ icon, display, ariaLabel, mixed, onCommit }: CellProps) {\n const [draft, setDraft] = useState(display);\n\n // Sync external value into draft (no focus tracking yet — accept the flicker\n // for now; rare to type and have the same field externally mutate).\n useEffect(() => {\n setDraft(display);\n }, [display]);\n\n return (\n <label className={`pa-spacing-cell ${mixed ? 'pa-spacing-cell--mixed' : ''}`}>\n <span className=\"pa-spacing-cell-icon\">{icon}</span>\n <input\n className=\"pa-input pa-spacing-cell-input\"\n type=\"text\"\n value={draft}\n onChange={(e) => setDraft(e.target.value)}\n onBlur={() => onCommit(draft)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') (e.target as HTMLInputElement).blur();\n if (e.key === 'Escape') {\n setDraft(display);\n (e.target as HTMLInputElement).blur();\n }\n }}\n aria-label={ariaLabel}\n spellCheck={false}\n />\n </label>\n );\n}\n\n// ── Field ─────────────────────────────────────────────────────────────────\n\nexport function SpacingField({ label, value, onChange }: SpacingFieldProps) {\n const sides = parseShorthand(value);\n // Pure user intent — pair view can show mixed values via comma notation,\n // so we never force-split based on data anymore.\n const [showSplit, setShowSplit] = useState(false);\n\n const writeSides = (next: Partial<Sides>) => {\n onChange(formatShorthand({ ...sides, ...next }));\n };\n\n const horizontalMixed = sides.left !== sides.right;\n const verticalMixed = sides.top !== sides.bottom;\n\n return (\n <div className=\"pa-prop-row pa-prop-row--compact pa-spacing-row\">\n <span className=\"pa-edit-field-label\">{label}</span>\n <div\n className={`pa-spacing-control ${\n showSplit ? 'pa-spacing-control--split' : 'pa-spacing-control--pair'\n }`}\n >\n {showSplit ? (\n // Grid mirrors pair-view columns:\n // Col 1 (horizontal pair) → L on top, R on bottom\n // Col 2 (vertical pair) → T on top, B on bottom\n <div className=\"pa-spacing-grid\">\n <Cell\n icon={<IconSide side=\"left\" />}\n display={displayNum(sides.left)}\n ariaLabel={`${label} left`}\n onCommit={(raw) => writeSides({ left: normalizeWrite(raw) })}\n />\n <Cell\n icon={<IconSide side=\"top\" />}\n display={displayNum(sides.top)}\n ariaLabel={`${label} top`}\n onCommit={(raw) => writeSides({ top: normalizeWrite(raw) })}\n />\n <Cell\n icon={<IconSide side=\"right\" />}\n display={displayNum(sides.right)}\n ariaLabel={`${label} right`}\n onCommit={(raw) => writeSides({ right: normalizeWrite(raw) })}\n />\n <Cell\n icon={<IconSide side=\"bottom\" />}\n display={displayNum(sides.bottom)}\n ariaLabel={`${label} bottom`}\n onCommit={(raw) => writeSides({ bottom: normalizeWrite(raw) })}\n />\n </div>\n ) : (\n <div className=\"pa-spacing-pair\">\n <Cell\n icon={<IconHorizontalPair />}\n display={formatPairDisplay(sides.left, sides.right)}\n mixed={horizontalMixed}\n ariaLabel={`${label} horizontal`}\n onCommit={(raw) => {\n const [left, right] = parsePairCommit(raw, sides.left);\n writeSides({ left, right });\n }}\n />\n <Cell\n icon={<IconVerticalPair />}\n display={formatPairDisplay(sides.top, sides.bottom)}\n mixed={verticalMixed}\n ariaLabel={`${label} vertical`}\n onCommit={(raw) => {\n const [top, bottom] = parsePairCommit(raw, sides.top);\n writeSides({ top, bottom });\n }}\n />\n </div>\n )}\n <button\n type=\"button\"\n className={`pa-spacing-toggle ${showSplit ? 'pa-spacing-toggle--on' : ''}`}\n onClick={() => setShowSplit((s) => !s)}\n aria-pressed={showSplit}\n aria-label={showSplit ? 'Collapse to pair view' : 'Expand to per-side view'}\n title={showSplit ? 'Collapse to pair view' : 'Expand to per-side view'}\n >\n <IconExpand />\n </button>\n </div>\n </div>\n );\n}\n","import type { ReactNode } from 'react';\n\nexport interface SegmentOption<T extends string> {\n value: T;\n title: string;\n content: ReactNode;\n}\n\ninterface SegmentedControlProps<T extends string> {\n options: SegmentOption<T>[];\n value?: T;\n ariaLabel: string;\n onChange?: (value: T) => void;\n}\n\n/** Single-choice segmented bar (align). */\nexport function SegmentedControl<T extends string>({\n options,\n value,\n ariaLabel,\n onChange,\n}: SegmentedControlProps<T>) {\n return (\n <div className=\"pa-segmented\" role=\"group\" aria-label={ariaLabel}>\n {options.map((opt) => (\n <button\n key={opt.value}\n type=\"button\"\n className={`pa-segmented-btn ${value === opt.value ? 'pa-segmented-btn--on' : ''}`}\n title={opt.title}\n aria-pressed={value === opt.value}\n aria-label={opt.title}\n onClick={() => onChange?.(opt.value)}\n >\n {opt.content}\n </button>\n ))}\n </div>\n );\n}\n\nexport interface MultiSegmentOption {\n id: string;\n title: string;\n content: ReactNode;\n pressed: boolean;\n}\n\ninterface MultiSegmentedControlProps {\n options: MultiSegmentOption[];\n ariaLabel: string;\n onToggle: (id: string) => void;\n}\n\n/** Multi-select segmented bar (bold / italic / underline / strike). */\nexport function MultiSegmentedControl({\n options,\n ariaLabel,\n onToggle,\n}: MultiSegmentedControlProps) {\n return (\n <div className=\"pa-segmented\" role=\"group\" aria-label={ariaLabel}>\n {options.map((opt) => (\n <button\n key={opt.id}\n type=\"button\"\n className={`pa-segmented-btn ${opt.pressed ? 'pa-segmented-btn--on' : ''}`}\n title={opt.title}\n aria-pressed={opt.pressed}\n aria-label={opt.title}\n onClick={() => onToggle(opt.id)}\n >\n {opt.content}\n </button>\n ))}\n </div>\n );\n}\n","interface IconProps {\n className?: string;\n}\n\nexport function IconAlignLeft({ className }: IconProps) {\n return (\n <svg className={className} width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n fill=\"currentColor\"\n d=\"M2 3h10v1.5H2V3zm0 3.5h7v1.5H2V6.5zm0 3.5h10v1.5H2V10zm0 3.5h7v1.5H2V13.5z\"\n />\n </svg>\n );\n}\n\nexport function IconAlignCenter({ className }: IconProps) {\n return (\n <svg className={className} width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n fill=\"currentColor\"\n d=\"M3 3h10v1.5H3V3zm1.5 3.5h7v1.5h-7V6.5zm-1.5 3.5h10v1.5H3V10zm1.5 3.5h7v1.5h-7V13.5z\"\n />\n </svg>\n );\n}\n\nexport function IconAlignRight({ className }: IconProps) {\n return (\n <svg className={className} width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n fill=\"currentColor\"\n d=\"M4 3h10v1.5H4V3zm3 3.5h7v1.5H7V6.5zm-3 3.5h10v1.5H4V10zm3 3.5h7v1.5H7V13.5z\"\n />\n </svg>\n );\n}\n\nexport function IconAlignJustify({ className }: IconProps) {\n return (\n <svg className={className} width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path fill=\"currentColor\" d=\"M2 3h12v1.5H2V3zm0 3.5h12v1.5H2V6.5zm0 3.5h12v1.5H2V10zm0 3.5h12v1.5H2V13.5z\" />\n </svg>\n );\n}\n\nexport function IconStrikethrough({ className }: IconProps) {\n return (\n <svg className={className} width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n fill=\"currentColor\"\n d=\"M11.2 9.25H4.8c.35 1.05 1.2 1.75 2.45 1.75 1.05 0 1.85-.45 2.2-1.15l1.35.55C10.15 11.85 8.7 12.5 7.25 12.5 4.85 12.5 3 10.85 3 8.5h1.5c0 1.55 1.15 2.75 2.75 2.75.55 0 1.05-.15 1.45-.4L3 7.5h10l-1.8 1.75z\"\n />\n </svg>\n );\n}\n","/** Numeric font-weight for bold toggle (400 ↔ 700). */\nexport function isBoldWeight(value: string): boolean {\n const n = parseInt(value.trim(), 10);\n if (Number.isFinite(n)) return n >= 600;\n return value.trim() === 'bold' || value.trim() === 'bolder';\n}\n\nexport function toggleBoldWeight(value: string): string {\n return isBoldWeight(value) ? '400' : '700';\n}\n\nexport function isItalicStyle(value: string): boolean {\n return value.trim() === 'italic' || value.trim() === 'oblique';\n}\n\nexport function toggleItalicStyle(value: string): string {\n return isItalicStyle(value) ? 'normal' : 'italic';\n}\n\nexport function hasTextDecoration(value: string, token: 'underline' | 'line-through'): boolean {\n return value.split(/\\s+/).includes(token);\n}\n\nexport function toggleTextDecoration(\n value: string,\n token: 'underline' | 'line-through'\n): string {\n const parts = new Set(\n value\n .trim()\n .split(/\\s+/)\n .filter((p) => p && p !== 'none')\n );\n if (parts.has(token)) parts.delete(token);\n else parts.add(token);\n return parts.size === 0 ? 'none' : Array.from(parts).join(' ');\n}\n\nexport type TextAlignValue = 'left' | 'center' | 'right' | 'justify';\n\nexport function normalizeTextAlign(value: string): TextAlignValue {\n const v = value.trim() as TextAlignValue;\n if (v === 'center' || v === 'right' || v === 'justify') return v;\n return 'left';\n}\n\nexport { colorToHexInput } from './colorModel.js';\n","import type { ElementState, TargetScope, TextEditKind } from '@pixelagent/shared';\nimport { ColorField } from './ColorField';\nimport { EditSection } from './EditSection';\nimport { FontFamilySelect } from './FontFamilySelect';\nimport { PropertyField } from './PropertyField';\nimport { SpacingField } from './SpacingField';\nimport { MultiSegmentedControl, SegmentedControl } from './SegmentedControl';\nimport {\n IconAlignCenter,\n IconAlignJustify,\n IconAlignLeft,\n IconAlignRight,\n IconStrikethrough,\n} from './TypographyIcons';\nimport {\n hasTextDecoration,\n isBoldWeight,\n isItalicStyle,\n normalizeTextAlign,\n toggleBoldWeight,\n toggleItalicStyle,\n toggleTextDecoration,\n type TextAlignValue,\n} from './styleUtils';\n\nconst BORDER_STYLE_OPTIONS = [\n 'none',\n 'solid',\n 'dashed',\n 'dotted',\n 'double',\n 'groove',\n 'ridge',\n 'inset',\n 'outset',\n] as const;\n\nconst DISPLAY_OPTIONS = [\n 'block',\n 'inline',\n 'inline-block',\n 'flex',\n 'inline-flex',\n 'grid',\n 'inline-grid',\n 'none',\n 'contents',\n] as const;\n\nconst FLEX_GRID_DISPLAYS = new Set(['flex', 'inline-flex', 'grid', 'inline-grid']);\n\nexport interface EditPropertiesPanelProps {\n values: Record<string, string>;\n onPropertyChange: (property: string, value: string) => void;\n textKind: TextEditKind;\n textValue: string;\n onTextChange: (value: string) => void;\n targetScope: TargetScope;\n onTargetScopeChange: (scope: TargetScope) => void;\n elementState: ElementState;\n onElementStateChange: (state: ElementState) => void;\n instanceCount: number;\n scopeHint?: string | null;\n stateHint?: string | null;\n}\n\nexport function EditPropertiesPanel({\n values,\n onPropertyChange,\n textKind,\n textValue,\n onTextChange,\n targetScope,\n onTargetScopeChange,\n elementState,\n onElementStateChange,\n instanceCount,\n scopeHint,\n stateHint,\n}: EditPropertiesPanelProps) {\n const fontWeight = values['font-weight'] ?? '';\n const fontStyle = values['font-style'] ?? 'normal';\n const textDecoration = values['text-decoration'] ?? 'none';\n const textAlign = normalizeTextAlign(values['text-align'] ?? 'left');\n\n const displayValue = values.display?.trim() ?? '';\n const showDisplay = Boolean(displayValue);\n const showGap = FLEX_GRID_DISPLAYS.has(displayValue);\n const displayOptions: string[] = [...DISPLAY_OPTIONS];\n if (\n displayValue &&\n !DISPLAY_OPTIONS.includes(displayValue as (typeof DISPLAY_OPTIONS)[number])\n ) {\n displayOptions.push(displayValue);\n }\n const rawGap = values.gap?.trim() ?? '';\n const gapValue = rawGap === 'normal' || rawGap === '' ? '0px' : rawGap;\n const borderStyle = values['border-style'] ?? 'none';\n const borderStyleOptions: string[] = [...BORDER_STYLE_OPTIONS];\n if (\n borderStyle &&\n !BORDER_STYLE_OPTIONS.includes(borderStyle as (typeof BORDER_STYLE_OPTIONS)[number])\n ) {\n borderStyleOptions.push(borderStyle);\n }\n\n return (\n <div className=\"pa-edit-sections\">\n <EditSection title=\"Targeting\" defaultOpen>\n <div className=\"pa-edit-field-grid pa-edit-field-grid--2\">\n <label className=\"pa-edit-mini-field\">\n <span className=\"pa-edit-field-label\">Scope</span>\n <select\n className=\"pa-select\"\n value={targetScope}\n onChange={(e) => onTargetScopeChange(e.target.value as TargetScope)}\n >\n <option value=\"this-instance\">This instance</option>\n <option value=\"all-instances\" disabled={instanceCount <= 1}>\n All ({instanceCount})\n </option>\n </select>\n </label>\n <label className=\"pa-edit-mini-field\">\n <span className=\"pa-edit-field-label\">State</span>\n <select\n className=\"pa-select\"\n value={elementState}\n onChange={(e) => onElementStateChange(e.target.value as ElementState)}\n >\n <option value=\"normal\">Normal</option>\n <option value=\"hover\">Hover</option>\n <option value=\"focus\">Focus</option>\n <option value=\"active\">Active</option>\n <option value=\"disabled\">Disabled</option>\n </select>\n </label>\n </div>\n {scopeHint ? <p className=\"pa-edit-inline-hint\">{scopeHint}</p> : null}\n {stateHint ? <p className=\"pa-edit-inline-hint\">{stateHint}</p> : null}\n </EditSection>\n\n {textKind !== 'none' && (\n <EditSection title=\"Content\" defaultOpen>\n <label className=\"pa-edit-stack-field\">\n <span className=\"pa-edit-field-label\">Text</span>\n <textarea\n className=\"pa-textarea pa-edit-text-input\"\n value={textValue}\n onChange={(e) => onTextChange(e.target.value)}\n rows={textKind === 'value' ? 2 : 3}\n placeholder=\"Edit visible text…\"\n />\n </label>\n </EditSection>\n )}\n\n <EditSection title=\"Typography\" defaultOpen>\n <FontFamilySelect\n value={values['font-family'] ?? ''}\n onChange={(v) => onPropertyChange('font-family', v)}\n />\n\n <div className=\"pa-edit-field-block\">\n <span className=\"pa-edit-field-label\">Style</span>\n <MultiSegmentedControl\n ariaLabel=\"Text style\"\n options={[\n {\n id: 'bold',\n title: 'Bold',\n pressed: isBoldWeight(fontWeight),\n content: <span className=\"pa-segmented-type pa-segmented-type--bold\">B</span>,\n },\n {\n id: 'italic',\n title: 'Italic',\n pressed: isItalicStyle(fontStyle),\n content: <span className=\"pa-segmented-type pa-segmented-type--italic\">I</span>,\n },\n {\n id: 'underline',\n title: 'Underline',\n pressed: hasTextDecoration(textDecoration, 'underline'),\n content: (\n <span className=\"pa-segmented-type pa-segmented-type--underline\">U</span>\n ),\n },\n {\n id: 'strikethrough',\n title: 'Strikethrough',\n pressed: hasTextDecoration(textDecoration, 'line-through'),\n content: <IconStrikethrough className=\"pa-segmented-icon\" />,\n },\n ]}\n onToggle={(id) => {\n if (id === 'bold') onPropertyChange('font-weight', toggleBoldWeight(fontWeight));\n else if (id === 'italic') onPropertyChange('font-style', toggleItalicStyle(fontStyle));\n else if (id === 'underline') {\n onPropertyChange(\n 'text-decoration',\n toggleTextDecoration(textDecoration, 'underline')\n );\n } else if (id === 'strikethrough') {\n onPropertyChange(\n 'text-decoration',\n toggleTextDecoration(textDecoration, 'line-through')\n );\n }\n }}\n />\n </div>\n\n <div className=\"pa-edit-field-block\">\n <span className=\"pa-edit-field-label\">Align</span>\n <SegmentedControl<TextAlignValue>\n ariaLabel=\"Text align\"\n value={textAlign}\n onChange={(v) => onPropertyChange('text-align', v)}\n options={[\n {\n value: 'left',\n title: 'Align left',\n content: <IconAlignLeft className=\"pa-segmented-icon\" />,\n },\n {\n value: 'center',\n title: 'Align center',\n content: <IconAlignCenter className=\"pa-segmented-icon\" />,\n },\n {\n value: 'right',\n title: 'Align right',\n content: <IconAlignRight className=\"pa-segmented-icon\" />,\n },\n {\n value: 'justify',\n title: 'Justify',\n content: <IconAlignJustify className=\"pa-segmented-icon\" />,\n },\n ]}\n />\n </div>\n\n <div className=\"pa-edit-field-grid pa-edit-field-grid--2 pa-edit-size-row\">\n <PropertyField\n compact\n property=\"font-size\"\n label=\"Font size (px)\"\n value={values['font-size'] ?? ''}\n onChange={(v) => onPropertyChange('font-size', v)}\n />\n <PropertyField\n compact\n property=\"line-height\"\n label=\"Line height (px)\"\n value={values['line-height'] ?? ''}\n onChange={(v) => onPropertyChange('line-height', v)}\n />\n </div>\n <ColorField\n label=\"Color\"\n value={values.color ?? ''}\n onChange={(v) => onPropertyChange('color', v)}\n />\n </EditSection>\n\n <EditSection title=\"Layout\" defaultOpen>\n <div className=\"pa-edit-split-fields\">\n <PropertyField\n compact\n property=\"width\"\n label=\"Width\"\n value={values.width ?? ''}\n onChange={(v) => onPropertyChange('width', v)}\n />\n <PropertyField\n compact\n property=\"height\"\n label=\"Height\"\n value={values.height ?? ''}\n onChange={(v) => onPropertyChange('height', v)}\n />\n </div>\n <SpacingField\n property=\"padding\"\n label=\"Padding\"\n value={values.padding ?? ''}\n onChange={(v) => onPropertyChange('padding', v)}\n />\n <SpacingField\n property=\"margin\"\n label=\"Margin\"\n value={values.margin ?? ''}\n onChange={(v) => onPropertyChange('margin', v)}\n />\n {showDisplay && (\n <label className=\"pa-prop-row pa-prop-row--compact\">\n <span className=\"pa-edit-field-label\">Display</span>\n <select\n className=\"pa-select\"\n value={displayValue}\n onChange={(e) => onPropertyChange('display', e.target.value)}\n >\n {displayOptions.map((opt) => (\n <option key={opt} value={opt}>\n {opt}\n </option>\n ))}\n </select>\n </label>\n )}\n {showGap && (\n <PropertyField\n compact\n property=\"gap\"\n label=\"Gap\"\n value={gapValue}\n onChange={(v) => onPropertyChange('gap', v)}\n />\n )}\n </EditSection>\n\n <EditSection title=\"Fill\">\n <ColorField\n label=\"Background\"\n value={values['background-color'] ?? ''}\n onChange={(v) => onPropertyChange('background-color', v)}\n />\n <PropertyField\n compact\n property=\"opacity\"\n label=\"Opacity\"\n value={values.opacity ?? ''}\n onChange={(v) => onPropertyChange('opacity', v)}\n />\n </EditSection>\n\n <EditSection title=\"Border\" defaultOpen>\n <ColorField\n label=\"Border color\"\n value={values['border-color'] ?? ''}\n onChange={(v) => onPropertyChange('border-color', v)}\n />\n <label className=\"pa-edit-stack-field\">\n <span className=\"pa-edit-field-label\">Style</span>\n <select\n className=\"pa-select\"\n value={borderStyle}\n onChange={(e) => onPropertyChange('border-style', e.target.value)}\n >\n {borderStyleOptions.map((style) => (\n <option key={style} value={style}>\n {style}\n </option>\n ))}\n </select>\n </label>\n <PropertyField\n compact\n property=\"border-width\"\n label=\"Stroke width (px)\"\n value={values['border-width'] ?? ''}\n onChange={(v) => onPropertyChange('border-width', v)}\n />\n <PropertyField\n compact\n property=\"border-radius\"\n label=\"Radius (px)\"\n value={values['border-radius'] ?? ''}\n onChange={(v) => onPropertyChange('border-radius', v)}\n />\n </EditSection>\n </div>\n );\n}\n","import { useCallback, useEffect, useRef, useState } from 'react';\nimport type { ElementState, StyleChange, TargetScope } from '@pixelagent/shared';\nimport {\n applyTailwindStatePreview,\n captureInlineStyles,\n captureTextSnapshot,\n clearTailwindStatePreview,\n getEditableTextInfo,\n getPreviewTargets,\n getRelevantComputedStyles,\n restoreInlineStyles,\n restoreTextSnapshot,\n setEditableTextPreview,\n type InlineStyleSnapshot,\n type TextEditKind,\n type TextSnapshot,\n} from '@pixelagent/shared';\nimport { hasPositiveBorderWidth } from './propertyControls.js';\n\nconst MAX_UNDO = 50;\n\nconst STYLE_PROP_KEYS = [\n 'font-family',\n 'font-size',\n 'font-weight',\n 'font-style',\n 'line-height',\n 'text-align',\n 'text-decoration',\n 'color',\n 'background-color',\n 'padding',\n 'margin',\n 'width',\n 'height',\n 'gap',\n 'display',\n 'border-width',\n 'border-style',\n 'border-color',\n 'border-radius',\n 'opacity',\n] as const;\n\ninterface HistoryFrame {\n inline: InlineStyleSnapshot[];\n text: TextSnapshot | null;\n}\n\nexport interface EditPreviewApi {\n clearPreviews: () => void;\n revertPreviews: () => void;\n}\n\nexport function useEditPreview(\n selectedElement: Element | null,\n targetScope: TargetScope,\n elementState: ElementState\n) {\n const targetsRef = useRef<HTMLElement[]>([]);\n const touchedRef = useRef<Set<HTMLElement>>(new Set());\n const initialInlineRef = useRef<InlineStyleSnapshot[]>([]);\n const initialTextRef = useRef<TextSnapshot | null>(null);\n const undoStackRef = useRef<HistoryFrame[]>([]);\n\n const [values, setValues] = useState<Record<string, string>>({});\n const [originalValues, setOriginalValues] = useState<Record<string, string>>({});\n const [textKind, setTextKind] = useState<TextEditKind>('none');\n const [textValue, setTextValue] = useState('');\n const [originalText, setOriginalText] = useState('');\n // Pending changes are kept per-element so switching layers does not wipe\n // in-progress edits. The badge sums across all tracked elements; Apply\n // iterates entries to dispatch one payload per element.\n const [pendingByElement, setPendingByElement] = useState<Map<Element, StyleChange[]>>(\n () => new Map()\n );\n const [canUndo, setCanUndo] = useState(false);\n\n const captureFrame = useCallback((): HistoryFrame => {\n const elements = Array.from(touchedRef.current);\n return {\n inline: captureInlineStyles(elements, [...STYLE_PROP_KEYS]),\n text:\n selectedElement && textKind !== 'none'\n ? captureTextSnapshot(selectedElement as HTMLElement, textKind)\n : null,\n };\n }, [selectedElement, textKind]);\n\n const pushUndo = useCallback(() => {\n undoStackRef.current.push(captureFrame());\n if (undoStackRef.current.length > MAX_UNDO) {\n undoStackRef.current.shift();\n }\n setCanUndo(undoStackRef.current.length > 0);\n }, [captureFrame]);\n\n const syncTargets = useCallback(\n (reapplyPending: boolean) => {\n if (!selectedElement) return;\n\n const prevTouched = Array.from(touchedRef.current);\n restoreInlineStyles(initialInlineRef.current.filter((s) => prevTouched.includes(s.element)));\n if (initialTextRef.current) {\n restoreTextSnapshot(initialTextRef.current);\n }\n\n const targets = getPreviewTargets(selectedElement, targetScope);\n targetsRef.current = targets;\n touchedRef.current = new Set(targets);\n\n clearTailwindStatePreview(prevTouched);\n applyTailwindStatePreview(targets, elementState);\n\n const currentPending = selectedElement\n ? (pendingByElement.get(selectedElement) ?? [])\n : [];\n if (reapplyPending && currentPending.length > 0) {\n for (const change of currentPending) {\n if (change.property === 'textContent' || change.property === 'value') {\n for (const el of targets) {\n setEditableTextPreview(el, change.property as TextEditKind, change.newValue);\n }\n } else {\n for (const el of targets) {\n el.style.setProperty(change.property, change.newValue);\n }\n }\n }\n }\n },\n [selectedElement, targetScope, elementState, pendingByElement]\n );\n\n useEffect(() => {\n if (!selectedElement) {\n targetsRef.current = [];\n touchedRef.current = new Set();\n initialInlineRef.current = [];\n initialTextRef.current = null;\n undoStackRef.current = [];\n setValues({});\n setOriginalValues({});\n setTextKind('none');\n setTextValue('');\n setOriginalText('');\n setPendingByElement(new Map());\n setCanUndo(false);\n return;\n }\n\n const targets = getPreviewTargets(selectedElement, targetScope);\n targetsRef.current = targets;\n touchedRef.current = new Set(targets);\n initialInlineRef.current = captureInlineStyles(targets, [...STYLE_PROP_KEYS]);\n undoStackRef.current = [];\n setCanUndo(false);\n\n const styles = getRelevantComputedStyles(selectedElement);\n setValues(styles);\n setOriginalValues(styles);\n\n const textInfo = getEditableTextInfo(selectedElement);\n setTextKind(textInfo.kind);\n setTextValue(textInfo.value);\n setOriginalText(textInfo.value);\n initialTextRef.current =\n textInfo.kind !== 'none'\n ? captureTextSnapshot(selectedElement as HTMLElement, textInfo.kind)\n : null;\n\n // Intentionally NOT clearing pendingByElement on element switch — pending\n // edits on other elements stay tracked so the badge accumulates across\n // layers and switching back restores in-progress work.\n applyTailwindStatePreview(targets, elementState);\n\n return () => clearTailwindStatePreview(targets);\n }, [selectedElement]);\n\n useEffect(() => {\n if (!selectedElement) return;\n syncTargets(true);\n }, [targetScope]);\n\n useEffect(() => {\n if (!selectedElement) return;\n const targets = getPreviewTargets(selectedElement, targetScope);\n targetsRef.current = targets;\n clearTailwindStatePreview(Array.from(touchedRef.current));\n applyTailwindStatePreview(targets, elementState);\n touchedRef.current = new Set(targets);\n }, [elementState, selectedElement, targetScope]);\n\n const upsertChange = useCallback(\n (property: string, oldValue: string, newValue: string) => {\n if (!selectedElement) return;\n setPendingByElement((prev) => {\n const next = new Map(prev);\n const existing = next.get(selectedElement) ?? [];\n const filtered = existing.filter((c) => c.property !== property);\n if (newValue === oldValue) {\n if (filtered.length === 0) {\n next.delete(selectedElement);\n } else {\n next.set(selectedElement, filtered);\n }\n } else {\n next.set(selectedElement, [...filtered, { property, oldValue, newValue }]);\n }\n return next;\n });\n },\n [selectedElement]\n );\n\n const updateProperty = useCallback(\n (property: string, newValue: string) => {\n if (!selectedElement) return;\n\n const batch: Record<string, string> = { [property]: newValue };\n if (\n property === 'border-width' &&\n (values['border-style'] ?? 'none') === 'none' &&\n hasPositiveBorderWidth(newValue)\n ) {\n batch['border-style'] = 'solid';\n }\n\n pushUndo();\n setValues((prev) => ({ ...prev, ...batch }));\n for (const [prop, val] of Object.entries(batch)) {\n const oldValue = originalValues[prop] ?? '';\n for (const el of targetsRef.current) {\n el.style.setProperty(prop, val);\n touchedRef.current.add(el);\n }\n upsertChange(prop, oldValue, val);\n }\n },\n [selectedElement, originalValues, values, pushUndo, upsertChange]\n );\n\n const updateText = useCallback(\n (newValue: string) => {\n if (!selectedElement || textKind === 'none') return;\n pushUndo();\n setTextValue(newValue);\n for (const el of targetsRef.current) {\n setEditableTextPreview(el, textKind, newValue);\n touchedRef.current.add(el);\n }\n upsertChange(textKind, originalText, newValue);\n },\n [selectedElement, textKind, originalText, pushUndo, upsertChange]\n );\n\n const undo = useCallback(() => {\n const frame = undoStackRef.current.pop();\n if (!frame) return;\n restoreInlineStyles(frame.inline);\n if (frame.text) restoreTextSnapshot(frame.text);\n setCanUndo(undoStackRef.current.length > 0);\n\n if (selectedElement) {\n setValues(getRelevantComputedStyles(selectedElement));\n const textInfo = getEditableTextInfo(selectedElement);\n if (textInfo.kind !== 'none') setTextValue(textInfo.value);\n }\n }, [selectedElement]);\n\n const reset = useCallback(() => {\n restoreInlineStyles(initialInlineRef.current);\n if (initialTextRef.current) restoreTextSnapshot(initialTextRef.current);\n undoStackRef.current = [];\n setCanUndo(false);\n setPendingByElement(new Map());\n if (selectedElement) {\n setValues(getRelevantComputedStyles(selectedElement));\n const textInfo = getEditableTextInfo(selectedElement);\n setTextValue(textInfo.value);\n }\n }, [selectedElement]);\n\n const revertPreviews = useCallback(() => {\n restoreInlineStyles(initialInlineRef.current);\n if (initialTextRef.current) restoreTextSnapshot(initialTextRef.current);\n }, []);\n\n const clearPreviews = useCallback(() => {\n revertPreviews();\n clearTailwindStatePreview(Array.from(touchedRef.current));\n undoStackRef.current = [];\n setCanUndo(false);\n setPendingByElement(new Map());\n if (selectedElement) {\n setValues(getRelevantComputedStyles(selectedElement));\n const textInfo = getEditableTextInfo(selectedElement);\n if (textInfo.kind !== 'none') setTextValue(textInfo.value);\n }\n }, [revertPreviews, selectedElement]);\n\n const currentPending = selectedElement\n ? (pendingByElement.get(selectedElement) ?? [])\n : [];\n\n let totalPendingCount = 0;\n for (const arr of pendingByElement.values()) totalPendingCount += arr.length;\n\n const clearAllPending = useCallback(() => {\n setPendingByElement(new Map());\n }, []);\n\n return {\n values,\n textKind,\n textValue,\n pendingChanges: currentPending,\n pendingByElement,\n totalPendingCount,\n clearAllPending,\n canUndo,\n updateProperty,\n updateText,\n undo,\n reset,\n clearPreviews,\n revertPreviews,\n };\n}\n","import { useCallback, useEffect, useMemo } from 'react';\nimport type { ElementState, StyleChange, TargetScope } from '@pixelagent/shared';\nimport {\n countElementInstances,\n detectStylingSystem,\n getCssSelector,\n getElementDisplayLabel,\n getPreviewTargets,\n getScopeSelector,\n readReactSource,\n} from '@pixelagent/shared';\nimport { ElementOverlay } from '../annotate/ElementOverlay';\nimport { GlassButton, GlassPanel } from '../glass';\nimport { useDraggable } from '../hooks/useDraggable';\nimport { IconReset, IconUndo } from './EditActionIcons';\nimport { EditPropertiesPanel } from './EditPropertiesPanel';\nimport type { EditPreviewApi } from './useEditPreview';\nimport { useEditPreview } from './useEditPreview';\n\ninterface EditPanelProps {\n selectedElement: Element | null;\n hoveredElement: Element | null;\n onSelectElement: (el: Element | null) => void;\n onHoverElement: (el: Element | null) => void;\n targetScope: TargetScope;\n onTargetScopeChange: (scope: TargetScope) => void;\n elementState: ElementState;\n onElementStateChange: (state: ElementState) => void;\n onApply: (pendingByElement: Map<Element, StyleChange[]>) => Promise<boolean>;\n applyStatus: string | null;\n isToolbarTarget: (target: EventTarget | null) => boolean;\n onPreviewApi?: (api: EditPreviewApi | null) => void;\n}\n\nexport function EditPanel({\n selectedElement,\n hoveredElement,\n onSelectElement,\n onHoverElement,\n targetScope,\n onTargetScopeChange,\n elementState,\n onElementStateChange,\n onApply,\n applyStatus,\n isToolbarTarget,\n onPreviewApi,\n}: EditPanelProps) {\n const {\n values,\n textKind,\n textValue,\n pendingChanges,\n pendingByElement,\n totalPendingCount,\n clearAllPending,\n canUndo,\n updateProperty,\n updateText,\n undo,\n reset,\n clearPreviews,\n revertPreviews,\n } = useEditPreview(selectedElement, targetScope, elementState);\n\n const { elementRef: panelRef, isDragging, style, dragHandleProps } = useDraggable({\n computeDefaultPosition: (rect) => ({\n x: window.innerWidth - rect.width - 16,\n y: 16,\n }),\n });\n\n useEffect(() => {\n onPreviewApi?.({ clearPreviews, revertPreviews });\n return () => onPreviewApi?.(null);\n }, [onPreviewApi, clearPreviews, revertPreviews]);\n\n const handleMouseMove = useCallback(\n (e: MouseEvent) => {\n if (isToolbarTarget(e.target)) return;\n\n const elements = document.elementsFromPoint(e.clientX, e.clientY);\n const target = elements.find(\n (el) =>\n el instanceof Element &&\n !el.closest(\n '[data-pixelagent-root],[data-pixelagent-toolbar-portal],[data-pixelagent-picker-portal]'\n )\n );\n onHoverElement(target ?? null);\n },\n [isToolbarTarget, onHoverElement]\n );\n\n const handleClick = useCallback(\n (e: MouseEvent) => {\n if (isToolbarTarget(e.target)) return;\n\n e.preventDefault();\n e.stopPropagation();\n\n const elements = document.elementsFromPoint(e.clientX, e.clientY);\n const target = elements.find(\n (el) =>\n el instanceof Element &&\n !el.closest(\n '[data-pixelagent-root],[data-pixelagent-toolbar-portal],[data-pixelagent-picker-portal]'\n )\n );\n onSelectElement(target ?? null);\n },\n [isToolbarTarget, onSelectElement]\n );\n\n useEffect(() => {\n document.addEventListener('mousemove', handleMouseMove, true);\n document.addEventListener('click', handleClick, true);\n return () => {\n document.removeEventListener('mousemove', handleMouseMove, true);\n document.removeEventListener('click', handleClick, true);\n };\n }, [handleMouseMove, handleClick]);\n\n const handleApply = async () => {\n if (totalPendingCount === 0) return;\n const applied = await onApply(pendingByElement);\n if (!applied) return;\n // Pending edits are now in source. Drop the in-memory tracker and clear\n // the inline preview overrides so the element renders from the patched\n // source (incl. the sidecar :hover rule), instead of staying stuck on\n // the preview colour.\n clearAllPending();\n revertPreviews();\n };\n\n const source = selectedElement ? readReactSource(selectedElement) : null;\n const stylingSystem = selectedElement ? detectStylingSystem(selectedElement) : null;\n const instanceCount = selectedElement ? countElementInstances(selectedElement) : 0;\n const scopeSelector = selectedElement\n ? getScopeSelector(selectedElement, 'all-instances')\n : '';\n\n const stateHint =\n elementState !== 'normal' && stylingSystem === 'tailwind'\n ? 'Tailwind variant preview: matching hover:/focus:/… classes are applied without the prefix.'\n : elementState !== 'normal'\n ? 'State preview uses focus/disabled simulation where possible.'\n : null;\n\n const scopeHint =\n instanceCount > 1\n ? targetScope === 'all-instances'\n ? `Preview & Apply on ${instanceCount} elements (${scopeSelector}).`\n : `This instance only — ${instanceCount - 1} other on page.`\n : targetScope === 'all-instances'\n ? 'Only one match — scope has no effect.'\n : null;\n\n const scopeMatchedElements = useMemo(() => {\n if (!selectedElement || targetScope !== 'all-instances') return [];\n return getPreviewTargets(selectedElement, 'all-instances');\n }, [selectedElement, targetScope]);\n\n return (\n <>\n <ElementOverlay\n element={targetScope === 'all-instances' ? null : hoveredElement}\n selected={selectedElement}\n multiSelected={scopeMatchedElements}\n primarySelected={selectedElement}\n />\n\n <div\n ref={panelRef}\n className={`pa-edit-panel-float ${isDragging ? 'pa-edit-panel-float--dragging' : ''}`}\n style={style}\n >\n <GlassPanel variant=\"sheet\" side=\"right\" className=\"pa-edit-panel-glass\">\n <div className=\"pa-edit-panel-inner\">\n <div className=\"pa-edit-panel-header\">\n <button\n type=\"button\"\n className=\"pa-edit-panel-drag\"\n aria-label=\"Drag edit panel\"\n title=\"Drag to move\"\n {...dragHandleProps}\n >\n <span className=\"pa-edit-panel-grip\" aria-hidden=\"true\">\n <span /><span /><span /><span /><span /><span />\n </span>\n </button>\n <h3 className=\"pa-edit-title\">Edit</h3>\n </div>\n\n {!selectedElement ? (\n <p className=\"pa-edit-hint\">Click an element to edit its text and styles.</p>\n ) : (\n <>\n <div className=\"pa-edit-meta\">\n <code\n className=\"pa-edit-meta-label\"\n title={`This instance: ${getCssSelector(selectedElement)}\\nAll instances: ${scopeSelector}`}\n >\n {getElementDisplayLabel(selectedElement)}\n </code>\n {(source?.sourceFile || stylingSystem) && (\n <span className=\"pa-edit-source\">\n {source?.sourceFile && (\n <>\n {source.sourceFile}\n {source.lineNumber ? `:${source.lineNumber}` : ''}\n </>\n )}\n {source?.sourceFile && stylingSystem ? ' · ' : ''}\n {stylingSystem ?? ''}\n </span>\n )}\n </div>\n\n <div className=\"pa-edit-panel-scroll\">\n <EditPropertiesPanel\n values={values}\n onPropertyChange={updateProperty}\n textKind={textKind}\n textValue={textValue}\n onTextChange={updateText}\n targetScope={targetScope}\n onTargetScopeChange={onTargetScopeChange}\n elementState={elementState}\n onElementStateChange={onElementStateChange}\n instanceCount={instanceCount}\n scopeHint={scopeHint}\n stateHint={stateHint}\n />\n </div>\n\n <div className=\"pa-edit-panel-sticky\">\n <div className=\"pa-edit-actions\">\n <GlassButton variant=\"regular\" onClick={undo} disabled={!canUndo}>\n <span className=\"pa-glass-btn-inner\">\n <IconUndo className=\"pa-glass-btn-icon\" />\n <span>Undo</span>\n </span>\n </GlassButton>\n <GlassButton\n variant=\"regular\"\n onClick={reset}\n disabled={pendingChanges.length === 0}\n >\n <span className=\"pa-glass-btn-inner\">\n <IconReset className=\"pa-glass-btn-icon\" />\n <span>Reset</span>\n </span>\n </GlassButton>\n </div>\n\n <div className=\"pa-edit-footer\">\n <span\n className={\n applyStatus\n ? /fail/i.test(applyStatus)\n ? 'pa-change-count pa-change-count--error'\n : 'pa-change-count pa-change-count--success'\n : 'pa-change-count'\n }\n >\n {applyStatus ??\n `${totalPendingCount} pending change${totalPendingCount !== 1 ? 's' : ''}`}\n </span>\n <GlassButton\n variant=\"glass-primary\"\n onClick={handleApply}\n disabled={totalPendingCount === 0}\n title={\n source?.sourceFile\n ? undefined\n : 'No source file — Apply copies selector + changes to clipboard'\n }\n >\n Apply\n </GlassButton>\n </div>\n </div>\n </>\n )}\n </div>\n </GlassPanel>\n </div>\n </>\n );\n}\n","import type { ApplyPayload, ApplyVisualDiffResult } from '@pixelagent/shared';\nimport { copyToClipboard } from '@pixelagent/shared';\n\nexport type ApplyTransportResult =\n | { mode: 'mcp'; result: ApplyVisualDiffResult }\n | { mode: 'clipboard' }\n | { mode: 'error'; message: string };\n\nexport interface SubmitApplyOptions {\n applyEndpoint?: string;\n onApply?: (payload: ApplyPayload) => Promise<ApplyVisualDiffResult | null>;\n}\n\nexport async function submitApply(\n payload: ApplyPayload,\n options: SubmitApplyOptions = {}\n): Promise<ApplyTransportResult> {\n if (options.onApply) {\n try {\n const result = await options.onApply(payload);\n if (result) return { mode: 'mcp', result };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { mode: 'error', message };\n }\n }\n\n const endpoint = options.applyEndpoint;\n if (endpoint) {\n try {\n const res = await fetch(endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ payload }),\n });\n const data = (await res.json()) as ApplyVisualDiffResult & { error?: string };\n if (!res.ok) {\n return { mode: 'error', message: data.error ?? res.statusText };\n }\n return { mode: 'mcp', result: data };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { mode: 'error', message };\n }\n }\n\n await copyToClipboard(JSON.stringify(payload, null, 2));\n return { mode: 'clipboard' };\n}\n\n/**\n * Two outcomes only: applied or failed. Anything that didn't actually write\n * source (errors, clipboard fallback, partial-success without lines changed)\n * collapses to \"Apply failed\". Detail goes to the console for debugging.\n */\nexport function formatApplyFeedback(transport: ApplyTransportResult): string {\n if (\n transport.mode === 'mcp' &&\n transport.result.success &&\n transport.result.linesChanged.length > 0\n ) {\n if (transport.result.warnings?.length) {\n console.warn('[pixelagent] Apply succeeded with warnings:', transport.result.warnings);\n }\n return 'Change applied';\n }\n\n if (transport.mode === 'error') {\n console.error('[pixelagent] Apply failed:', transport.message);\n } else if (transport.mode === 'mcp') {\n console.warn('[pixelagent] Apply reported no changes:', transport.result);\n } else {\n console.warn('[pixelagent] Apply fell back to clipboard — no source patched');\n }\n return 'Apply failed';\n}\n","import { useEffect, useState } from 'react';\n\nexport function useElementRect(target: Element | null): DOMRect | null {\n const [rect, setRect] = useState<DOMRect | null>(null);\n\n useEffect(() => {\n if (!target) {\n setRect(null);\n return;\n }\n\n const update = () => setRect(target.getBoundingClientRect());\n\n update();\n\n const observer = new ResizeObserver(update);\n observer.observe(target);\n window.addEventListener('scroll', update, true);\n window.addEventListener('resize', update);\n\n return () => {\n observer.disconnect();\n window.removeEventListener('scroll', update, true);\n window.removeEventListener('resize', update);\n };\n }, [target]);\n\n return rect;\n}\n","const VIEWPORT_MARGIN = 8;\nconst ANCHOR_GAP = 8;\nconst TOOLBAR_PAD = 12;\nconst DEFAULT_PANEL_WIDTH = 300;\nconst DEFAULT_PANEL_HEIGHT = 280;\n\ntype Box = {\n top: number;\n left: number;\n right: number;\n bottom: number;\n width: number;\n height: number;\n};\n\nfunction positionToBox(top: number, left: number, width: number, height: number): Box {\n return {\n top,\n left,\n right: left + width,\n bottom: top + height,\n width,\n height,\n };\n}\n\nfunction boxesOverlap(a: Box, b: Box): boolean {\n return a.left < b.right && a.right > b.left && a.top < b.bottom && a.bottom > b.top;\n}\n\nfunction inflateRect(rect: DOMRect, pad: number): Box {\n return {\n top: rect.top - pad,\n left: rect.left - pad,\n right: rect.right + pad,\n bottom: rect.bottom + pad,\n width: rect.width + pad * 2,\n height: rect.height + pad * 2,\n };\n}\n\n/** Floating toolbar portal — treat as a no-go zone for the annotate popover. */\nexport function getToolbarObstacle(): Box | null {\n if (typeof document === 'undefined') return null;\n const toolbar = document.querySelector(\n '[data-pixelagent-toolbar-portal] .pa-toolbar-float'\n );\n if (!toolbar) return null;\n return inflateRect(toolbar.getBoundingClientRect(), TOOLBAR_PAD);\n}\n\nfunction clampHorizontal(left: number, panelWidth: number): number {\n return Math.min(\n Math.max(VIEWPORT_MARGIN, left),\n window.innerWidth - panelWidth - VIEWPORT_MARGIN\n );\n}\n\nfunction clampVertical(top: number, panelHeight: number): number {\n return Math.min(\n Math.max(VIEWPORT_MARGIN, top),\n window.innerHeight - panelHeight - VIEWPORT_MARGIN\n );\n}\n\nfunction fitsViewport(box: Box): boolean {\n return (\n box.top >= VIEWPORT_MARGIN &&\n box.left >= VIEWPORT_MARGIN &&\n box.right <= window.innerWidth - VIEWPORT_MARGIN &&\n box.bottom <= window.innerHeight - VIEWPORT_MARGIN\n );\n}\n\nfunction isValidPlacement(box: Box, obstacle: Box | null): boolean {\n if (obstacle && boxesOverlap(box, obstacle)) return false;\n return fitsViewport(box);\n}\n\n/**\n * Place the annotate note popover beside the anchor without covering the toolbar.\n * Prefers above when the anchor sits in the lower half of the viewport.\n */\nexport function computeAnnotationPopoverPosition(\n anchorRect: DOMRect,\n panelWidth = DEFAULT_PANEL_WIDTH,\n panelHeight = DEFAULT_PANEL_HEIGHT\n): { top: number; left: number } {\n const obstacle = getToolbarObstacle();\n const preferAbove = anchorRect.top > window.innerHeight * 0.45;\n\n const candidates: Array<{ placement: 'below' | 'above' | 'right' | 'left'; top: number; left: number }> =\n preferAbove\n ? [\n { placement: 'above', top: anchorRect.top - panelHeight - ANCHOR_GAP, left: anchorRect.left },\n { placement: 'below', top: anchorRect.bottom + ANCHOR_GAP, left: anchorRect.left },\n { placement: 'right', top: anchorRect.top, left: anchorRect.right + ANCHOR_GAP },\n { placement: 'left', top: anchorRect.top, left: anchorRect.left - panelWidth - ANCHOR_GAP },\n ]\n : [\n { placement: 'below', top: anchorRect.bottom + ANCHOR_GAP, left: anchorRect.left },\n { placement: 'above', top: anchorRect.top - panelHeight - ANCHOR_GAP, left: anchorRect.left },\n { placement: 'right', top: anchorRect.top, left: anchorRect.right + ANCHOR_GAP },\n { placement: 'left', top: anchorRect.top, left: anchorRect.left - panelWidth - ANCHOR_GAP },\n ];\n\n for (const { top, left } of candidates) {\n const box = positionToBox(\n clampVertical(top, panelHeight),\n clampHorizontal(left, panelWidth),\n panelWidth,\n panelHeight\n );\n if (isValidPlacement(box, obstacle)) {\n return { top: box.top, left: box.left };\n }\n }\n\n // Fallback: nudge away from toolbar, prefer above anchor\n let top = clampVertical(anchorRect.top - panelHeight - ANCHOR_GAP, panelHeight);\n let left = clampHorizontal(anchorRect.left, panelWidth);\n\n if (obstacle) {\n let box = positionToBox(top, left, panelWidth, panelHeight);\n if (boxesOverlap(box, obstacle)) {\n top = clampVertical(obstacle.top - panelHeight - ANCHOR_GAP, panelHeight);\n box = positionToBox(top, left, panelWidth, panelHeight);\n }\n if (boxesOverlap(box, obstacle)) {\n top = clampVertical(anchorRect.bottom + ANCHOR_GAP, panelHeight);\n left = clampHorizontal(\n Math.min(anchorRect.left, obstacle.left - panelWidth - ANCHOR_GAP),\n panelWidth\n );\n }\n }\n\n return { top, left };\n}\n","import { useEffect, useRef, useState } from 'react';\nimport {\n getEditableTextInfo,\n getElementDisplayLabel,\n getWindowSelectionText,\n} from '@pixelagent/shared';\nimport { GlassButton, GlassPanel } from '../glass';\nimport { useElementRect } from '../hooks/useElementRect';\nimport { computeAnnotationPopoverPosition } from './popoverPosition';\n\ninterface AnnotationPopoverProps {\n elements: Element[];\n areaBbox?: { x: number; y: number; width: number; height: number };\n onSubmit: (note: string, continuous: boolean) => void;\n onCancel: () => void;\n}\n\nexport function AnnotationPopover({\n elements,\n areaBbox,\n onSubmit,\n onCancel,\n}: AnnotationPopoverProps) {\n const [note, setNote] = useState('');\n const inputRef = useRef<HTMLTextAreaElement>(null);\n const panelRef = useRef<HTMLDivElement>(null);\n const primary = elements[0] ?? null;\n\n const anchorRect = areaBbox\n ? new DOMRect(areaBbox.x, areaBbox.y, areaBbox.width, areaBbox.height)\n : null;\n const elementRect = useElementRect(primary);\n const rect = anchorRect ?? elementRect;\n\n const selectedText = getWindowSelectionText();\n const textInfo = primary ? getEditableTextInfo(primary) : { kind: 'none' as const, value: '' };\n const elementText = textInfo.kind !== 'none' ? textInfo.value : undefined;\n\n useEffect(() => {\n inputRef.current?.focus();\n }, [elements]);\n\n useEffect(() => {\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onCancel();\n };\n document.addEventListener('keydown', onKeyDown);\n return () => document.removeEventListener('keydown', onKeyDown);\n }, [onCancel]);\n\n if (!rect) return null;\n\n const pos = computeAnnotationPopoverPosition(rect);\n const selectorLabel =\n elements.length > 1\n ? `${elements.length} selected`\n : primary\n ? getElementDisplayLabel(primary)\n : 'Area selection';\n\n const handleSubmit = (continuous: boolean) => {\n if (note.trim()) onSubmit(note, continuous);\n };\n\n return (\n <GlassPanel\n variant=\"popover\"\n style={{ top: pos.top, left: pos.left }}\n >\n <div\n ref={panelRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Add annotation\"\n className=\"pa-popover-body\"\n >\n <div className=\"pa-popover-header\">\n <span className=\"pa-popover-selector\">{selectorLabel}</span>\n </div>\n\n {(selectedText || elementText) && (\n <div className=\"pa-popover-context\">\n {selectedText && (\n <p className=\"pa-popover-context-line\">\n <span className=\"pa-popover-context-label\">Selected</span>\n {selectedText}\n </p>\n )}\n {elementText && elementText !== selectedText && (\n <p className=\"pa-popover-context-line\">\n <span className=\"pa-popover-context-label\">Element</span>\n {elementText}\n </p>\n )}\n </div>\n )}\n\n <label className=\"pa-label\">\n Note\n <textarea\n ref={inputRef}\n className=\"pa-textarea\"\n value={note}\n onChange={(e) => setNote(e.target.value)}\n placeholder=\"Describe the change...\"\n rows={3}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) {\n e.preventDefault();\n handleSubmit(e.shiftKey);\n }\n if (e.key === 'Escape') onCancel();\n }}\n />\n </label>\n\n <p className=\"pa-popover-hint\">⌘↵ Add · ⇧⌘↵ Add &amp; next · Esc Cancel</p>\n\n <div className=\"pa-popover-actions\">\n <GlassButton variant=\"ghost\" onClick={onCancel}>\n Cancel\n </GlassButton>\n <GlassButton\n variant=\"ghost\"\n onClick={() => handleSubmit(true)}\n disabled={!note.trim()}\n >\n Add &amp; next\n </GlassButton>\n <GlassButton\n variant=\"glass-primary\"\n onClick={() => handleSubmit(false)}\n disabled={!note.trim()}\n >\n Add\n </GlassButton>\n </div>\n </div>\n </GlassPanel>\n );\n}\n","interface AreaRect {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\ninterface AreaSelectOverlayProps {\n area: AreaRect | null;\n isDragging: boolean;\n}\n\nexport function AreaSelectOverlay({ area, isDragging }: AreaSelectOverlayProps) {\n if (!area || area.width < 2 || area.height < 2) return null;\n\n return (\n <div\n className={`pa-area-select ${isDragging ? 'pa-area-select--dragging' : ''}`}\n style={{\n top: area.y,\n left: area.x,\n width: area.width,\n height: area.height,\n }}\n aria-hidden=\"true\"\n />\n );\n}","import type { AnnotationEntry } from '@pixelagent/shared';\nimport {\n getCssSelector,\n getDomPath,\n getEditableTextInfo,\n getNearestReactComponentName,\n getWindowSelectionText,\n readReactSource,\n} from '@pixelagent/shared';\n\nexport interface BuildAnnotationInput {\n elements: Element[];\n note: string;\n areaBbox?: { x: number; y: number; width: number; height: number };\n}\n\nexport function buildAnnotationEntry(input: BuildAnnotationInput): AnnotationEntry {\n const { elements, note, areaBbox } = input;\n const primary = elements[0];\n\n if (!primary && areaBbox) {\n return {\n id: crypto.randomUUID(),\n selector: 'area-selection',\n note: note.trim(),\n areaBbox,\n position: { x: Math.round(areaBbox.x), y: Math.round(areaBbox.y) },\n bbox: {\n x: Math.round(areaBbox.x),\n y: Math.round(areaBbox.y),\n width: Math.round(areaBbox.width),\n height: Math.round(areaBbox.height),\n },\n createdAt: Date.now(),\n };\n }\n\n if (!primary) {\n throw new Error('buildAnnotationEntry requires at least one element or areaBbox');\n }\n\n const rect = primary.getBoundingClientRect();\n const source = readReactSource(primary);\n const selectedText = getWindowSelectionText();\n const textInfo = getEditableTextInfo(primary);\n const elementText = textInfo.kind !== 'none' ? textInfo.value : undefined;\n const selectors = elements.map((el) => getCssSelector(el));\n\n return {\n id: crypto.randomUUID(),\n selector: selectors[0],\n selectors: selectors.length > 1 ? selectors : undefined,\n note: note.trim(),\n position: { x: Math.round(rect.x), y: Math.round(rect.y) },\n bbox: {\n x: Math.round(rect.x),\n y: Math.round(rect.y),\n width: Math.round(rect.width),\n height: Math.round(rect.height),\n },\n areaBbox,\n domPath: getDomPath(primary),\n selectedText,\n elementText,\n sourceFile: source.sourceFile,\n lineNumber: source.lineNumber,\n componentName: getNearestReactComponentName(primary) ?? source.componentName,\n createdAt: Date.now(),\n };\n}\n","import type { AnnotationEntry } from '@pixelagent/shared';\nimport { resolveElementFromEntry } from '@pixelagent/shared';\n\n/** Screen-space anchor for an annotation pin (live element preferred). */\nexport function getAnnotationAnchorRect(entry: AnnotationEntry): DOMRect | null {\n const el = resolveElementFromEntry(entry);\n if (el) return el.getBoundingClientRect();\n\n if (entry.bbox) {\n const { x, y, width, height } = entry.bbox;\n return new DOMRect(x, y, width, height);\n }\n\n if (entry.areaBbox) {\n const { x, y, width, height } = entry.areaBbox;\n return new DOMRect(x, y, width, height);\n }\n\n if (entry.position) {\n const { x, y } = entry.position;\n return new DOMRect(x, y, 1, 1);\n }\n\n return null;\n}\n\nexport function anchorRectKey(rect: DOMRect): string {\n return `${Math.round(rect.top)}:${Math.round(rect.left)}:${Math.round(rect.width)}:${Math.round(rect.height)}`;\n}\n","import { useEffect, useState } from 'react';\nimport type { AnnotationEntry } from '@pixelagent/shared';\nimport { resolveElementFromEntry } from '@pixelagent/shared';\nimport {\n anchorRectKey,\n getAnnotationAnchorRect,\n} from './annotationAnchor';\n\nexport interface AnnotationBadgePin {\n id: string;\n index: number;\n top: number;\n left: number;\n}\n\ninterface AnnotationBadgesOverlayProps {\n annotations: AnnotationEntry[];\n}\n\nconst STACK_OFFSET_PX = 20;\n\nexport function AnnotationBadgesOverlay({ annotations }: AnnotationBadgesOverlayProps) {\n const [pins, setPins] = useState<AnnotationBadgePin[]>([]);\n\n useEffect(() => {\n if (annotations.length === 0) {\n setPins([]);\n return;\n }\n\n const stackAtKey = new Map<string, number>();\n\n const update = () => {\n const next: AnnotationBadgePin[] = [];\n\n annotations.forEach((entry, i) => {\n const rect = getAnnotationAnchorRect(entry);\n if (!rect) return;\n\n const key = anchorRectKey(rect);\n const stack = stackAtKey.get(key) ?? 0;\n stackAtKey.set(key, stack + 1);\n\n next.push({\n id: entry.id,\n index: i + 1,\n top: rect.top - 6 - stack * STACK_OFFSET_PX,\n left: rect.right - 6,\n });\n });\n\n setPins(next);\n };\n\n update();\n\n const observed = new Set<Element>();\n for (const entry of annotations) {\n const el = resolveElementFromEntry(entry);\n if (el) observed.add(el);\n }\n\n const observers = Array.from(observed).map((el) => {\n const observer = new ResizeObserver(update);\n observer.observe(el);\n return observer;\n });\n\n window.addEventListener('scroll', update, true);\n window.addEventListener('resize', update);\n\n return () => {\n for (const observer of observers) observer.disconnect();\n window.removeEventListener('scroll', update, true);\n window.removeEventListener('resize', update);\n };\n }, [annotations]);\n\n if (pins.length === 0) return null;\n\n return (\n <>\n {pins.map((pin) => (\n <span\n key={pin.id}\n className=\"pa-annotation-badge\"\n style={{ top: pin.top, left: pin.left }}\n aria-hidden=\"true\"\n >\n {pin.index}\n </span>\n ))}\n </>\n );\n}\n","export const PA_OWN_SELECTOR =\n '[data-pixelagent-root],[data-pixelagent-toolbar-portal],[data-pixelagent-picker-portal]';\n\nexport function isPixelAgentElement(target: EventTarget | null): boolean {\n if (!(target instanceof Element)) return false;\n return !!target.closest(PA_OWN_SELECTOR);\n}\n\nexport function pickElementAt(x: number, y: number): Element | null {\n const elements = document.elementsFromPoint(x, y);\n return (\n elements.find(\n (el) => el instanceof Element && !el.closest(PA_OWN_SELECTOR)\n ) ?? null\n );\n}\n","import type { ReactNode } from 'react';\n\nexport function isCopyAllFeedback(status: string | null): boolean {\n if (!status) return false;\n return status === 'Copied all!' || status.startsWith('Copy failed');\n}\n\ninterface CopyFeedbackSlotProps {\n feedback: string | null;\n slotClassName: string;\n children: ReactNode;\n}\n\nexport function CopyFeedbackSlot({\n feedback,\n slotClassName,\n children,\n}: CopyFeedbackSlotProps) {\n if (feedback && isCopyAllFeedback(feedback)) {\n return (\n <span\n className={`pa-status pa-copy-feedback-slot ${slotClassName}`}\n role=\"status\"\n aria-live=\"polite\"\n >\n {feedback}\n </span>\n );\n }\n\n return <>{children}</>;\n}\n","import { useEffect, useState } from 'react';\nimport type { AnnotationEntry } from '@pixelagent/shared';\nimport { getAnnotationSessionDisplay } from '@pixelagent/shared';\nimport { GlassButton, GlassPanel } from '../glass';\nimport { CopyFeedbackSlot } from '../ui/CopyFeedbackSlot';\n\ninterface SessionPanelProps {\n annotations: AnnotationEntry[];\n collapsed: boolean;\n onToggleCollapsed: () => void;\n onClose: () => void;\n onCopyAll: () => void | Promise<void>;\n onCopyOne: (id: string) => void | Promise<void>;\n onRemove: (id: string) => void;\n onUpdate: (id: string, patch: Partial<AnnotationEntry>) => void;\n copyStatus: string | null;\n copiedEntryId: string | null;\n copyAllFrom: 'toolbar' | 'session' | null;\n}\n\nexport function SessionPanel({\n annotations,\n collapsed,\n onToggleCollapsed,\n onClose,\n onCopyAll,\n onCopyOne,\n onRemove,\n onUpdate,\n copyStatus,\n copiedEntryId,\n copyAllFrom,\n}: SessionPanelProps) {\n const [editingId, setEditingId] = useState<string | null>(null);\n const [draftNote, setDraftNote] = useState('');\n\n useEffect(() => {\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key !== 'Escape') return;\n if (collapsed) onClose();\n else onToggleCollapsed();\n };\n document.addEventListener('keydown', onKeyDown);\n return () => document.removeEventListener('keydown', onKeyDown);\n }, [collapsed, onClose, onToggleCollapsed]);\n\n const startEdit = (entry: AnnotationEntry) => {\n setEditingId(entry.id);\n setDraftNote(entry.note);\n };\n\n const saveEdit = (id: string) => {\n if (!draftNote.trim()) return;\n onUpdate(id, { note: draftNote.trim() });\n setEditingId(null);\n };\n\n return (\n <GlassPanel\n variant=\"sheet\"\n side=\"right\"\n className={collapsed ? 'pa-session-panel--collapsed' : undefined}\n >\n <div className=\"pa-session-header\">\n <div className=\"pa-session-header-main\">\n <GlassButton\n variant=\"ghost\"\n className=\"pa-glass-btn--sm pa-session-collapse-btn\"\n onClick={onToggleCollapsed}\n aria-expanded={!collapsed}\n aria-label={collapsed ? 'Expand session panel' : 'Collapse session panel'}\n >\n <span className=\"pa-session-chevron\" aria-hidden=\"true\">\n {collapsed ? '▶' : '▼'}\n </span>\n </GlassButton>\n <h3 className=\"pa-session-title\">Session ({annotations.length})</h3>\n </div>\n {!collapsed && (\n <p className=\"pa-session-subtitle\">Persists until tab close</p>\n )}\n <div className=\"pa-session-actions\">\n <CopyFeedbackSlot\n feedback={copyAllFrom === 'session' ? copyStatus : null}\n slotClassName=\"pa-copy-feedback-slot--session\"\n >\n <GlassButton\n variant=\"glass-primary\"\n className=\"pa-glass-btn--sm\"\n onClick={onCopyAll}\n disabled={annotations.length === 0}\n >\n Copy all\n </GlassButton>\n </CopyFeedbackSlot>\n <GlassButton variant=\"ghost\" onClick={onClose} aria-label=\"Close session panel\">\n ✕\n </GlassButton>\n </div>\n </div>\n\n {!collapsed && (\n <ul className=\"pa-session-list\">\n {annotations.length === 0 && (\n <li className=\"pa-session-empty\">\n No annotations yet. Click an element, drag an area, or Shift+click for multi-select.\n </li>\n )}\n {annotations.map((entry) => {\n const display = getAnnotationSessionDisplay(entry);\n return (\n <li key={entry.id} className=\"pa-session-item\">\n {editingId === entry.id ? (\n <div className=\"pa-session-edit\">\n <label className=\"pa-label\">\n Note\n <textarea\n className=\"pa-textarea\"\n value={draftNote}\n onChange={(e) => setDraftNote(e.target.value)}\n rows={3}\n />\n </label>\n <div className=\"pa-session-item-actions\">\n <GlassButton variant=\"ghost\" onClick={() => setEditingId(null)}>\n Cancel\n </GlassButton>\n <GlassButton\n variant=\"glass-primary\"\n onClick={() => saveEdit(entry.id)}\n disabled={!draftNote.trim()}\n >\n Save\n </GlassButton>\n </div>\n </div>\n ) : (\n <>\n <div className=\"pa-session-content\">\n <span className=\"pa-session-target\">{display.target}</span>\n <p className=\"pa-session-note\">{display.note}</p>\n {display.meta && (\n <p className=\"pa-session-meta-line\">{display.meta}</p>\n )}\n </div>\n <div className=\"pa-session-item-actions\">\n {copyStatus === 'Copied!' && copiedEntryId === entry.id ? (\n <span\n className=\"pa-status pa-copy-feedback-slot pa-copy-feedback-slot--item\"\n role=\"status\"\n aria-live=\"polite\"\n >\n Copied!\n </span>\n ) : (\n <GlassButton\n variant=\"glass-primary\"\n className=\"pa-glass-btn--sm\"\n onClick={() => onCopyOne(entry.id)}\n aria-label=\"Copy annotation\"\n >\n Copy\n </GlassButton>\n )}\n <GlassButton\n variant=\"ghost\"\n className=\"pa-glass-btn--sm\"\n onClick={() => startEdit(entry)}\n aria-label=\"Edit annotation note\"\n >\n ✎\n </GlassButton>\n <GlassButton\n variant=\"ghost\"\n className=\"pa-glass-btn--sm\"\n onClick={() => onRemove(entry.id)}\n aria-label=\"Remove annotation\"\n >\n ✕\n </GlassButton>\n </div>\n </>\n )}\n </li>\n );\n })}\n </ul>\n )}\n </GlassPanel>\n );\n}\n","export function SettingsIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M8 10.25a2.25 2.25 0 1 0 0-4.5 2.25 2.25 0 0 0 0 4.5Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.25\"\n />\n <path\n d=\"M12.1 9.2c.08-.42.08-.86 0-1.28l1.12-.87a.75.75 0 0 0 .18-.97l-1.06-1.84a.75.75 0 0 0-.92-.34l-1.32.53a5.2 5.2 0 0 0-1.1-.64l-.2-1.4A.75.75 0 0 0 8.9 2h-2.1a.75.75 0 0 0-.74.63l-.2 1.4c-.39.16-.76.37-1.1.64l-1.32-.53a.75.75 0 0 0-.92.34L1.56 6.08a.75.75 0 0 0 .18.97l1.12.87c-.08.42-.08.86 0 1.28l-1.12.87a.75.75 0 0 0-.18.97l1.06 1.84c.2.35.6.5.97.34l1.32-.53c.34.27.71.48 1.1.64l.2 1.4c.08.37.4.63.74.63h2.1c.37 0 .68-.28.74-.63l.2-1.4c.39-.16.76-.37 1.1-.64l1.32.53c.37.15.77 0 .97-.34l1.06-1.84a.75.75 0 0 0-.18-.97l-1.12-.87Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.1\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nexport function SunIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <circle cx=\"8\" cy=\"8\" r=\"2.75\" stroke=\"currentColor\" strokeWidth=\"1.25\" />\n <path\n d=\"M8 1.25v1.5M8 13.25v1.5M1.25 8h1.5M13.25 8h1.5M3.05 3.05l1.06 1.06M11.89 11.89l1.06 1.06M3.05 12.95l1.06-1.06M11.89 4.11l1.06-1.06\"\n stroke=\"currentColor\"\n strokeWidth=\"1.25\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n\nexport function MoonIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M11.2 9.4a4.25 4.25 0 0 1-5.6-5.6A4.75 4.75 0 1 0 11.2 9.4Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.25\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n","import { useEffect, useRef } from 'react';\nimport type { HostTheme, PixelAgentChrome } from '@pixelagent/shared';\nimport { GlassButton, GlassPanel } from '../glass';\nimport { MoonIcon, SunIcon } from './icons';\n\ninterface ToolbarSettingsMenuProps {\n open: boolean;\n onClose: () => void;\n hostTheme: HostTheme;\n chrome: PixelAgentChrome;\n onToggleHostTheme: () => void;\n}\n\nexport function ToolbarSettingsMenu({\n open,\n onClose,\n hostTheme,\n chrome,\n onToggleHostTheme,\n}: ToolbarSettingsMenuProps) {\n const panelRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!open) return;\n\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose();\n };\n\n const onPointerDown = (e: MouseEvent) => {\n const target = e.target as Node;\n if (panelRef.current?.contains(target)) return;\n if ((target as Element).closest?.('[data-pa-settings-trigger]')) return;\n onClose();\n };\n\n window.addEventListener('keydown', onKeyDown);\n window.addEventListener('mousedown', onPointerDown);\n return () => {\n window.removeEventListener('keydown', onKeyDown);\n window.removeEventListener('mousedown', onPointerDown);\n };\n }, [open, onClose]);\n\n if (!open) return null;\n\n return (\n <div ref={panelRef} className=\"pa-settings-menu\" role=\"dialog\" aria-label=\"PixelAgent settings\">\n <GlassPanel variant=\"popover\" className=\"pa-settings-menu-panel\">\n <div className=\"pa-settings-menu-inner\">\n <header className=\"pa-settings-menu-header\">\n <h4 className=\"pa-settings-menu-title\">Settings</h4>\n <p className=\"pa-settings-menu-subtitle\">Appearance and chrome</p>\n </header>\n\n <section className=\"pa-settings-section\">\n <span className=\"pa-settings-section-label\">Host theme</span>\n <div className=\"pa-settings-row\">\n <span className=\"pa-settings-row-value\">\n {hostTheme === 'dark' ? 'Dark canvas' : 'Light canvas'}\n </span>\n <GlassButton\n variant=\"icon\"\n onClick={onToggleHostTheme}\n aria-label={\n hostTheme === 'dark' ? 'Switch host to light theme' : 'Switch host to dark theme'\n }\n title={hostTheme === 'dark' ? 'Light theme' : 'Dark theme'}\n >\n {hostTheme === 'dark' ? <SunIcon /> : <MoonIcon />}\n </GlassButton>\n </div>\n </section>\n\n <section className=\"pa-settings-section\">\n <span className=\"pa-settings-section-label\">Glass chrome</span>\n <p className=\"pa-settings-hint\">\n {chrome === 'dim'\n ? 'Dim gray glass for readability on bright pages.'\n : 'Frosted glass for dark pages.'}\n {' '}\n (auto)\n </p>\n </section>\n </div>\n </GlassPanel>\n </div>\n );\n}\n","export type PixelAgentIconVariant = 'cursor' | 'pointer';\n\ninterface PixelAgentIconProps {\n /** Render size in CSS pixels (SVG scales via viewBox). */\n size?: number;\n /** `cursor` = minimal geometric pointer (default); `pointer` = classic arrow. */\n variant?: PixelAgentIconVariant;\n}\n\nconst VIEWBOX = '0 0 24 24';\n\n/** ShiftClick-style mark: square tail + right-triangle head (hotspot top-left). */\nfunction MinimalCursorMark() {\n return (\n <>\n <rect x=\"3\" y=\"14\" width=\"4\" height=\"4\" fill=\"currentColor\" />\n <path fill=\"currentColor\" d=\"M7 5h12v12L7 5z\" />\n </>\n );\n}\n\nconst CLASSIC_ARROW =\n 'M4.5 2.5L4.5 17.25L9.1 12.9L11.35 19.15L13.55 17.95L11.05 11.85L16.85 11.85L4.5 2.5Z';\n\n/** Toolbar brand — minimal cursor SVG, scales with `size`. */\nexport function PixelAgentIcon({ size = 22, variant = 'cursor' }: PixelAgentIconProps) {\n if (variant === 'pointer') {\n return (\n <svg\n className=\"pa-brand-cursor pa-brand-cursor--pointer\"\n width={size}\n height={size}\n viewBox={VIEWBOX}\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <path\n fill=\"currentColor\"\n d={CLASSIC_ARROW}\n />\n </svg>\n );\n }\n\n return (\n <svg\n className=\"pa-brand-cursor pa-brand-cursor--minimal\"\n width={size}\n height={size}\n viewBox={VIEWBOX}\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <MinimalCursorMark />\n </svg>\n );\n}\n","import { createPortal } from 'react-dom';\nimport type { AnnotateCaptureMode, HostTheme, PixelAgentChrome } from '@pixelagent/shared';\nimport type { PixelAgentMode } from '../PixelAgent';\nimport { GlassButton, GlassSurface } from '../glass';\nimport { useDraggable } from '../hooks/useDraggable';\nimport { SettingsIcon } from '../ui/icons';\nimport { ToolbarSettingsMenu } from '../ui/ToolbarSettingsMenu';\nimport { CopyFeedbackSlot, isCopyAllFeedback } from '../ui/CopyFeedbackSlot';\nimport { PixelAgentIcon } from './PixelAgentIcon';\n\ninterface ToolbarProps {\n rootAttributes: Record<string, string>;\n hostTheme: HostTheme;\n chrome: PixelAgentChrome;\n settingsOpen: boolean;\n onToggleSettings: () => void;\n onCloseSettings: () => void;\n onToggleHostTheme: () => void;\n active: boolean;\n mode: PixelAgentMode;\n captureMode: AnnotateCaptureMode;\n annotationCount: number;\n multiSelectCount: number;\n copyStatus: string | null;\n copyAllFrom: 'toolbar' | 'session' | null;\n onActivateAnnotate: () => void;\n onActivateEdit: () => void;\n onDeactivate: () => void;\n onCopyAll: () => void;\n onCaptureModeChange: (mode: AnnotateCaptureMode) => void;\n onConfirmMultiSelect: () => void;\n}\n\nconst CAPTURE_OPTIONS: AnnotateCaptureMode[] = ['element', 'area', 'multi'];\n\nconst CAPTURE_LABELS: Record<AnnotateCaptureMode, string> = {\n element: 'Click',\n area: 'Area',\n multi: 'Multi',\n};\n\nexport function Toolbar({\n rootAttributes,\n hostTheme,\n chrome,\n settingsOpen,\n onToggleSettings,\n onCloseSettings,\n onToggleHostTheme,\n active,\n mode,\n captureMode,\n annotationCount,\n multiSelectCount,\n copyStatus,\n copyAllFrom,\n onActivateAnnotate,\n onActivateEdit,\n onDeactivate,\n onCopyAll,\n onCaptureModeChange,\n onConfirmMultiSelect,\n}: ToolbarProps) {\n const { elementRef, isDragging, style, dragHandleProps } = useDraggable();\n const toolbar = (\n <div\n ref={elementRef}\n className={`pa-toolbar-float ${isDragging ? 'pa-toolbar-float--dragging' : ''}`}\n style={style}\n role=\"toolbar\"\n aria-label=\"PixelAgent\"\n >\n {!active && (\n <ToolbarSettingsMenu\n open={settingsOpen}\n onClose={onCloseSettings}\n hostTheme={hostTheme}\n chrome={chrome}\n onToggleHostTheme={onToggleHostTheme}\n />\n )}\n\n <GlassSurface shape=\"capsule\" className=\"pa-toolbar-glass\" intensity=\"enhanced\">\n <div className=\"pa-toolbar-inner\">\n <button\n type=\"button\"\n className=\"pa-toolbar-drag\"\n aria-label=\"Drag PixelAgent toolbar\"\n title=\"Drag to move\"\n {...dragHandleProps}\n >\n <PixelAgentIcon size={22} />\n </button>\n\n <span className=\"pa-toolbar-divider\" aria-hidden=\"true\" />\n\n {!active ? (\n <div className=\"pa-toolbar-segment\">\n <GlassButton onClick={onActivateAnnotate}>Annotate</GlassButton>\n <GlassButton onClick={onActivateEdit}>Edit</GlassButton>\n </div>\n ) : (\n <>\n <div className=\"pa-toolbar-segment\">\n <span className=\"pa-mode-badge\">{mode}</span>\n {mode === 'annotate' && (\n <>\n <select\n className=\"pa-select pa-toolbar-capture-select\"\n value={captureMode}\n onChange={(e) =>\n onCaptureModeChange(e.target.value as AnnotateCaptureMode)\n }\n aria-label=\"Capture mode\"\n >\n {CAPTURE_OPTIONS.map((option) => (\n <option key={option} value={option}>\n {CAPTURE_LABELS[option]}\n </option>\n ))}\n </select>\n {multiSelectCount > 0 && (\n <GlassButton\n variant=\"glass-primary\"\n onClick={onConfirmMultiSelect}\n aria-label=\"Annotate selected elements\"\n >\n {multiSelectCount}\n </GlassButton>\n )}\n <CopyFeedbackSlot\n feedback={\n copyAllFrom === 'toolbar' ? copyStatus : null\n }\n slotClassName=\"pa-copy-feedback-slot--toolbar\"\n >\n <GlassButton\n variant=\"glass-primary\"\n onClick={onCopyAll}\n disabled={annotationCount === 0}\n aria-label={\n annotationCount > 0\n ? `Copy all annotations (${annotationCount})`\n : 'Copy all annotations'\n }\n >\n {annotationCount > 0 ? `Copy (${annotationCount})` : 'Copy'}\n </GlassButton>\n </CopyFeedbackSlot>\n </>\n )}\n </div>\n\n <GlassButton\n variant=\"icon\"\n className=\"pa-toolbar-close\"\n onClick={onDeactivate}\n aria-label=\"Close\"\n >\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M3 3L11 11M11 3L3 11\"\n stroke=\"currentColor\"\n strokeWidth=\"1.75\"\n strokeLinecap=\"round\"\n />\n </svg>\n </GlassButton>\n </>\n )}\n\n {!active && (\n <>\n <span className=\"pa-toolbar-divider\" aria-hidden=\"true\" />\n\n <GlassButton\n variant=\"icon\"\n className=\"pa-toolbar-settings\"\n data-pa-settings-trigger\n onClick={onToggleSettings}\n aria-label=\"PixelAgent settings\"\n aria-expanded={settingsOpen}\n title=\"Settings\"\n >\n <SettingsIcon />\n </GlassButton>\n </>\n )}\n\n {copyStatus && !isCopyAllFeedback(copyStatus) && copyStatus !== 'Copied!' && (\n <span className=\"pa-status pa-toolbar-status\" role=\"status\">\n {copyStatus}\n </span>\n )}\n </div>\n </GlassSurface>\n </div>\n );\n\n if (typeof document === 'undefined') return toolbar;\n return createPortal(\n <div\n className=\"pa-root pa-root--toolbar-portal\"\n data-pixelagent-toolbar-portal\n {...rootAttributes}\n >\n {toolbar}\n </div>,\n document.body\n );\n}\n","import { useCallback, useEffect, useRef, useState } from 'react';\nimport type { AnnotationEntry } from '@pixelagent/shared';\nimport { loadAnnotationSession, saveAnnotationSession } from '@pixelagent/shared';\n\nexport function useAnnotationSession() {\n const restored = useRef(loadAnnotationSession());\n const [annotations, setAnnotations] = useState<AnnotationEntry[]>(\n () => restored.current?.annotations ?? []\n );\n\n useEffect(() => {\n saveAnnotationSession({ annotations });\n }, [annotations]);\n\n const updateAnnotation = useCallback((id: string, patch: Partial<AnnotationEntry>) => {\n setAnnotations((prev) =>\n prev.map((entry) => (entry.id === id ? { ...entry, ...patch } : entry))\n );\n }, []);\n\n const removeAnnotation = useCallback((id: string) => {\n setAnnotations((prev) => prev.filter((entry) => entry.id !== id));\n }, []);\n\n return {\n annotations,\n setAnnotations,\n updateAnnotation,\n removeAnnotation,\n };\n}\n","import { useCallback, useEffect, useMemo, useState } from 'react';\nimport {\n applyHostThemeToDocument,\n DEFAULT_PIXEL_AGENT_UI_SETTINGS,\n pixelAgentRootAttributes,\n readHostThemeFromDocument,\n resolvePixelAgentChrome,\n type HostTheme,\n type PixelAgentUiSettings,\n} from '@pixelagent/shared';\n\nexport interface UsePixelAgentUiOptions {\n ui?: PixelAgentUiSettings;\n hostTheme?: HostTheme;\n onHostThemeChange?: (theme: HostTheme) => void;\n}\n\nexport function usePixelAgentUi({\n ui,\n hostTheme: controlledHostTheme,\n onHostThemeChange,\n}: UsePixelAgentUiOptions) {\n const mergedUi = useMemo(\n () => ({ ...DEFAULT_PIXEL_AGENT_UI_SETTINGS, ...ui }),\n [ui]\n );\n\n const [internalHostTheme, setInternalHostTheme] = useState<HostTheme>(\n () => controlledHostTheme ?? readHostThemeFromDocument(mergedUi) ?? 'dark'\n );\n\n const [settingsOpen, setSettingsOpen] = useState(false);\n\n const hostTheme = controlledHostTheme ?? internalHostTheme;\n\n useEffect(() => {\n if (controlledHostTheme !== undefined) return;\n\n const sync = () => {\n const read = readHostThemeFromDocument(mergedUi);\n if (read) setInternalHostTheme(read);\n };\n\n sync();\n const attr = mergedUi.hostThemeAttribute;\n const observer = new MutationObserver(sync);\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: [attr],\n });\n return () => observer.disconnect();\n }, [controlledHostTheme, mergedUi]);\n\n const chrome = useMemo(\n () => resolvePixelAgentChrome(mergedUi, hostTheme),\n [mergedUi, hostTheme]\n );\n\n const toggleHostTheme = useCallback(() => {\n const next: HostTheme = hostTheme === 'dark' ? 'light' : 'dark';\n if (onHostThemeChange) {\n onHostThemeChange(next);\n return;\n }\n setInternalHostTheme(next);\n applyHostThemeToDocument(next, mergedUi);\n }, [hostTheme, onHostThemeChange, mergedUi]);\n\n const toggleSettings = useCallback(() => {\n setSettingsOpen((open) => !open);\n }, []);\n\n return {\n chrome,\n rootAttributes: pixelAgentRootAttributes(chrome),\n hostTheme,\n toggleHostTheme,\n settingsOpen,\n setSettingsOpen,\n toggleSettings,\n uiSettings: mergedUi,\n };\n}\n","import { useCallback, useEffect, useRef, useState } from 'react';\nimport type {\n AnnotateCaptureMode,\n ApplyPayload,\n ApplyVisualDiffResult,\n ElementState,\n HostTheme,\n PixelAgentUiSettings,\n TargetScope,\n} from '@pixelagent/shared';\nimport {\n copyToClipboard,\n detectStylingSystem,\n formatAllAnnotations,\n formatAnnotation,\n countElementInstances,\n getScopeSelector,\n getElementsInArea,\n readReactSource,\n} from '@pixelagent/shared';\nimport { EditPanel } from './edit/EditPanel';\nimport { submitApply } from './edit/submitApply';\nimport { AnnotationPopover } from './annotate/AnnotationPopover';\nimport { AreaSelectOverlay } from './annotate/AreaSelectOverlay';\nimport { buildAnnotationEntry } from './annotate/buildAnnotationEntry';\nimport { AnnotationBadgesOverlay } from './annotate/AnnotationBadgesOverlay';\nimport { ElementOverlay } from './annotate/ElementOverlay';\nimport { isPixelAgentElement, pickElementAt, PA_OWN_SELECTOR } from './annotate/pickElement';\nimport { SessionPanel } from './annotate/SessionPanel';\nimport { Toolbar } from './shadow/Toolbar';\nimport { useAnnotationSession } from './hooks/useAnnotationSession';\nimport { usePixelAgentUi } from './ui/usePixelAgentUi';\nimport './styles/pixelagent.css';\n\nexport type PixelAgentMode = 'annotate' | 'edit' | 'idle';\n\nexport interface PixelAgentProps {\n /** Glass chrome + host theme sync; extend as new UI knobs ship. */\n ui?: PixelAgentUiSettings;\n /** Controlled host page theme (e.g. demo `data-theme`). */\n hostTheme?: HostTheme;\n onHostThemeChange?: (theme: HostTheme) => void;\n /**\n * Explicit POST endpoint for Apply. When unset, the component auto-probes\n * the standard Vite plugin path (`/__pixelagent/apply`) at mount; if that\n * fails it falls back to clipboard.\n */\n applyEndpoint?: string;\n /** Custom transport. Takes precedence over `applyEndpoint`. */\n onApply?: (payload: ApplyPayload) => Promise<ApplyVisualDiffResult | null>;\n}\n\nconst AUTO_APPLY_PATH = '/__pixelagent/apply';\n\ninterface AreaDragState {\n startX: number;\n startY: number;\n currentX: number;\n currentY: number;\n}\n\ninterface PendingAnnotation {\n elements: Element[];\n areaBbox?: { x: number; y: number; width: number; height: number };\n}\n\nfunction normalizeAreaRect(drag: AreaDragState) {\n const x = Math.min(drag.startX, drag.currentX);\n const y = Math.min(drag.startY, drag.currentY);\n const width = Math.abs(drag.currentX - drag.startX);\n const height = Math.abs(drag.currentY - drag.startY);\n return { x, y, width, height };\n}\n\nexport function PixelAgent({\n ui,\n hostTheme,\n onHostThemeChange,\n applyEndpoint,\n onApply,\n}: PixelAgentProps = {}) {\n const pixelAgentUi = usePixelAgentUi({ ui, hostTheme, onHostThemeChange });\n const [autoEndpoint, setAutoEndpoint] = useState<string | null>(null);\n\n // Auto-probe the Vite plugin endpoint. The plugin returns 405 for non-POST,\n // which uniquely confirms the middleware is mounted. 404 / network error → skip.\n useEffect(() => {\n if (applyEndpoint || onApply) return;\n let cancelled = false;\n fetch(AUTO_APPLY_PATH, { method: 'GET' })\n .then((res) => {\n if (!cancelled && res.status === 405) setAutoEndpoint(AUTO_APPLY_PATH);\n })\n .catch(() => {\n /* no plugin — clipboard fallback */\n });\n return () => {\n cancelled = true;\n };\n }, [applyEndpoint, onApply]);\n const [active, setActive] = useState(false);\n const [mode, setMode] = useState<PixelAgentMode>('idle');\n const [captureMode, setCaptureMode] = useState<AnnotateCaptureMode>('element');\n const {\n annotations,\n setAnnotations,\n updateAnnotation,\n removeAnnotation,\n } = useAnnotationSession();\n\n const [hoveredElement, setHoveredElement] = useState<Element | null>(null);\n const [selectedElement, setSelectedElement] = useState<Element | null>(null);\n const [multiSelected, setMultiSelected] = useState<Element[]>([]);\n const [pendingAnnotation, setPendingAnnotation] = useState<PendingAnnotation | null>(null);\n const [areaDrag, setAreaDrag] = useState<AreaDragState | null>(null);\n const [sessionDismissed, setSessionDismissed] = useState(false);\n const [sessionCollapsed, setSessionCollapsed] = useState(false);\n\n const sessionVisible =\n active && mode === 'annotate' && annotations.length > 0 && !sessionDismissed;\n const [targetScope, setTargetScope] = useState<TargetScope>('this-instance');\n const [elementState, setElementState] = useState<ElementState>('normal');\n const [copyStatus, setCopyStatus] = useState<string | null>(null);\n const [copiedEntryId, setCopiedEntryId] = useState<string | null>(null);\n const [copyAllFrom, setCopyAllFrom] = useState<'toolbar' | 'session' | null>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const copyStatusTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const showCopyStatus = useCallback(\n (message: string, options?: { entryId?: string; copyAllFrom?: 'toolbar' | 'session' }) => {\n if (copyStatusTimer.current) clearTimeout(copyStatusTimer.current);\n setCopyStatus(message);\n setCopiedEntryId(options?.entryId ?? null);\n setCopyAllFrom(options?.copyAllFrom ?? null);\n copyStatusTimer.current = setTimeout(() => {\n setCopyStatus(null);\n setCopiedEntryId(null);\n setCopyAllFrom(null);\n }, 2500);\n },\n []\n );\n\n const copyText = useCallback(\n async (\n text: string,\n successMessage: string,\n options?: { entryId?: string; copyAllFrom?: 'toolbar' | 'session' }\n ) => {\n if (!text) return;\n try {\n await copyToClipboard(text);\n showCopyStatus(successMessage, options);\n } catch {\n showCopyStatus('Copy failed — check clipboard permissions', options);\n }\n },\n [showCopyStatus]\n );\n\n const openAnnotationPopover = useCallback(\n (elements: Element[], areaBbox?: PendingAnnotation['areaBbox']) => {\n if (elements.length === 0 && !areaBbox) return;\n setPendingAnnotation({ elements, areaBbox });\n setSelectedElement(elements[0] ?? null);\n },\n []\n );\n\n const handleMouseMove = useCallback(\n (e: MouseEvent) => {\n if (!active || mode !== 'annotate' || isPixelAgentElement(e.target)) return;\n\n if (areaDrag) {\n setAreaDrag((prev) =>\n prev ? { ...prev, currentX: e.clientX, currentY: e.clientY } : prev\n );\n return;\n }\n\n if (captureMode !== 'area') {\n setHoveredElement(pickElementAt(e.clientX, e.clientY));\n }\n },\n [active, mode, areaDrag, captureMode]\n );\n\n const handleMouseDown = useCallback(\n (e: MouseEvent) => {\n if (!active || mode !== 'annotate' || isPixelAgentElement(e.target)) return;\n if (captureMode !== 'area' || e.button !== 0) return;\n\n e.preventDefault();\n e.stopPropagation();\n setAreaDrag({\n startX: e.clientX,\n startY: e.clientY,\n currentX: e.clientX,\n currentY: e.clientY,\n });\n setPendingAnnotation(null);\n },\n [active, mode, captureMode]\n );\n\n const handleMouseUp = useCallback(() => {\n if (!areaDrag) return;\n\n const area = normalizeAreaRect(areaDrag);\n setAreaDrag(null);\n\n if (area.width < 8 || area.height < 8) return;\n\n const elements = getElementsInArea(area, PA_OWN_SELECTOR);\n openAnnotationPopover(elements, area);\n }, [areaDrag, openAnnotationPopover]);\n\n const handleClick = useCallback(\n (e: MouseEvent) => {\n if (!active || mode !== 'annotate' || isPixelAgentElement(e.target)) return;\n if (captureMode === 'area') return;\n\n e.preventDefault();\n e.stopPropagation();\n\n const target = pickElementAt(e.clientX, e.clientY);\n if (!target) return;\n\n if (e.shiftKey || captureMode === 'multi') {\n setMultiSelected((prev) => {\n const exists = prev.includes(target);\n return exists ? prev.filter((el) => el !== target) : [...prev, target];\n });\n setSelectedElement(target);\n return;\n }\n\n const elements = multiSelected.length > 0 ? multiSelected : [target];\n openAnnotationPopover(elements.includes(target) ? elements : [target]);\n },\n [active, mode, captureMode, multiSelected, openAnnotationPopover]\n );\n\n useEffect(() => {\n if (!selectedElement || targetScope !== 'all-instances') return;\n if (countElementInstances(selectedElement) <= 1) {\n setTargetScope('this-instance');\n }\n }, [selectedElement, targetScope]);\n\n useEffect(() => {\n if (!active) return;\n\n document.addEventListener('mousemove', handleMouseMove, true);\n document.addEventListener('mousedown', handleMouseDown, true);\n document.addEventListener('mouseup', handleMouseUp, true);\n document.addEventListener('click', handleClick, true);\n\n return () => {\n document.removeEventListener('mousemove', handleMouseMove, true);\n document.removeEventListener('mousedown', handleMouseDown, true);\n document.removeEventListener('mouseup', handleMouseUp, true);\n document.removeEventListener('click', handleClick, true);\n };\n }, [active, handleMouseMove, handleMouseDown, handleMouseUp, handleClick]);\n\n const addAnnotation = useCallback(\n (note: string, continuous: boolean) => {\n if (!pendingAnnotation || !note.trim()) return;\n\n const { elements, areaBbox } = pendingAnnotation;\n if (elements.length === 0 && !areaBbox) return;\n\n const entry = buildAnnotationEntry({\n elements,\n note,\n areaBbox,\n });\n\n setAnnotations((prev) => [...prev, entry]);\n setSessionDismissed(false);\n setSessionCollapsed(false);\n\n if (continuous) {\n setPendingAnnotation(null);\n setSelectedElement(null);\n } else {\n setPendingAnnotation(null);\n setSelectedElement(null);\n setMultiSelected([]);\n }\n },\n [pendingAnnotation, setAnnotations]\n );\n\n const cancelAnnotation = useCallback(() => {\n setPendingAnnotation(null);\n setSelectedElement(null);\n }, []);\n\n const copyAllAnnotations = useCallback(\n async (from: 'toolbar' | 'session') => {\n const markdown = formatAllAnnotations(annotations);\n await copyText(markdown, 'Copied all!', { copyAllFrom: from });\n },\n [annotations, copyText]\n );\n\n const copyOneAnnotation = useCallback(\n async (id: string) => {\n const entry = annotations.find((a) => a.id === id);\n if (!entry) return;\n await copyText(formatAnnotation(entry), 'Copied!', { entryId: id });\n },\n [annotations, copyText]\n );\n\n const handleApply = useCallback(\n async (pendingByElement: Map<Element, ApplyPayload['changes']>): Promise<boolean> => {\n const entries = Array.from(pendingByElement.entries()).filter(\n ([, changes]) => changes.length > 0\n );\n if (entries.length === 0) return false;\n\n const effectiveEndpoint = applyEndpoint ?? autoEndpoint ?? undefined;\n const results = [];\n for (const [element, changes] of entries) {\n const source = readReactSource(element);\n const payload: ApplyPayload = {\n schemaVersion: 1,\n elementSelector: getScopeSelector(element, targetScope),\n sourceFile: source.sourceFile,\n lineNumber: source.lineNumber,\n targetScope,\n state: elementState,\n stylingSystem: detectStylingSystem(element),\n changes,\n };\n results.push(await submitApply(payload, { applyEndpoint: effectiveEndpoint, onApply }));\n }\n\n const allApplied = results.every(\n (r) =>\n r.mode === 'mcp' && r.result.success && r.result.linesChanged.length > 0\n );\n showCopyStatus(allApplied ? 'Change applied' : 'Apply failed');\n\n // Surface per-payload detail to the console for debugging.\n results.forEach((r, i) => {\n if (r.mode === 'error') console.error(`[pixelagent] Apply #${i} failed:`, r.message);\n else if (r.mode === 'clipboard')\n console.warn(`[pixelagent] Apply #${i} fell back to clipboard`);\n else if (r.mode === 'mcp' && !r.result.success)\n console.warn(`[pixelagent] Apply #${i} reported no changes:`, r.result);\n });\n\n return allApplied;\n },\n [targetScope, elementState, applyEndpoint, autoEndpoint, onApply, showCopyStatus]\n );\n\n const activateMode = (nextMode: PixelAgentMode) => {\n pixelAgentUi.setSettingsOpen(false);\n setActive(true);\n setMode(nextMode);\n setSelectedElement(null);\n setHoveredElement(null);\n setPendingAnnotation(null);\n setMultiSelected([]);\n setAreaDrag(null);\n if (nextMode === 'annotate') setSessionDismissed(false);\n };\n\n const deactivate = () => {\n setActive(false);\n setMode('idle');\n setSelectedElement(null);\n setHoveredElement(null);\n setPendingAnnotation(null);\n setMultiSelected([]);\n setAreaDrag(null);\n setSessionDismissed(false);\n setSessionCollapsed(false);\n };\n\n const areaRect = areaDrag ? normalizeAreaRect(areaDrag) : null;\n\n return (\n <div\n ref={containerRef}\n className=\"pa-root\"\n data-pixelagent-root\n {...pixelAgentUi.rootAttributes}\n >\n <Toolbar\n rootAttributes={pixelAgentUi.rootAttributes}\n hostTheme={pixelAgentUi.hostTheme}\n chrome={pixelAgentUi.chrome}\n settingsOpen={pixelAgentUi.settingsOpen}\n onToggleSettings={pixelAgentUi.toggleSettings}\n onCloseSettings={() => pixelAgentUi.setSettingsOpen(false)}\n onToggleHostTheme={pixelAgentUi.toggleHostTheme}\n active={active}\n mode={mode}\n captureMode={captureMode}\n annotationCount={annotations.length}\n multiSelectCount={multiSelected.length}\n copyStatus={copyStatus}\n copyAllFrom={copyAllFrom}\n onActivateAnnotate={() => activateMode('annotate')}\n onActivateEdit={() => activateMode('edit')}\n onDeactivate={deactivate}\n onCopyAll={() => copyAllAnnotations('toolbar')}\n onCaptureModeChange={setCaptureMode}\n onConfirmMultiSelect={() => {\n if (multiSelected.length > 0) openAnnotationPopover(multiSelected);\n }}\n />\n\n {active && mode === 'annotate' && (\n <>\n <ElementOverlay\n element={hoveredElement}\n selected={selectedElement}\n multiSelected={multiSelected}\n />\n <AnnotationBadgesOverlay annotations={annotations} />\n <AreaSelectOverlay area={areaRect} isDragging={!!areaDrag} />\n </>\n )}\n\n {active && mode === 'annotate' && pendingAnnotation && (\n <AnnotationPopover\n elements={pendingAnnotation.elements}\n areaBbox={pendingAnnotation.areaBbox}\n onSubmit={addAnnotation}\n onCancel={cancelAnnotation}\n />\n )}\n\n {active && mode === 'edit' && (\n <EditPanel\n selectedElement={selectedElement}\n hoveredElement={hoveredElement}\n onSelectElement={setSelectedElement}\n onHoverElement={setHoveredElement}\n targetScope={targetScope}\n onTargetScopeChange={setTargetScope}\n elementState={elementState}\n onElementStateChange={setElementState}\n onApply={handleApply}\n applyStatus={mode === 'edit' ? copyStatus : null}\n isToolbarTarget={isPixelAgentElement}\n />\n )}\n\n {sessionVisible && (\n <SessionPanel\n annotations={annotations}\n collapsed={sessionCollapsed}\n onToggleCollapsed={() => setSessionCollapsed((c) => !c)}\n onClose={() => {\n setSessionDismissed(true);\n setSessionCollapsed(false);\n }}\n onCopyAll={() => copyAllAnnotations('session')}\n onCopyOne={copyOneAnnotation}\n onRemove={removeAnnotation}\n onUpdate={updateAnnotation}\n copyStatus={copyStatus}\n copiedEntryId={copiedEntryId}\n copyAllFrom={copyAllFrom}\n />\n )}\n </div>\n );\n}\n\nexport { PixelAgent as default };\n","import { PixelAgent } from './PixelAgent';\n\nexport { PixelAgent };\nexport type { PixelAgentMode, PixelAgentProps } from './PixelAgent';\nexport type { PixelAgentIconVariant } from './shadow/PixelAgentIcon';\n\nexport function isDevEnvironment(): boolean {\n return typeof process !== 'undefined' && process.env.NODE_ENV !== 'production';\n}\n\n/**\n * Dev-only wrapper. Renders null in production builds.\n */\nexport function PixelAgentDev() {\n if (!isDevEnvironment()) return null;\n return <PixelAgent />;\n}\n\nexport * from '@pixelagent/shared';\n"],"names":["ElementOverlay","element","selected","multiSelected","primarySelected","highlights","setHighlights","useState","primary","useEffect","targets","scopeMode","el","update","isSelected","getElementDisplayLabel","observers","observer","tooltipAnchor","h","selectedCount","jsxs","Fragment","item","index","jsx","REFRACTION_GAIN_DEFAULT","REFRACTION_GAIN_ENHANCED","generateLiquidGlassMap","width","height","borderRadiusPx","refractionGain","dpi","w","canvas","ctx","imageData","data","r","hx","hy","sdfRadius","maxScale","raw","ri","y","x","ux","uy","sdf","roundedRectSDF","d","smoothStep","scaled","dx","dy","pi","i","rEnc","gEnc","hw","hh","qx","qy","a","b","t","supportsBackdropSvgRefraction","ua","FROST_BACKDROP","frostBackdropStyle","filterId","intensity","frost","value","filterCounter","GlassSurface","shape","cornerRadius","tint","className","style","children","radius","surfaceRef","useRef","useMemo","map","setMap","useLayoutEffect","raf","rect","effectiveRadius","result","filterPortal","createPortal","GlassButton","variant","props","GlassPanel","side","useDraggable","defaultPosition","computeDefaultPosition","position","setPosition","isDragging","setIsDragging","dragRef","elementRef","initDefaultPosition","useCallback","onResize","prev","onPointerDown","e","origin","onPointerMove","onPointerUp","IconUndo","IconReset","clamp","n","min","max","parseCssColor","trimmed","hex6","hex3","g","rgb","rgbToHex","rgbToCss","rgbToHsv","rn","gn","bn","s","v","hsvToRgb","sn","vn","c","m","rp","gp","bp","hue","hsvFromCss","formatHexInput","parseHexInput","fallback","cleaned","cssFromHsv","hsv","pointerPercent","clientX","clientY","clamp01","getPickerPortalRootAttributes","root","chrome","ColorPickerPopover","label","onChange","open","setOpen","setHsv","triggerRef","popoverRef","sbRef","listboxId","useId","pos","setPos","hex","preview","headerLabel","updateHsv","next","updateRgb","reposition","left","top","estimatedHeight","onDocPointer","_a","_b","onKey","handleSbPointer","startSbDrag","onMove","ev","onUp","popover","channel","clamp01Channel","EditSection","title","defaultOpen","badge","FONT_FAMILY_PRESETS","PLACEHOLDER_VALUE","primaryFontName","fontFamily","resolveFontFamilySelectValue","exact","p","partial","presetPrimary","FontFamilySelect","selectValue","options","FONT_FAMILY_PLACEHOLDER","opt","parsePx","match","parseOpacity","hasPositiveBorderWidth","uniform","parseUniformPx","single","parts","parsed","first","PROP_CONTROLS","sliderValueForProperty","_property","cssValue","config","formatSliderValue","num","PropertyField","property","compact","numeric","useSlider","rowClass","labelClass","step","handleSlider","parseShorthand","formatShorthand","right","bottom","displayNum","normalizeWrite","formatPairDisplay","parsePairCommit","ICON_SIZE","ICON_PROPS","IconHorizontalPair","IconVerticalPair","IconSide","edges","IconExpand","Cell","icon","display","ariaLabel","mixed","onCommit","draft","setDraft","SpacingField","sides","showSplit","setShowSplit","writeSides","horizontalMixed","verticalMixed","SegmentedControl","MultiSegmentedControl","onToggle","IconAlignLeft","IconAlignCenter","IconAlignRight","IconAlignJustify","IconStrikethrough","isBoldWeight","toggleBoldWeight","isItalicStyle","toggleItalicStyle","hasTextDecoration","token","toggleTextDecoration","normalizeTextAlign","BORDER_STYLE_OPTIONS","DISPLAY_OPTIONS","FLEX_GRID_DISPLAYS","EditPropertiesPanel","values","onPropertyChange","textKind","textValue","onTextChange","targetScope","onTargetScopeChange","elementState","onElementStateChange","instanceCount","scopeHint","stateHint","fontWeight","fontStyle","textDecoration","textAlign","displayValue","showDisplay","showGap","displayOptions","rawGap","gapValue","borderStyle","borderStyleOptions","id","ColorField","MAX_UNDO","STYLE_PROP_KEYS","useEditPreview","selectedElement","targetsRef","touchedRef","initialInlineRef","initialTextRef","undoStackRef","setValues","originalValues","setOriginalValues","setTextKind","setTextValue","originalText","setOriginalText","pendingByElement","setPendingByElement","canUndo","setCanUndo","captureFrame","elements","captureInlineStyles","captureTextSnapshot","pushUndo","syncTargets","reapplyPending","prevTouched","restoreInlineStyles","restoreTextSnapshot","getPreviewTargets","clearTailwindStatePreview","applyTailwindStatePreview","currentPending","change","setEditableTextPreview","styles","getRelevantComputedStyles","textInfo","getEditableTextInfo","upsertChange","oldValue","newValue","filtered","updateProperty","batch","prop","val","updateText","undo","frame","reset","revertPreviews","clearPreviews","totalPendingCount","arr","clearAllPending","EditPanel","hoveredElement","onSelectElement","onHoverElement","onApply","applyStatus","isToolbarTarget","onPreviewApi","pendingChanges","panelRef","dragHandleProps","handleMouseMove","target","handleClick","handleApply","source","readReactSource","stylingSystem","detectStylingSystem","countElementInstances","scopeSelector","getScopeSelector","scopeMatchedElements","getCssSelector","submitApply","payload","error","endpoint","res","copyToClipboard","useElementRect","setRect","VIEWPORT_MARGIN","ANCHOR_GAP","TOOLBAR_PAD","DEFAULT_PANEL_WIDTH","DEFAULT_PANEL_HEIGHT","positionToBox","boxesOverlap","inflateRect","pad","getToolbarObstacle","toolbar","clampHorizontal","panelWidth","clampVertical","panelHeight","fitsViewport","box","isValidPlacement","obstacle","computeAnnotationPopoverPosition","anchorRect","candidates","AnnotationPopover","areaBbox","onSubmit","onCancel","note","setNote","inputRef","elementRect","selectedText","getWindowSelectionText","elementText","onKeyDown","selectorLabel","handleSubmit","continuous","AreaSelectOverlay","area","buildAnnotationEntry","input","selectors","getDomPath","getNearestReactComponentName","getAnnotationAnchorRect","entry","resolveElementFromEntry","anchorRectKey","STACK_OFFSET_PX","AnnotationBadgesOverlay","annotations","pins","setPins","stackAtKey","key","stack","observed","pin","PA_OWN_SELECTOR","isPixelAgentElement","pickElementAt","isCopyAllFeedback","status","CopyFeedbackSlot","feedback","slotClassName","SessionPanel","collapsed","onToggleCollapsed","onClose","onCopyAll","onCopyOne","onRemove","onUpdate","copyStatus","copiedEntryId","copyAllFrom","editingId","setEditingId","draftNote","setDraftNote","startEdit","saveEdit","getAnnotationSessionDisplay","SettingsIcon","SunIcon","MoonIcon","ToolbarSettingsMenu","hostTheme","onToggleHostTheme","VIEWBOX","MinimalCursorMark","CLASSIC_ARROW","PixelAgentIcon","size","CAPTURE_OPTIONS","CAPTURE_LABELS","Toolbar","rootAttributes","settingsOpen","onToggleSettings","onCloseSettings","active","mode","captureMode","annotationCount","multiSelectCount","onActivateAnnotate","onActivateEdit","onDeactivate","onCaptureModeChange","onConfirmMultiSelect","option","useAnnotationSession","restored","loadAnnotationSession","setAnnotations","saveAnnotationSession","updateAnnotation","patch","removeAnnotation","usePixelAgentUi","ui","controlledHostTheme","onHostThemeChange","mergedUi","DEFAULT_PIXEL_AGENT_UI_SETTINGS","internalHostTheme","setInternalHostTheme","readHostThemeFromDocument","setSettingsOpen","sync","read","attr","resolvePixelAgentChrome","toggleHostTheme","applyHostThemeToDocument","toggleSettings","pixelAgentRootAttributes","AUTO_APPLY_PATH","normalizeAreaRect","drag","PixelAgent","applyEndpoint","pixelAgentUi","autoEndpoint","setAutoEndpoint","cancelled","setActive","setMode","setCaptureMode","setHoveredElement","setSelectedElement","setMultiSelected","pendingAnnotation","setPendingAnnotation","areaDrag","setAreaDrag","sessionDismissed","setSessionDismissed","sessionCollapsed","setSessionCollapsed","sessionVisible","setTargetScope","setElementState","setCopyStatus","setCopiedEntryId","setCopyAllFrom","containerRef","copyStatusTimer","showCopyStatus","message","copyText","text","successMessage","openAnnotationPopover","handleMouseDown","handleMouseUp","getElementsInArea","addAnnotation","cancelAnnotation","copyAllAnnotations","from","markdown","formatAllAnnotations","copyOneAnnotation","formatAnnotation","entries","changes","effectiveEndpoint","results","allApplied","activateMode","nextMode","deactivate","areaRect","isDevEnvironment","PixelAgentDev"],"mappings":"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"}