pixelagent 0.1.16 → 0.1.17

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 keyed by (element, state). Switching layers preserves\n // edits across elements; switching the pseudo-state on a layer preserves\n // each state's edits so hover changes don't bleed into the normal-state\n // payload. The badge sums across every (element, state) bucket; Apply\n // dispatches one payload per bucket.\n const [pendingByElement, setPendingByElement] = useState<\n Map<Element, Map<ElementState, StyleChange[]>>\n >(() => new Map());\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)?.get(elementState) ?? [])\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\n // Drop the previous state's inline preview (so hover edits don't bleed\n // into the normal-state DOM when the user toggles back), then re-apply\n // whatever the new state has pending. Normal-state pending becomes the\n // resting inline preview; hover/focus/etc. pending shows the element as\n // though it's in that state while editing.\n restoreInlineStyles(\n initialInlineRef.current.filter((s) => targets.includes(s.element))\n );\n const pendingForState =\n pendingByElement.get(selectedElement)?.get(elementState) ?? [];\n for (const change of pendingForState) {\n if (change.property === 'textContent' || change.property === 'value') continue;\n for (const el of targets) {\n el.style.setProperty(change.property, change.newValue);\n }\n }\n\n clearTailwindStatePreview(Array.from(touchedRef.current));\n applyTailwindStatePreview(targets, elementState);\n touchedRef.current = new Set(targets);\n // pendingByElement intentionally omitted — updateProperty applies new\n // edits inline directly, so re-running this effect on every keystroke\n // would just flicker.\n // eslint-disable-next-line react-hooks/exhaustive-deps\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 stateMap = new Map(next.get(selectedElement) ?? new Map<ElementState, StyleChange[]>());\n const existing = stateMap.get(elementState) ?? [];\n const filtered = existing.filter((c) => c.property !== property);\n if (newValue === oldValue) {\n if (filtered.length === 0) stateMap.delete(elementState);\n else stateMap.set(elementState, filtered);\n } else {\n stateMap.set(elementState, [...filtered, { property, oldValue, newValue }]);\n }\n if (stateMap.size === 0) next.delete(selectedElement);\n else next.set(selectedElement, stateMap);\n return next;\n });\n },\n [selectedElement, elementState]\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)?.get(elementState) ?? [])\n : [];\n\n let totalPendingCount = 0;\n for (const stateMap of pendingByElement.values()) {\n for (const arr of stateMap.values()) totalPendingCount += arr.length;\n }\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: (\n pendingByElement: Map<Element, Map<ElementState, StyleChange[]>>\n ) => Promise<{ applied: boolean; skipRevert?: 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 result = await onApply(pendingByElement);\n if (!result.applied) return;\n clearAllPending();\n // Runtime mode commits the inline preview as the final resting style,\n // so reverting would erase the applied edit. The file-patch path needs\n // the revert so the patched source/sidecar takes over rendering.\n if (!result.skipRevert) 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 * Demo mode: Apply writes normal-state edits as permanent inline styles and\n * non-normal-state edits into a managed `<style>` tag in `document.head`,\n * skipping the source-patching pipeline entirely. Useful when there's no\n * Vite dev server (e.g. a Vercel deployment) — changes look real in the\n * page but reset on reload. When this is on, `applyEndpoint`/`onApply`\n * are ignored.\n */\n runtimeStateStyles?: boolean;\n}\n\nconst AUTO_APPLY_PATH = '/__pixelagent/apply';\nconst RUNTIME_STYLE_ELEMENT_ID = 'pixelagent-runtime-styles';\nlet runtimeClassCounter = 0;\nconst runtimeClassByElement = new WeakMap<Element, string>();\n\nfunction getOrAssignRuntimeClass(element: Element): string {\n let cls = runtimeClassByElement.get(element);\n if (cls) return cls;\n // Re-use an existing pa-runtime-* class already on the element (e.g. after\n // a remount); otherwise mint a fresh one.\n for (const c of Array.from(element.classList)) {\n if (c.startsWith('pa-runtime-')) {\n runtimeClassByElement.set(element, c);\n return c;\n }\n }\n runtimeClassCounter += 1;\n cls = `pa-runtime-${runtimeClassCounter}`;\n runtimeClassByElement.set(element, cls);\n element.classList.add(cls);\n return cls;\n}\n\nfunction ensureRuntimeStyleTag(): HTMLStyleElement {\n let tag = document.getElementById(RUNTIME_STYLE_ELEMENT_ID) as HTMLStyleElement | null;\n if (!tag) {\n tag = document.createElement('style');\n tag.id = RUNTIME_STYLE_ELEMENT_ID;\n document.head.appendChild(tag);\n }\n return tag;\n}\n\n/**\n * Upsert `.<className>:<state> { property: value !important }` into the\n * runtime style tag. Existing properties on the same rule are updated in\n * place; new ones get appended inside the same block.\n */\nfunction upsertRuntimeRule(\n className: string,\n state: string,\n property: string,\n newValue: string\n) {\n const tag = ensureRuntimeStyleTag();\n const escaped = className.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const ruleRegex = new RegExp(\n `(\\\\.${escaped}:${state}\\\\s*\\\\{)([\\\\s\\\\S]*?)(\\\\})`,\n 'm'\n );\n const declaration = `${property}: ${newValue} !important`;\n let content = tag.textContent ?? '';\n const match = content.match(ruleRegex);\n if (match) {\n const inner = match[2];\n const propRegex = new RegExp(`(\\\\s*${property.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}\\\\s*:\\\\s*)[^;]+;?`);\n let nextInner: string;\n if (propRegex.test(inner)) {\n nextInner = inner.replace(propRegex, `$1${newValue} !important;`);\n } else {\n const trimmed = inner.replace(/\\s+$/, '');\n const sep = trimmed.endsWith(';') || trimmed === '' ? '' : ';';\n nextInner = `${trimmed}${sep}\\n ${declaration};\\n`;\n }\n content = content.replace(ruleRegex, `$1${nextInner}$3`);\n } else {\n if (content && !content.endsWith('\\n')) content += '\\n';\n content += `\\n.${className}:${state} {\\n ${declaration};\\n}\\n`;\n }\n tag.textContent = content;\n}\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 runtimeStateStyles,\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 (\n pendingByElement: Map<Element, Map<ElementState, ApplyPayload['changes']>>\n ): Promise<{ applied: boolean; skipRevert?: boolean }> => {\n const entries: Array<[Element, ElementState, ApplyPayload['changes']]> = [];\n for (const [element, stateMap] of pendingByElement) {\n for (const [state, changes] of stateMap) {\n if (changes.length > 0) entries.push([element, state, changes]);\n }\n }\n if (entries.length === 0) return { applied: false };\n\n if (runtimeStateStyles) {\n // Demo mode: commit non-normal edits via a managed <style> tag and\n // turn normal-state previews into permanent inline styles. Order\n // matters — non-normal cleanup must remove its hover preview before\n // we re-apply normal inline values on top.\n for (const [element, state, changes] of entries) {\n if (state === 'normal') continue;\n const cls = getOrAssignRuntimeClass(element);\n for (const c of changes) {\n (element as HTMLElement).style.removeProperty(c.property);\n upsertRuntimeRule(cls, state, c.property, c.newValue);\n }\n }\n for (const [element, state, changes] of entries) {\n if (state !== 'normal') continue;\n for (const c of changes) {\n (element as HTMLElement).style.setProperty(c.property, c.newValue);\n }\n }\n showCopyStatus('Change applied');\n return { applied: true, skipRevert: true };\n }\n\n const effectiveEndpoint = applyEndpoint ?? autoEndpoint ?? undefined;\n const results = [];\n for (const [element, state, 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,\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 { applied: allApplied };\n },\n [targetScope, applyEndpoint, autoEndpoint, onApply, runtimeStateStyles, 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","pendingForState","upsertChange","oldValue","newValue","stateMap","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","RUNTIME_STYLE_ELEMENT_ID","runtimeClassCounter","runtimeClassByElement","getOrAssignRuntimeClass","cls","ensureRuntimeStyleTag","tag","upsertRuntimeRule","state","escaped","ruleRegex","declaration","content","inner","propRegex","nextInner","sep","normalizeAreaRect","drag","PixelAgent","applyEndpoint","runtimeStateStyles","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 keyed by (element, state). Switching layers preserves\n // edits across elements; switching the pseudo-state on a layer preserves\n // each state's edits so hover changes don't bleed into the normal-state\n // payload. The badge sums across every (element, state) bucket; Apply\n // dispatches one payload per bucket.\n const [pendingByElement, setPendingByElement] = useState<\n Map<Element, Map<ElementState, StyleChange[]>>\n >(() => new Map());\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)?.get(elementState) ?? [])\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\n // Drop the previous state's inline preview (so hover edits don't bleed\n // into the normal-state DOM when the user toggles back), then re-apply\n // whatever the new state has pending. Normal-state pending becomes the\n // resting inline preview; hover/focus/etc. pending shows the element as\n // though it's in that state while editing.\n restoreInlineStyles(\n initialInlineRef.current.filter((s) => targets.includes(s.element))\n );\n const pendingForState =\n pendingByElement.get(selectedElement)?.get(elementState) ?? [];\n for (const change of pendingForState) {\n if (change.property === 'textContent' || change.property === 'value') continue;\n for (const el of targets) {\n el.style.setProperty(change.property, change.newValue);\n }\n }\n\n // Reset the panel display to baseline overlaid with whatever the new\n // state has pending. Otherwise an edit made in Hover keeps showing in\n // the Normal field after the state toggle, even though the DOM is\n // already back to its resting style.\n const nextValues: Record<string, string> = { ...originalValues };\n for (const change of pendingForState) {\n if (change.property === 'textContent' || change.property === 'value') continue;\n nextValues[change.property] = change.newValue;\n }\n setValues(nextValues);\n\n clearTailwindStatePreview(Array.from(touchedRef.current));\n applyTailwindStatePreview(targets, elementState);\n touchedRef.current = new Set(targets);\n // pendingByElement intentionally omitted — updateProperty applies new\n // edits inline directly, so re-running this effect on every keystroke\n // would just flicker.\n // eslint-disable-next-line react-hooks/exhaustive-deps\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 stateMap = new Map(next.get(selectedElement) ?? new Map<ElementState, StyleChange[]>());\n const existing = stateMap.get(elementState) ?? [];\n const filtered = existing.filter((c) => c.property !== property);\n if (newValue === oldValue) {\n if (filtered.length === 0) stateMap.delete(elementState);\n else stateMap.set(elementState, filtered);\n } else {\n stateMap.set(elementState, [...filtered, { property, oldValue, newValue }]);\n }\n if (stateMap.size === 0) next.delete(selectedElement);\n else next.set(selectedElement, stateMap);\n return next;\n });\n },\n [selectedElement, elementState]\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)?.get(elementState) ?? [])\n : [];\n\n let totalPendingCount = 0;\n for (const stateMap of pendingByElement.values()) {\n for (const arr of stateMap.values()) totalPendingCount += arr.length;\n }\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: (\n pendingByElement: Map<Element, Map<ElementState, StyleChange[]>>\n ) => Promise<{ applied: boolean; skipRevert?: 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 result = await onApply(pendingByElement);\n if (!result.applied) return;\n clearAllPending();\n // Runtime mode commits the inline preview as the final resting style,\n // so reverting would erase the applied edit. The file-patch path needs\n // the revert so the patched source/sidecar takes over rendering.\n if (!result.skipRevert) 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 * Demo mode: Apply writes normal-state edits as permanent inline styles and\n * non-normal-state edits into a managed `<style>` tag in `document.head`,\n * skipping the source-patching pipeline entirely. Useful when there's no\n * Vite dev server (e.g. a Vercel deployment) — changes look real in the\n * page but reset on reload. When this is on, `applyEndpoint`/`onApply`\n * are ignored.\n */\n runtimeStateStyles?: boolean;\n}\n\nconst AUTO_APPLY_PATH = '/__pixelagent/apply';\nconst RUNTIME_STYLE_ELEMENT_ID = 'pixelagent-runtime-styles';\nlet runtimeClassCounter = 0;\nconst runtimeClassByElement = new WeakMap<Element, string>();\n\nfunction getOrAssignRuntimeClass(element: Element): string {\n let cls = runtimeClassByElement.get(element);\n if (cls) return cls;\n // Re-use an existing pa-runtime-* class already on the element (e.g. after\n // a remount); otherwise mint a fresh one.\n for (const c of Array.from(element.classList)) {\n if (c.startsWith('pa-runtime-')) {\n runtimeClassByElement.set(element, c);\n return c;\n }\n }\n runtimeClassCounter += 1;\n cls = `pa-runtime-${runtimeClassCounter}`;\n runtimeClassByElement.set(element, cls);\n element.classList.add(cls);\n return cls;\n}\n\nfunction ensureRuntimeStyleTag(): HTMLStyleElement {\n let tag = document.getElementById(RUNTIME_STYLE_ELEMENT_ID) as HTMLStyleElement | null;\n if (!tag) {\n tag = document.createElement('style');\n tag.id = RUNTIME_STYLE_ELEMENT_ID;\n document.head.appendChild(tag);\n }\n return tag;\n}\n\n/**\n * Upsert `.<className>:<state> { property: value !important }` into the\n * runtime style tag. Existing properties on the same rule are updated in\n * place; new ones get appended inside the same block.\n */\nfunction upsertRuntimeRule(\n className: string,\n state: string,\n property: string,\n newValue: string\n) {\n const tag = ensureRuntimeStyleTag();\n const escaped = className.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const ruleRegex = new RegExp(\n `(\\\\.${escaped}:${state}\\\\s*\\\\{)([\\\\s\\\\S]*?)(\\\\})`,\n 'm'\n );\n const declaration = `${property}: ${newValue} !important`;\n let content = tag.textContent ?? '';\n const match = content.match(ruleRegex);\n if (match) {\n const inner = match[2];\n const propRegex = new RegExp(`(\\\\s*${property.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}\\\\s*:\\\\s*)[^;]+;?`);\n let nextInner: string;\n if (propRegex.test(inner)) {\n nextInner = inner.replace(propRegex, `$1${newValue} !important;`);\n } else {\n const trimmed = inner.replace(/\\s+$/, '');\n const sep = trimmed.endsWith(';') || trimmed === '' ? '' : ';';\n nextInner = `${trimmed}${sep}\\n ${declaration};\\n`;\n }\n content = content.replace(ruleRegex, `$1${nextInner}$3`);\n } else {\n if (content && !content.endsWith('\\n')) content += '\\n';\n content += `\\n.${className}:${state} {\\n ${declaration};\\n}\\n`;\n }\n tag.textContent = content;\n}\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 runtimeStateStyles,\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 (\n pendingByElement: Map<Element, Map<ElementState, ApplyPayload['changes']>>\n ): Promise<{ applied: boolean; skipRevert?: boolean }> => {\n const entries: Array<[Element, ElementState, ApplyPayload['changes']]> = [];\n for (const [element, stateMap] of pendingByElement) {\n for (const [state, changes] of stateMap) {\n if (changes.length > 0) entries.push([element, state, changes]);\n }\n }\n if (entries.length === 0) return { applied: false };\n\n if (runtimeStateStyles) {\n // Demo mode: commit non-normal edits via a managed <style> tag and\n // turn normal-state previews into permanent inline styles. Order\n // matters — non-normal cleanup must remove its hover preview before\n // we re-apply normal inline values on top.\n for (const [element, state, changes] of entries) {\n if (state === 'normal') continue;\n const cls = getOrAssignRuntimeClass(element);\n for (const c of changes) {\n (element as HTMLElement).style.removeProperty(c.property);\n upsertRuntimeRule(cls, state, c.property, c.newValue);\n }\n }\n for (const [element, state, changes] of entries) {\n if (state !== 'normal') continue;\n for (const c of changes) {\n (element as HTMLElement).style.setProperty(c.property, c.newValue);\n }\n }\n showCopyStatus('Change applied');\n return { applied: true, skipRevert: true };\n }\n\n const effectiveEndpoint = applyEndpoint ?? autoEndpoint ?? undefined;\n const results = [];\n for (const [element, state, 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,\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 { applied: allApplied };\n },\n [targetScope, applyEndpoint, autoEndpoint, onApply, runtimeStateStyles, 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","pendingForState","nextValues","upsertChange","oldValue","newValue","stateMap","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","RUNTIME_STYLE_ELEMENT_ID","runtimeClassCounter","runtimeClassByElement","getOrAssignRuntimeClass","cls","ensureRuntimeStyleTag","tag","upsertRuntimeRule","state","escaped","ruleRegex","declaration","content","inner","propRegex","nextInner","sep","normalizeAreaRect","drag","PixelAgent","applyEndpoint","runtimeStateStyles","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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"}