afterbefore 0.2.2 → 0.2.3

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,"sources":["../../src/overlay/index.tsx","../../src/overlay/state.ts","../../src/overlay/capture.ts","../../src/overlay/ui/icon.tsx","../../src/overlay/ui/menu.tsx","../../src/overlay/ui/selector.tsx","../../src/overlay/ui/status.tsx"],"sourcesContent":["\"use client\";\n\nimport React, { useState, useCallback, useRef } from \"react\";\nimport { useOverlayState } from \"./state\";\nimport type { CaptureMode } from \"./state\";\nimport { capture } from \"./capture\";\nimport { Icon } from \"./ui/icon\";\nimport { Menu } from \"./ui/menu\";\nimport { Selector } from \"./ui/selector\";\nimport { Status } from \"./ui/status\";\n\nasync function saveCapture(\n type: \"before\" | \"after\",\n mode: CaptureMode,\n dataUrl: string,\n) {\n try {\n const res = await fetch(\"/__afterbefore/save\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ type, mode, image: dataUrl }),\n });\n if (!res.ok) throw new Error(\"Save failed\");\n } catch {\n // Fallback: browser download (no branch info available client-side)\n const link = document.createElement(\"a\");\n link.download = `${type}.png`;\n link.href = dataUrl;\n link.click();\n }\n}\n\nexport function AfterBefore() {\n const { state, captureComplete, reset } = useOverlayState();\n const [menuOpen, setMenuOpen] = useState(false);\n const [statusOpen, setStatusOpen] = useState(false);\n const [selectorActive, setSelectorActive] = useState(false);\n const [loading, setLoading] = useState(false);\n const iconPos = useRef<{ x: number; y: number }>({ x: 24, y: 0 });\n\n const handlePositionChange = useCallback(\n (pos: { x: number; y: number }) => {\n iconPos.current = pos;\n },\n [],\n );\n\n const handleIconClick = useCallback(() => {\n if (loading) return;\n\n if (state.phase === \"ready\") {\n setStatusOpen((prev: boolean) => !prev);\n setMenuOpen(false);\n } else {\n setMenuOpen((prev: boolean) => !prev);\n setStatusOpen(false);\n }\n }, [state.phase, loading]);\n\n const performCapture = useCallback(\n async (\n mode: CaptureMode,\n area?: { x: number; y: number; width: number; height: number },\n ) => {\n setLoading(true);\n try {\n const dataUrl = await capture({ mode, area });\n const type = state.phase === \"idle\" ? \"before\" : \"after\";\n await saveCapture(type, mode, dataUrl);\n captureComplete({\n dataUrl,\n mode,\n timestamp: Date.now(),\n });\n } catch (err) {\n console.error(\"[afterbefore] Capture failed:\", err);\n } finally {\n setLoading(false);\n }\n },\n [state.phase, captureComplete],\n );\n\n const handleModeSelect = useCallback(\n (mode: CaptureMode) => {\n setMenuOpen(false);\n if (mode === \"area\") {\n setSelectorActive(true);\n } else {\n performCapture(mode);\n }\n },\n [performCapture],\n );\n\n const handleAreaSelect = useCallback(\n (area: { x: number; y: number; width: number; height: number }) => {\n setSelectorActive(false);\n performCapture(\"area\", area);\n },\n [performCapture],\n );\n\n const handleAreaCancel = useCallback(() => {\n setSelectorActive(false);\n }, []);\n\n const handleReset = useCallback(() => {\n reset();\n setStatusOpen(false);\n setMenuOpen(false);\n }, [reset]);\n\n const handleMenuClose = useCallback(() => {\n setMenuOpen(false);\n }, []);\n\n const handleStatusClose = useCallback(() => {\n setStatusOpen(false);\n }, []);\n\n return (\n <div data-afterbefore=\"true\">\n <Icon\n phase={state.phase}\n onClick={handleIconClick}\n loading={loading}\n onPositionChange={handlePositionChange}\n />\n\n {menuOpen &&\n (state.phase === \"idle\" || state.phase === \"captured-before\") && (\n <Menu\n onSelect={handleModeSelect}\n onClose={handleMenuClose}\n position={iconPos.current}\n />\n )}\n\n {selectorActive && (\n <Selector onSelect={handleAreaSelect} onCancel={handleAreaCancel} />\n )}\n\n {statusOpen && state.phase === \"ready\" && (\n <Status\n onReset={handleReset}\n position={iconPos.current}\n onClose={handleStatusClose}\n />\n )}\n </div>\n );\n}\n","import { useState, useCallback } from \"react\";\n\nexport type CaptureMode = \"viewport\" | \"fullpage\" | \"area\";\n\nexport type OverlayPhase = \"idle\" | \"captured-before\" | \"ready\";\n\nexport interface CaptureResult {\n dataUrl: string;\n mode: CaptureMode;\n timestamp: number;\n}\n\nexport interface OverlayState {\n phase: OverlayPhase;\n before: CaptureResult | null;\n after: CaptureResult | null;\n}\n\nconst initialState: OverlayState = {\n phase: \"idle\",\n before: null,\n after: null,\n};\n\nexport function useOverlayState() {\n const [state, setState] = useState<OverlayState>(initialState);\n\n const captureComplete = useCallback(\n (result: CaptureResult) => {\n setState((prev) => {\n if (prev.phase === \"idle\") {\n return { ...prev, phase: \"captured-before\", before: result };\n }\n if (prev.phase === \"captured-before\") {\n return { ...prev, phase: \"ready\", after: result };\n }\n return prev;\n });\n },\n [],\n );\n\n const reset = useCallback(() => {\n setState(initialState);\n }, []);\n\n return { state, captureComplete, reset };\n}\n","import { toPng } from \"html-to-image\";\nimport type { CaptureMode } from \"./state\";\n\ninterface CaptureOptions {\n mode: CaptureMode;\n area?: { x: number; y: number; width: number; height: number };\n}\n\nexport async function capture(options: CaptureOptions): Promise<string> {\n const { mode, area } = options;\n\n if (mode === \"viewport\") {\n return captureViewport();\n }\n if (mode === \"fullpage\") {\n return captureFullPage();\n }\n if (mode === \"area\" && area) {\n return captureArea(area);\n }\n throw new Error(`Invalid capture mode: ${mode}`);\n}\n\nasync function captureViewport(): Promise<string> {\n const dataUrl = await toPng(document.documentElement, {\n width: window.innerWidth,\n height: window.innerHeight,\n style: {\n overflow: \"hidden\",\n },\n filter: filterOverlay,\n });\n return dataUrl;\n}\n\nasync function captureFullPage(): Promise<string> {\n const scrollY = window.scrollY;\n const body = document.body;\n const html = document.documentElement;\n\n const fullHeight = Math.max(\n body.scrollHeight,\n body.offsetHeight,\n html.clientHeight,\n html.scrollHeight,\n html.offsetHeight,\n );\n\n const dataUrl = await toPng(document.documentElement, {\n width: window.innerWidth,\n height: fullHeight,\n style: {\n overflow: \"visible\",\n height: `${fullHeight}px`,\n },\n filter: filterOverlay,\n });\n\n // Restore scroll position (toPng may have changed it)\n window.scrollTo(0, scrollY);\n return dataUrl;\n}\n\nasync function captureArea(area: {\n x: number;\n y: number;\n width: number;\n height: number;\n}): Promise<string> {\n // Capture the full viewport first\n const fullDataUrl = await captureViewport();\n\n // Crop to selection using an offscreen canvas\n const img = await loadImage(fullDataUrl);\n const dpr = window.devicePixelRatio || 1;\n\n const canvas = document.createElement(\"canvas\");\n canvas.width = area.width * dpr;\n canvas.height = area.height * dpr;\n\n const ctx = canvas.getContext(\"2d\")!;\n ctx.drawImage(\n img,\n area.x * dpr,\n area.y * dpr,\n area.width * dpr,\n area.height * dpr,\n 0,\n 0,\n area.width * dpr,\n area.height * dpr,\n );\n\n return canvas.toDataURL(\"image/png\");\n}\n\nfunction loadImage(src: string): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.onload = () => resolve(img);\n img.onerror = reject;\n img.src = src;\n });\n}\n\n/** Filter out the afterbefore overlay from screenshots */\nfunction filterOverlay(node: HTMLElement): boolean {\n return !node.dataset?.afterbefore;\n}\n","\"use client\";\n\nimport React, { useRef, useCallback, useEffect, useState } from \"react\";\nimport type { OverlayPhase } from \"../state\";\n\ninterface IconProps {\n phase: OverlayPhase;\n onClick: () => void;\n loading?: boolean;\n onPositionChange?: (pos: { x: number; y: number }) => void;\n}\n\nconst ICON_SIZE = 40;\nconst EDGE_MARGIN = 24;\n\nexport function Icon({ phase, onClick, loading, onPositionChange }: IconProps) {\n const ref = useRef<HTMLDivElement>(null);\n const [pos, setPos] = useState({ x: EDGE_MARGIN, y: -1 });\n const dragState = useRef<{\n dragging: boolean;\n startX: number;\n startY: number;\n origX: number;\n origY: number;\n distance: number;\n } | null>(null);\n\n // Initialize y position on mount (need window.innerHeight)\n useEffect(() => {\n setPos((prev) => {\n if (prev.y === -1) {\n const y = window.innerHeight - ICON_SIZE - EDGE_MARGIN;\n return { x: prev.x, y };\n }\n return prev;\n });\n }, []);\n\n // Report position changes upstream\n useEffect(() => {\n if (pos.y !== -1) {\n onPositionChange?.({ x: pos.x, y: pos.y });\n }\n }, [pos, onPositionChange]);\n\n const handleMouseDown = useCallback(\n (e: React.MouseEvent) => {\n e.preventDefault();\n dragState.current = {\n dragging: true,\n startX: e.clientX,\n startY: e.clientY,\n origX: pos.x,\n origY: pos.y,\n distance: 0,\n };\n },\n [pos],\n );\n\n useEffect(() => {\n const handleMouseMove = (e: MouseEvent) => {\n const ds = dragState.current;\n if (!ds || !ds.dragging) return;\n\n const dx = e.clientX - ds.startX;\n const dy = e.clientY - ds.startY;\n ds.distance = Math.sqrt(dx * dx + dy * dy);\n\n const newX = Math.max(\n 0,\n Math.min(window.innerWidth - ICON_SIZE, ds.origX + dx),\n );\n const newY = Math.max(\n 0,\n Math.min(window.innerHeight - ICON_SIZE, ds.origY + dy),\n );\n setPos({ x: newX, y: newY });\n };\n\n const handleMouseUp = () => {\n const ds = dragState.current;\n if (!ds) return;\n\n if (ds.distance < 5) {\n onClick();\n }\n dragState.current = null;\n };\n\n window.addEventListener(\"mousemove\", handleMouseMove);\n window.addEventListener(\"mouseup\", handleMouseUp);\n return () => {\n window.removeEventListener(\"mousemove\", handleMouseMove);\n window.removeEventListener(\"mouseup\", handleMouseUp);\n };\n }, [onClick]);\n\n // Don't render until y is initialized\n if (pos.y === -1) return null;\n\n return (\n <div\n ref={ref}\n data-afterbefore=\"true\"\n onMouseDown={handleMouseDown}\n style={{\n position: \"fixed\",\n left: pos.x,\n top: pos.y,\n width: ICON_SIZE,\n height: ICON_SIZE,\n borderRadius: \"50%\",\n background: \"rgba(30, 30, 30, 0.85)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n cursor: \"grab\",\n zIndex: 2147483647,\n boxShadow: \"0 2px 8px rgba(0,0,0,0.3)\",\n transition: \"background 0.15s\",\n userSelect: \"none\",\n }}\n onMouseEnter={(e) => {\n (e.currentTarget as HTMLDivElement).style.background =\n \"rgba(30, 30, 30, 0.95)\";\n }}\n onMouseLeave={(e) => {\n (e.currentTarget as HTMLDivElement).style.background =\n \"rgba(30, 30, 30, 0.85)\";\n }}\n >\n <style\n dangerouslySetInnerHTML={{\n __html: `\n@keyframes ab-pulse {\n 0%, 100% { transform: scale(1); opacity: 1; }\n 50% { transform: scale(1.08); opacity: 0.85; }\n}\n@keyframes ab-spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n}`,\n }}\n />\n\n {loading ? (\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n style={{ animation: \"ab-spin 0.8s linear infinite\" }}\n >\n <circle\n cx=\"10\"\n cy=\"10\"\n r=\"8\"\n fill=\"none\"\n stroke=\"white\"\n strokeWidth=\"2\"\n strokeDasharray=\"40\"\n strokeDashoffset=\"10\"\n strokeLinecap=\"round\"\n />\n </svg>\n ) : phase === \"ready\" ? (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\">\n <path\n d=\"M4 10l4 4 8-8\"\n fill=\"none\"\n stroke=\"#4ade80\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n ) : (\n <div\n style={{\n position: \"relative\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n animation:\n phase === \"captured-before\"\n ? \"ab-pulse 2s ease-in-out infinite\"\n : \"none\",\n }}\n >\n {/* Camera icon */}\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\">\n <rect\n x=\"2\"\n y=\"5\"\n width=\"16\"\n height=\"12\"\n rx=\"2\"\n fill=\"none\"\n stroke=\"white\"\n strokeWidth=\"1.5\"\n />\n <circle\n cx=\"10\"\n cy=\"11\"\n r=\"3\"\n fill=\"none\"\n stroke=\"white\"\n strokeWidth=\"1.5\"\n />\n <path d=\"M7 5l1-2h4l1 2\" fill=\"none\" stroke=\"white\" strokeWidth=\"1.5\" />\n </svg>\n\n {/* Badge for captured-before */}\n {phase === \"captured-before\" && (\n <div\n style={{\n position: \"absolute\",\n top: -6,\n right: -8,\n width: 14,\n height: 14,\n borderRadius: \"50%\",\n background: \"#3b82f6\",\n color: \"white\",\n fontSize: \"9px\",\n fontWeight: 700,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n lineHeight: 1,\n fontFamily: \"system-ui, sans-serif\",\n }}\n >\n 1\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useEffect, useRef, useCallback } from \"react\";\nimport type { CaptureMode } from \"../state\";\n\ninterface MenuProps {\n onSelect: (mode: CaptureMode) => void;\n onClose: () => void;\n position: { x: number; y: number };\n}\n\nconst modes: { mode: CaptureMode; label: string; icon: React.ReactNode }[] = [\n {\n mode: \"viewport\",\n label: \"Viewport\",\n icon: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\">\n <rect\n x=\"1\"\n y=\"2\"\n width=\"14\"\n height=\"11\"\n rx=\"1.5\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n <line\n x1=\"1\"\n y1=\"14\"\n x2=\"15\"\n y2=\"14\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n ),\n },\n {\n mode: \"fullpage\",\n label: \"Full Page\",\n icon: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\">\n <rect\n x=\"3\"\n y=\"1\"\n width=\"10\"\n height=\"14\"\n rx=\"1.5\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n <line\n x1=\"5.5\"\n y1=\"4\"\n x2=\"10.5\"\n y2=\"4\"\n stroke=\"currentColor\"\n strokeWidth=\"1\"\n strokeLinecap=\"round\"\n />\n <line\n x1=\"5.5\"\n y1=\"6.5\"\n x2=\"10.5\"\n y2=\"6.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1\"\n strokeLinecap=\"round\"\n />\n <line\n x1=\"5.5\"\n y1=\"9\"\n x2=\"10.5\"\n y2=\"9\"\n stroke=\"currentColor\"\n strokeWidth=\"1\"\n strokeLinecap=\"round\"\n />\n </svg>\n ),\n },\n {\n mode: \"area\",\n label: \"Select Area\",\n icon: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\">\n <path\n d=\"M1 5V2.5A1.5 1.5 0 012.5 1H5\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M11 1h2.5A1.5 1.5 0 0115 2.5V5\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M15 11v2.5a1.5 1.5 0 01-1.5 1.5H11\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M5 15H2.5A1.5 1.5 0 011 13.5V11\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n ),\n },\n];\n\nconst MENU_WIDTH = 160;\n\nexport function Menu({ onSelect, onClose, position }: MenuProps) {\n const menuRef = useRef<HTMLDivElement>(null);\n\n const handleClickOutside = useCallback(\n (e: MouseEvent) => {\n if (menuRef.current && !menuRef.current.contains(e.target as Node)) {\n onClose();\n }\n },\n [onClose],\n );\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n onClose();\n }\n },\n [onClose],\n );\n\n useEffect(() => {\n document.addEventListener(\"mousedown\", handleClickOutside);\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n document.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [handleClickOutside, handleKeyDown]);\n\n // Position the menu above the icon, clamped to viewport\n const menuLeft = Math.max(\n 8,\n Math.min(position.x - MENU_WIDTH / 2 + 20, window.innerWidth - MENU_WIDTH - 8),\n );\n const menuBottom = window.innerHeight - position.y + 8;\n\n return (\n <div\n ref={menuRef}\n data-afterbefore=\"true\"\n style={{\n position: \"fixed\",\n left: menuLeft,\n bottom: menuBottom,\n width: MENU_WIDTH,\n background: \"rgba(24, 24, 27, 0.95)\",\n borderRadius: 10,\n padding: 4,\n boxShadow: \"0 4px 20px rgba(0,0,0,0.4), 0 0 0 1px rgba(255,255,255,0.08)\",\n zIndex: 2147483647,\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n backdropFilter: \"blur(12px)\",\n }}\n >\n {modes.map(({ mode, label, icon }) => (\n <button\n key={mode}\n onClick={() => onSelect(mode)}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n width: \"100%\",\n padding: \"8px 10px\",\n border: \"none\",\n background: \"transparent\",\n color: \"rgba(255,255,255,0.9)\",\n fontSize: 13,\n borderRadius: 6,\n cursor: \"pointer\",\n textAlign: \"left\",\n transition: \"background 0.1s\",\n }}\n onMouseEnter={(e) => {\n (e.currentTarget as HTMLButtonElement).style.background =\n \"rgba(255,255,255,0.1)\";\n }}\n onMouseLeave={(e) => {\n (e.currentTarget as HTMLButtonElement).style.background = \"transparent\";\n }}\n >\n <span\n style={{\n display: \"flex\",\n alignItems: \"center\",\n color: \"rgba(255,255,255,0.6)\",\n }}\n >\n {icon}\n </span>\n {label}\n </button>\n ))}\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useState, useRef, useCallback, useEffect } from \"react\";\n\ninterface SelectorProps {\n onSelect: (area: {\n x: number;\n y: number;\n width: number;\n height: number;\n }) => void;\n onCancel: () => void;\n}\n\nconst MIN_SIZE = 10;\n\nexport function Selector({ onSelect, onCancel }: SelectorProps) {\n const [selection, setSelection] = useState<{\n startX: number;\n startY: number;\n endX: number;\n endY: number;\n } | null>(null);\n const dragging = useRef(false);\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n onCancel();\n }\n },\n [onCancel],\n );\n\n useEffect(() => {\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => document.removeEventListener(\"keydown\", handleKeyDown);\n }, [handleKeyDown]);\n\n const handleMouseDown = useCallback((e: React.MouseEvent) => {\n e.preventDefault();\n dragging.current = true;\n setSelection({\n startX: e.clientX,\n startY: e.clientY,\n endX: e.clientX,\n endY: e.clientY,\n });\n }, []);\n\n const handleMouseMove = useCallback((e: React.MouseEvent) => {\n if (!dragging.current) return;\n setSelection((prev) => {\n if (!prev) return prev;\n return { ...prev, endX: e.clientX, endY: e.clientY };\n });\n }, []);\n\n const handleMouseUp = useCallback(() => {\n if (!dragging.current || !selection) return;\n dragging.current = false;\n\n const x = Math.min(selection.startX, selection.endX);\n const y = Math.min(selection.startY, selection.endY);\n const width = Math.abs(selection.endX - selection.startX);\n const height = Math.abs(selection.endY - selection.startY);\n\n if (width >= MIN_SIZE && height >= MIN_SIZE) {\n onSelect({ x, y, width, height });\n } else {\n setSelection(null);\n }\n }, [selection, onSelect]);\n\n // Compute the normalized rect for display\n const rect = selection\n ? {\n x: Math.min(selection.startX, selection.endX),\n y: Math.min(selection.startY, selection.endY),\n w: Math.abs(selection.endX - selection.startX),\n h: Math.abs(selection.endY - selection.startY),\n }\n : null;\n\n return (\n <div\n data-afterbefore=\"true\"\n onMouseDown={handleMouseDown}\n onMouseMove={handleMouseMove}\n onMouseUp={handleMouseUp}\n style={{\n position: \"fixed\",\n inset: 0,\n zIndex: 2147483647,\n cursor: \"crosshair\",\n }}\n >\n {/* Dimmed overlay using clip-path to cut out the selection */}\n <div\n style={{\n position: \"absolute\",\n inset: 0,\n background: \"rgba(0, 0, 0, 0.4)\",\n pointerEvents: \"none\",\n ...(rect && rect.w > 0 && rect.h > 0\n ? {\n clipPath: `polygon(\n 0% 0%, 0% 100%, 100% 100%, 100% 0%, 0% 0%,\n ${rect.x}px ${rect.y}px,\n ${rect.x}px ${rect.y + rect.h}px,\n ${rect.x + rect.w}px ${rect.y + rect.h}px,\n ${rect.x + rect.w}px ${rect.y}px,\n ${rect.x}px ${rect.y}px\n )`,\n }\n : {}),\n }}\n />\n\n {/* Selection border and label */}\n {rect && rect.w > 0 && rect.h > 0 && (\n <>\n <div\n style={{\n position: \"absolute\",\n left: rect.x,\n top: rect.y,\n width: rect.w,\n height: rect.h,\n border: \"2px solid rgba(59, 130, 246, 0.8)\",\n borderRadius: 2,\n pointerEvents: \"none\",\n boxShadow: \"0 0 0 1px rgba(0,0,0,0.3)\",\n }}\n />\n {/* Dimensions label */}\n <div\n style={{\n position: \"absolute\",\n left: rect.x + rect.w / 2,\n top: rect.y + rect.h + 8,\n transform: \"translateX(-50%)\",\n background: \"rgba(24, 24, 27, 0.9)\",\n color: \"rgba(255,255,255,0.9)\",\n fontSize: 11,\n fontFamily: \"system-ui, -apple-system, monospace\",\n padding: \"2px 8px\",\n borderRadius: 4,\n whiteSpace: \"nowrap\",\n pointerEvents: \"none\",\n }}\n >\n {Math.round(rect.w)} &times; {Math.round(rect.h)}\n </div>\n </>\n )}\n\n {/* Instruction hint when nothing selected yet */}\n {!selection && (\n <div\n style={{\n position: \"absolute\",\n top: \"50%\",\n left: \"50%\",\n transform: \"translate(-50%, -50%)\",\n color: \"rgba(255,255,255,0.7)\",\n fontSize: 14,\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n pointerEvents: \"none\",\n textShadow: \"0 1px 4px rgba(0,0,0,0.5)\",\n }}\n >\n Drag to select an area &middot; Esc to cancel\n </div>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useState, useRef, useEffect, useCallback } from \"react\";\n\ninterface StatusProps {\n onReset: () => void;\n position: { x: number; y: number };\n onClose: () => void;\n}\n\ninterface Toast {\n message: string;\n type: \"success\" | \"error\";\n}\n\nconst PANEL_WIDTH = 220;\n\nexport function Status({ onReset, position, onClose }: StatusProps) {\n const panelRef = useRef<HTMLDivElement>(null);\n const [toast, setToast] = useState<Toast | null>(null);\n const [pushing, setPushing] = useState(false);\n\n const showToast = useCallback((message: string, type: Toast[\"type\"]) => {\n setToast({ message, type });\n setTimeout(() => setToast(null), 3000);\n }, []);\n\n // Click outside to close\n useEffect(() => {\n const handler = (e: MouseEvent) => {\n if (panelRef.current && !panelRef.current.contains(e.target as Node)) {\n onClose();\n }\n };\n document.addEventListener(\"mousedown\", handler);\n return () => document.removeEventListener(\"mousedown\", handler);\n }, [onClose]);\n\n // Escape to close\n useEffect(() => {\n const handler = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") onClose();\n };\n document.addEventListener(\"keydown\", handler);\n return () => document.removeEventListener(\"keydown\", handler);\n }, [onClose]);\n\n const handleOpenFolder = async () => {\n try {\n const res = await fetch(\"/__afterbefore/open\", { method: \"POST\" });\n if (!res.ok) throw new Error();\n showToast(\"Opened folder\", \"success\");\n } catch {\n showToast(\"Could not open folder\", \"error\");\n }\n };\n\n const handleCopyMarkdown = async () => {\n try {\n const res = await fetch(\"/__afterbefore/markdown\");\n if (!res.ok) throw new Error();\n const { markdown } = await res.json();\n await navigator.clipboard.writeText(markdown);\n showToast(\"Copied!\", \"success\");\n } catch {\n showToast(\"Copy failed\", \"error\");\n }\n };\n\n const handlePush = async () => {\n setPushing(true);\n try {\n const res = await fetch(\"/__afterbefore/push\", { method: \"POST\" });\n const data = await res.json();\n if (!res.ok) {\n showToast(data.error || \"Push failed\", \"error\");\n } else if (data.pr) {\n showToast(`Posted to PR #${data.pr}`, \"success\");\n } else {\n showToast(\"No PR found\", \"error\");\n }\n } catch {\n showToast(\"Push failed\", \"error\");\n } finally {\n setPushing(false);\n }\n };\n\n const handleReset = () => {\n onReset();\n onClose();\n };\n\n const panelLeft = Math.max(\n 8,\n Math.min(position.x - PANEL_WIDTH / 2 + 20, window.innerWidth - PANEL_WIDTH - 8),\n );\n const panelBottom = window.innerHeight - position.y + 8;\n\n const buttonStyle: React.CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n width: \"100%\",\n padding: \"7px 10px\",\n border: \"none\",\n background: \"transparent\",\n color: \"rgba(255,255,255,0.9)\",\n fontSize: 13,\n borderRadius: 6,\n cursor: \"pointer\",\n textAlign: \"left\" as const,\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n transition: \"background 0.1s\",\n };\n\n const onEnter = (e: React.MouseEvent) => {\n (e.currentTarget as HTMLButtonElement).style.background =\n \"rgba(255,255,255,0.1)\";\n };\n const onLeave = (e: React.MouseEvent) => {\n (e.currentTarget as HTMLButtonElement).style.background = \"transparent\";\n };\n\n return (\n <div\n ref={panelRef}\n data-afterbefore=\"true\"\n style={{\n position: \"fixed\",\n left: panelLeft,\n bottom: panelBottom,\n width: PANEL_WIDTH,\n background: \"rgba(24, 24, 27, 0.95)\",\n borderRadius: 10,\n boxShadow:\n \"0 4px 20px rgba(0,0,0,0.4), 0 0 0 1px rgba(255,255,255,0.08)\",\n zIndex: 2147483647,\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n backdropFilter: \"blur(12px)\",\n overflow: \"hidden\",\n }}\n >\n {/* Header */}\n <div\n style={{\n padding: \"10px 12px 6px\",\n fontSize: 12,\n fontWeight: 600,\n color: \"rgba(255,255,255,0.5)\",\n letterSpacing: \"0.02em\",\n }}\n >\n Before &amp; After captured\n </div>\n\n {/* Actions */}\n <div style={{ padding: \"0 4px 4px\" }}>\n <button\n style={buttonStyle}\n onClick={handleOpenFolder}\n onMouseEnter={onEnter}\n onMouseLeave={onLeave}\n >\n <FolderIcon />\n Open Folder\n </button>\n <button\n style={buttonStyle}\n onClick={handleCopyMarkdown}\n onMouseEnter={onEnter}\n onMouseLeave={onLeave}\n >\n <CopyIcon />\n Copy Markdown\n </button>\n <button\n style={buttonStyle}\n onClick={handlePush}\n disabled={pushing}\n onMouseEnter={onEnter}\n onMouseLeave={onLeave}\n >\n <PushIcon />\n {pushing ? \"Pushing...\" : \"Push to PR\"}\n </button>\n\n {/* Separator */}\n <div\n style={{\n height: 1,\n background: \"rgba(255,255,255,0.08)\",\n margin: \"4px 6px\",\n }}\n />\n\n <button\n style={{ ...buttonStyle, color: \"rgba(255,255,255,0.5)\" }}\n onClick={handleReset}\n onMouseEnter={onEnter}\n onMouseLeave={onLeave}\n >\n <ResetIcon />\n Reset\n </button>\n </div>\n\n {/* Toast */}\n {toast && (\n <div\n style={{\n position: \"absolute\",\n bottom: \"100%\",\n left: \"50%\",\n transform: \"translateX(-50%)\",\n marginBottom: 8,\n padding: \"6px 12px\",\n borderRadius: 6,\n fontSize: 12,\n fontWeight: 500,\n whiteSpace: \"nowrap\",\n color: \"white\",\n background:\n toast.type === \"success\"\n ? \"rgba(34, 197, 94, 0.9)\"\n : \"rgba(239, 68, 68, 0.9)\",\n boxShadow: \"0 2px 8px rgba(0,0,0,0.3)\",\n }}\n >\n {toast.message}\n </div>\n )}\n </div>\n );\n}\n\nfunction FolderIcon() {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n style={{ color: \"rgba(255,255,255,0.5)\" }}\n >\n <path\n d=\"M1.5 3A1.5 1.5 0 013 1.5h2.38a1 1 0 01.72.3L7 2.72a1 1 0 00.72.3H11A1.5 1.5 0 0112.5 4.5v6A1.5 1.5 0 0111 12H3A1.5 1.5 0 011.5 10.5V3z\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.3\"\n />\n </svg>\n );\n}\n\nfunction CopyIcon() {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n style={{ color: \"rgba(255,255,255,0.5)\" }}\n >\n <rect\n x=\"4\"\n y=\"4\"\n width=\"8.5\"\n height=\"8.5\"\n rx=\"1.5\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.3\"\n />\n <path\n d=\"M10 4V2.5A1.5 1.5 0 008.5 1h-6A1.5 1.5 0 001 2.5v6A1.5 1.5 0 002.5 10H4\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.3\"\n />\n </svg>\n );\n}\n\nfunction PushIcon() {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n style={{ color: \"rgba(255,255,255,0.5)\" }}\n >\n <path\n d=\"M7 11V3m0 0L4 6m3-3l3 3\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.3\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction ResetIcon() {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n style={{ color: \"rgba(255,255,255,0.4)\" }}\n >\n <path\n d=\"M2.5 7a4.5 4.5 0 118 2.5\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.3\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M2.5 3v4h4\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.3\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n"],"mappings":"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","names":["useState","useCallback","useRef","useCallback","useState","useEffect","useRef","useCallback","jsx","jsxs","useState","useRef","useCallback","useEffect","jsx","jsxs","useState","useRef","useEffect","useCallback","jsx","jsxs","jsx","jsxs","useState","useRef","useCallback"]}
1
+ {"version":3,"sources":["../../src/overlay/index.tsx","../../src/overlay/state.ts","../../src/overlay/capture.ts","../../src/overlay/ui/icon.tsx","../../src/overlay/ui/menu.tsx","../../src/overlay/ui/selector.tsx","../../src/overlay/ui/inspector.tsx","../../src/overlay/ui/status.tsx"],"sourcesContent":["\"use client\";\n\nimport React, { useState, useCallback, useRef } from \"react\";\nimport { useOverlayState } from \"./state\";\nimport type { CaptureMode } from \"./state\";\nimport { capture } from \"./capture\";\nimport { Icon } from \"./ui/icon\";\nimport { Menu } from \"./ui/menu\";\nimport { Selector } from \"./ui/selector\";\nimport { Inspector } from \"./ui/inspector\";\nimport { Status } from \"./ui/status\";\n\nasync function saveCapture(\n type: \"before\" | \"after\",\n mode: CaptureMode,\n dataUrl: string,\n) {\n try {\n const res = await fetch(\"/__afterbefore/save\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ type, mode, image: dataUrl }),\n });\n if (!res.ok) throw new Error(\"Save failed\");\n } catch {\n // Fallback: browser download (no branch info available client-side)\n const link = document.createElement(\"a\");\n link.download = `${type}.png`;\n link.href = dataUrl;\n link.click();\n }\n}\n\nexport function AfterBefore() {\n const { state, captureComplete, reset } = useOverlayState();\n const [menuOpen, setMenuOpen] = useState(false);\n const [statusOpen, setStatusOpen] = useState(false);\n const [selectorActive, setSelectorActive] = useState(false);\n const [inspectorActive, setInspectorActive] = useState(false);\n const [loading, setLoading] = useState(false);\n const iconPos = useRef<{ x: number; y: number }>({ x: 24, y: 0 });\n\n const handlePositionChange = useCallback(\n (pos: { x: number; y: number }) => {\n iconPos.current = pos;\n },\n [],\n );\n\n const handleIconClick = useCallback(() => {\n if (loading) return;\n\n if (state.phase === \"ready\") {\n setStatusOpen((prev: boolean) => !prev);\n setMenuOpen(false);\n } else {\n setMenuOpen((prev: boolean) => !prev);\n setStatusOpen(false);\n }\n }, [state.phase, loading]);\n\n const performCapture = useCallback(\n async (\n mode: CaptureMode,\n area?: { x: number; y: number; width: number; height: number },\n element?: HTMLElement,\n ) => {\n setLoading(true);\n try {\n const dataUrl = await capture({ mode, area, element });\n const type = state.phase === \"idle\" ? \"before\" : \"after\";\n await saveCapture(type, mode, dataUrl);\n captureComplete({\n dataUrl,\n mode,\n timestamp: Date.now(),\n });\n } catch (err) {\n console.error(\"[afterbefore] Capture failed:\", err);\n } finally {\n setLoading(false);\n }\n },\n [state.phase, captureComplete],\n );\n\n const handleModeSelect = useCallback(\n (mode: CaptureMode) => {\n setMenuOpen(false);\n if (mode === \"area\") {\n setSelectorActive(true);\n } else if (mode === \"component\") {\n setInspectorActive(true);\n } else {\n performCapture(mode);\n }\n },\n [performCapture],\n );\n\n const handleComponentSelect = useCallback(\n (element: HTMLElement) => {\n setInspectorActive(false);\n performCapture(\"component\", undefined, element);\n },\n [performCapture],\n );\n\n const handleComponentCancel = useCallback(() => {\n setInspectorActive(false);\n }, []);\n\n const handleAreaSelect = useCallback(\n (area: { x: number; y: number; width: number; height: number }) => {\n setSelectorActive(false);\n performCapture(\"area\", area);\n },\n [performCapture],\n );\n\n const handleAreaCancel = useCallback(() => {\n setSelectorActive(false);\n }, []);\n\n const handleReset = useCallback(() => {\n reset();\n setStatusOpen(false);\n setMenuOpen(false);\n }, [reset]);\n\n const handleMenuClose = useCallback(() => {\n setMenuOpen(false);\n }, []);\n\n const handleStatusClose = useCallback(() => {\n setStatusOpen(false);\n }, []);\n\n return (\n <div data-afterbefore=\"true\">\n <Icon\n phase={state.phase}\n onClick={handleIconClick}\n loading={loading}\n onPositionChange={handlePositionChange}\n />\n\n {menuOpen &&\n (state.phase === \"idle\" || state.phase === \"captured-before\") && (\n <Menu\n onSelect={handleModeSelect}\n onClose={handleMenuClose}\n position={iconPos.current}\n />\n )}\n\n {selectorActive && (\n <Selector onSelect={handleAreaSelect} onCancel={handleAreaCancel} />\n )}\n\n {inspectorActive && (\n <Inspector onSelect={handleComponentSelect} onCancel={handleComponentCancel} />\n )}\n\n {statusOpen && state.phase === \"ready\" && (\n <Status\n onReset={handleReset}\n position={iconPos.current}\n onClose={handleStatusClose}\n />\n )}\n </div>\n );\n}\n","import { useState, useCallback } from \"react\";\n\nexport type CaptureMode = \"viewport\" | \"fullpage\" | \"area\" | \"component\";\n\nexport type OverlayPhase = \"idle\" | \"captured-before\" | \"ready\";\n\nexport interface CaptureResult {\n dataUrl: string;\n mode: CaptureMode;\n timestamp: number;\n}\n\nexport interface OverlayState {\n phase: OverlayPhase;\n before: CaptureResult | null;\n after: CaptureResult | null;\n}\n\nconst initialState: OverlayState = {\n phase: \"idle\",\n before: null,\n after: null,\n};\n\nexport function useOverlayState() {\n const [state, setState] = useState<OverlayState>(initialState);\n\n const captureComplete = useCallback(\n (result: CaptureResult) => {\n setState((prev) => {\n if (prev.phase === \"idle\") {\n return { ...prev, phase: \"captured-before\", before: result };\n }\n if (prev.phase === \"captured-before\") {\n return { ...prev, phase: \"ready\", after: result };\n }\n return prev;\n });\n },\n [],\n );\n\n const reset = useCallback(() => {\n setState(initialState);\n }, []);\n\n return { state, captureComplete, reset };\n}\n","import { toPng } from \"html-to-image\";\nimport type { CaptureMode } from \"./state\";\n\ninterface CaptureOptions {\n mode: CaptureMode;\n area?: { x: number; y: number; width: number; height: number };\n element?: HTMLElement;\n}\n\nexport async function capture(options: CaptureOptions): Promise<string> {\n const { mode, area, element } = options;\n\n if (mode === \"viewport\") {\n return captureViewport();\n }\n if (mode === \"fullpage\") {\n return captureFullPage();\n }\n if (mode === \"area\" && area) {\n return captureArea(area);\n }\n if (mode === \"component\" && element) {\n return captureComponent(element);\n }\n throw new Error(`Invalid capture mode: ${mode}`);\n}\n\nasync function captureViewport(): Promise<string> {\n const dataUrl = await toPng(document.documentElement, {\n width: window.innerWidth,\n height: window.innerHeight,\n style: {\n overflow: \"hidden\",\n },\n filter: filterOverlay,\n });\n return dataUrl;\n}\n\nasync function captureFullPage(): Promise<string> {\n const scrollY = window.scrollY;\n const body = document.body;\n const html = document.documentElement;\n\n const fullHeight = Math.max(\n body.scrollHeight,\n body.offsetHeight,\n html.clientHeight,\n html.scrollHeight,\n html.offsetHeight,\n );\n\n const dataUrl = await toPng(document.documentElement, {\n width: window.innerWidth,\n height: fullHeight,\n style: {\n overflow: \"visible\",\n height: `${fullHeight}px`,\n },\n filter: filterOverlay,\n });\n\n // Restore scroll position (toPng may have changed it)\n window.scrollTo(0, scrollY);\n return dataUrl;\n}\n\nasync function captureArea(area: {\n x: number;\n y: number;\n width: number;\n height: number;\n}): Promise<string> {\n // Capture the full viewport first\n const fullDataUrl = await captureViewport();\n\n // Crop to selection using an offscreen canvas\n const img = await loadImage(fullDataUrl);\n const dpr = window.devicePixelRatio || 1;\n\n const canvas = document.createElement(\"canvas\");\n canvas.width = area.width * dpr;\n canvas.height = area.height * dpr;\n\n const ctx = canvas.getContext(\"2d\")!;\n ctx.drawImage(\n img,\n area.x * dpr,\n area.y * dpr,\n area.width * dpr,\n area.height * dpr,\n 0,\n 0,\n area.width * dpr,\n area.height * dpr,\n );\n\n return canvas.toDataURL(\"image/png\");\n}\n\nasync function captureComponent(element: HTMLElement): Promise<string> {\n const dataUrl = await toPng(element, {\n filter: filterOverlay,\n });\n return dataUrl;\n}\n\nfunction loadImage(src: string): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.onload = () => resolve(img);\n img.onerror = reject;\n img.src = src;\n });\n}\n\n/** Filter out the afterbefore overlay from screenshots */\nfunction filterOverlay(node: HTMLElement): boolean {\n return !node.dataset?.afterbefore;\n}\n","\"use client\";\n\nimport React, { useRef, useCallback, useEffect, useState } from \"react\";\nimport type { OverlayPhase } from \"../state\";\n\ninterface IconProps {\n phase: OverlayPhase;\n onClick: () => void;\n loading?: boolean;\n onPositionChange?: (pos: { x: number; y: number }) => void;\n}\n\nconst ICON_SIZE = 40;\nconst EDGE_MARGIN = 24;\n\nexport function Icon({ phase, onClick, loading, onPositionChange }: IconProps) {\n const ref = useRef<HTMLDivElement>(null);\n const [pos, setPos] = useState({ x: EDGE_MARGIN, y: -1 });\n const dragState = useRef<{\n dragging: boolean;\n startX: number;\n startY: number;\n origX: number;\n origY: number;\n distance: number;\n } | null>(null);\n\n // Initialize y position on mount (need window.innerHeight)\n useEffect(() => {\n setPos((prev) => {\n if (prev.y === -1) {\n const y = window.innerHeight - ICON_SIZE - EDGE_MARGIN;\n return { x: prev.x, y };\n }\n return prev;\n });\n }, []);\n\n // Report position changes upstream\n useEffect(() => {\n if (pos.y !== -1) {\n onPositionChange?.({ x: pos.x, y: pos.y });\n }\n }, [pos, onPositionChange]);\n\n const handleMouseDown = useCallback(\n (e: React.MouseEvent) => {\n e.preventDefault();\n dragState.current = {\n dragging: true,\n startX: e.clientX,\n startY: e.clientY,\n origX: pos.x,\n origY: pos.y,\n distance: 0,\n };\n },\n [pos],\n );\n\n useEffect(() => {\n const handleMouseMove = (e: MouseEvent) => {\n const ds = dragState.current;\n if (!ds || !ds.dragging) return;\n\n const dx = e.clientX - ds.startX;\n const dy = e.clientY - ds.startY;\n ds.distance = Math.sqrt(dx * dx + dy * dy);\n\n const newX = Math.max(\n 0,\n Math.min(window.innerWidth - ICON_SIZE, ds.origX + dx),\n );\n const newY = Math.max(\n 0,\n Math.min(window.innerHeight - ICON_SIZE, ds.origY + dy),\n );\n setPos({ x: newX, y: newY });\n };\n\n const handleMouseUp = () => {\n const ds = dragState.current;\n if (!ds) return;\n\n if (ds.distance < 5) {\n onClick();\n }\n dragState.current = null;\n };\n\n window.addEventListener(\"mousemove\", handleMouseMove);\n window.addEventListener(\"mouseup\", handleMouseUp);\n return () => {\n window.removeEventListener(\"mousemove\", handleMouseMove);\n window.removeEventListener(\"mouseup\", handleMouseUp);\n };\n }, [onClick]);\n\n // Don't render until y is initialized\n if (pos.y === -1) return null;\n\n return (\n <div\n ref={ref}\n data-afterbefore=\"true\"\n onMouseDown={handleMouseDown}\n style={{\n position: \"fixed\",\n left: pos.x,\n top: pos.y,\n width: ICON_SIZE,\n height: ICON_SIZE,\n borderRadius: \"50%\",\n background: \"rgba(30, 30, 30, 0.85)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n cursor: \"grab\",\n zIndex: 2147483647,\n boxShadow: \"0 2px 8px rgba(0,0,0,0.3)\",\n transition: \"background 0.15s\",\n userSelect: \"none\",\n }}\n onMouseEnter={(e) => {\n (e.currentTarget as HTMLDivElement).style.background =\n \"rgba(30, 30, 30, 0.95)\";\n }}\n onMouseLeave={(e) => {\n (e.currentTarget as HTMLDivElement).style.background =\n \"rgba(30, 30, 30, 0.85)\";\n }}\n >\n <style\n dangerouslySetInnerHTML={{\n __html: `\n@keyframes ab-pulse {\n 0%, 100% { transform: scale(1); opacity: 1; }\n 50% { transform: scale(1.08); opacity: 0.85; }\n}\n@keyframes ab-spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n}`,\n }}\n />\n\n {loading ? (\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n style={{ animation: \"ab-spin 0.8s linear infinite\" }}\n >\n <circle\n cx=\"10\"\n cy=\"10\"\n r=\"8\"\n fill=\"none\"\n stroke=\"white\"\n strokeWidth=\"2\"\n strokeDasharray=\"40\"\n strokeDashoffset=\"10\"\n strokeLinecap=\"round\"\n />\n </svg>\n ) : phase === \"ready\" ? (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\">\n <path\n d=\"M4 10l4 4 8-8\"\n fill=\"none\"\n stroke=\"#4ade80\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n ) : (\n <div\n style={{\n position: \"relative\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n animation:\n phase === \"captured-before\"\n ? \"ab-pulse 2s ease-in-out infinite\"\n : \"none\",\n }}\n >\n {/* Camera icon */}\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\">\n <rect\n x=\"2\"\n y=\"5\"\n width=\"16\"\n height=\"12\"\n rx=\"2\"\n fill=\"none\"\n stroke=\"white\"\n strokeWidth=\"1.5\"\n />\n <circle\n cx=\"10\"\n cy=\"11\"\n r=\"3\"\n fill=\"none\"\n stroke=\"white\"\n strokeWidth=\"1.5\"\n />\n <path d=\"M7 5l1-2h4l1 2\" fill=\"none\" stroke=\"white\" strokeWidth=\"1.5\" />\n </svg>\n\n {/* Badge for captured-before */}\n {phase === \"captured-before\" && (\n <div\n style={{\n position: \"absolute\",\n top: -6,\n right: -8,\n width: 14,\n height: 14,\n borderRadius: \"50%\",\n background: \"#3b82f6\",\n color: \"white\",\n fontSize: \"9px\",\n fontWeight: 700,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n lineHeight: 1,\n fontFamily: \"system-ui, sans-serif\",\n }}\n >\n 1\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useEffect, useRef, useCallback } from \"react\";\nimport type { CaptureMode } from \"../state\";\n\ninterface MenuProps {\n onSelect: (mode: CaptureMode) => void;\n onClose: () => void;\n position: { x: number; y: number };\n}\n\nconst modes: { mode: CaptureMode; label: string; icon: React.ReactNode }[] = [\n {\n mode: \"viewport\",\n label: \"Viewport\",\n icon: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\">\n <rect\n x=\"1\"\n y=\"2\"\n width=\"14\"\n height=\"11\"\n rx=\"1.5\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n <line\n x1=\"1\"\n y1=\"14\"\n x2=\"15\"\n y2=\"14\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n ),\n },\n {\n mode: \"fullpage\",\n label: \"Full Page\",\n icon: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\">\n <rect\n x=\"3\"\n y=\"1\"\n width=\"10\"\n height=\"14\"\n rx=\"1.5\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n <line\n x1=\"5.5\"\n y1=\"4\"\n x2=\"10.5\"\n y2=\"4\"\n stroke=\"currentColor\"\n strokeWidth=\"1\"\n strokeLinecap=\"round\"\n />\n <line\n x1=\"5.5\"\n y1=\"6.5\"\n x2=\"10.5\"\n y2=\"6.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1\"\n strokeLinecap=\"round\"\n />\n <line\n x1=\"5.5\"\n y1=\"9\"\n x2=\"10.5\"\n y2=\"9\"\n stroke=\"currentColor\"\n strokeWidth=\"1\"\n strokeLinecap=\"round\"\n />\n </svg>\n ),\n },\n {\n mode: \"area\",\n label: \"Select Area\",\n icon: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\">\n <path\n d=\"M1 5V2.5A1.5 1.5 0 012.5 1H5\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M11 1h2.5A1.5 1.5 0 0115 2.5V5\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M15 11v2.5a1.5 1.5 0 01-1.5 1.5H11\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M5 15H2.5A1.5 1.5 0 011 13.5V11\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n ),\n },\n {\n mode: \"component\",\n label: \"Component\",\n icon: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\">\n {/* Cursor arrow */}\n <path\n d=\"M3 2l2.5 10 2-3.5L11 11 3 2z\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.3\"\n strokeLinejoin=\"round\"\n strokeLinecap=\"round\"\n />\n {/* Dashed box */}\n <rect\n x=\"8\"\n y=\"5\"\n width=\"6.5\"\n height=\"6.5\"\n rx=\"1\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.2\"\n strokeDasharray=\"2 1.5\"\n />\n </svg>\n ),\n },\n];\n\nconst PILL_WIDTH = 220;\nconst BTN_SIZE = 36;\n\nexport function Menu({ onSelect, onClose, position }: MenuProps) {\n const menuRef = useRef<HTMLDivElement>(null);\n\n const handleClickOutside = useCallback(\n (e: MouseEvent) => {\n if (menuRef.current && !menuRef.current.contains(e.target as Node)) {\n onClose();\n }\n },\n [onClose],\n );\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n onClose();\n }\n },\n [onClose],\n );\n\n useEffect(() => {\n document.addEventListener(\"mousedown\", handleClickOutside);\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n document.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [handleClickOutside, handleKeyDown]);\n\n // Position the pill above the icon, clamped to viewport\n const menuLeft = Math.max(\n 8,\n Math.min(position.x - PILL_WIDTH / 2 + 20, window.innerWidth - PILL_WIDTH - 8),\n );\n const menuBottom = window.innerHeight - position.y + 8;\n\n return (\n <div\n ref={menuRef}\n data-afterbefore=\"true\"\n style={{\n position: \"fixed\",\n left: menuLeft,\n bottom: menuBottom,\n display: \"flex\",\n alignItems: \"center\",\n gap: 2,\n background: \"rgba(24, 24, 27, 0.95)\",\n borderRadius: 22,\n padding: \"4px 4px\",\n boxShadow: \"0 4px 20px rgba(0,0,0,0.4), 0 0 0 1px rgba(255,255,255,0.08)\",\n zIndex: 2147483647,\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n backdropFilter: \"blur(12px)\",\n }}\n >\n {modes.map(({ mode, label, icon }) => (\n <button\n key={mode}\n title={label}\n onClick={() => onSelect(mode)}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: BTN_SIZE,\n height: BTN_SIZE,\n border: \"none\",\n background: \"transparent\",\n color: \"rgba(255,255,255,0.7)\",\n borderRadius: \"50%\",\n cursor: \"pointer\",\n padding: 0,\n transition: \"background 0.1s, color 0.1s\",\n flexShrink: 0,\n }}\n onMouseEnter={(e) => {\n const btn = e.currentTarget as HTMLButtonElement;\n btn.style.background = \"rgba(255,255,255,0.12)\";\n btn.style.color = \"rgba(255,255,255,1)\";\n }}\n onMouseLeave={(e) => {\n const btn = e.currentTarget as HTMLButtonElement;\n btn.style.background = \"transparent\";\n btn.style.color = \"rgba(255,255,255,0.7)\";\n }}\n >\n {icon}\n </button>\n ))}\n\n {/* Separator */}\n <div\n style={{\n width: 1,\n height: 20,\n background: \"rgba(255,255,255,0.12)\",\n flexShrink: 0,\n margin: \"0 2px\",\n }}\n />\n\n {/* Close button */}\n <button\n title=\"Close\"\n onClick={onClose}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: BTN_SIZE,\n height: BTN_SIZE,\n border: \"none\",\n background: \"transparent\",\n color: \"rgba(255,255,255,0.45)\",\n borderRadius: \"50%\",\n cursor: \"pointer\",\n padding: 0,\n transition: \"background 0.1s, color 0.1s\",\n flexShrink: 0,\n }}\n onMouseEnter={(e) => {\n const btn = e.currentTarget as HTMLButtonElement;\n btn.style.background = \"rgba(255,255,255,0.12)\";\n btn.style.color = \"rgba(255,255,255,0.9)\";\n }}\n onMouseLeave={(e) => {\n const btn = e.currentTarget as HTMLButtonElement;\n btn.style.background = \"transparent\";\n btn.style.color = \"rgba(255,255,255,0.45)\";\n }}\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\">\n <path\n d=\"M3 3l8 8M11 3l-8 8\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n </button>\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useState, useRef, useCallback, useEffect } from \"react\";\n\ninterface SelectorProps {\n onSelect: (area: {\n x: number;\n y: number;\n width: number;\n height: number;\n }) => void;\n onCancel: () => void;\n}\n\ntype Corner = \"tl\" | \"tr\" | \"bl\" | \"br\";\ntype DragMode = \"none\" | \"drawing\" | \"moving\" | \"resizing\";\n\ninterface Rect {\n x: number;\n y: number;\n w: number;\n h: number;\n}\n\nconst HANDLE_R = 6;\nconst HANDLE_HIT = 16;\nconst MIN_SIZE = 20;\nconst PANEL_HEIGHT_EST = 200;\n\nconst ASPECT_RATIOS = [\n { label: \"Free\", value: 0 },\n { label: \"16:9\", value: 16 / 9 },\n { label: \"4:3\", value: 4 / 3 },\n { label: \"1:1\", value: 1 },\n { label: \"3:2\", value: 3 / 2 },\n { label: \"21:9\", value: 21 / 9 },\n];\n\nexport function Selector({ onSelect, onCancel }: SelectorProps) {\n const [rect, setRect] = useState<Rect | null>(null);\n const [placed, setPlaced] = useState(false);\n const [aspect, setAspect] = useState(\"Free\");\n const [aspectOpen, setAspectOpen] = useState(false);\n const [savedOpen, setSavedOpen] = useState(false);\n const [presets, setPresets] = useState<{ label: string; rect: Rect }[]>(\n () => {\n try {\n const s = localStorage.getItem(\"ab-area-presets\");\n return s ? JSON.parse(s) : [];\n } catch {\n return [];\n }\n },\n );\n const [cursor, setCursor] = useState(\"crosshair\");\n\n const mode = useRef<DragMode>(\"none\");\n const start = useRef({ x: 0, y: 0 });\n const snap = useRef<Rect>({ x: 0, y: 0, w: 0, h: 0 });\n const corner = useRef<Corner>(\"br\");\n const panelRef = useRef<HTMLDivElement>(null);\n\n const ratio = ASPECT_RATIOS.find((a) => a.label === aspect)?.value ?? 0;\n\n // --- Keyboard ---\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if ((e.target as HTMLElement)?.tagName === \"INPUT\") {\n if (e.key === \"Escape\") (e.target as HTMLElement).blur();\n return;\n }\n if (e.key === \"Escape\") {\n if (placed) {\n setPlaced(false);\n setRect(null);\n } else {\n onCancel();\n }\n } else if (e.key === \"Enter\" && placed && rect) {\n onSelect({\n x: Math.round(rect.x),\n y: Math.round(rect.y),\n width: Math.round(rect.w),\n height: Math.round(rect.h),\n });\n }\n };\n document.addEventListener(\"keydown\", onKey);\n return () => document.removeEventListener(\"keydown\", onKey);\n }, [placed, rect, onSelect, onCancel]);\n\n // --- Hit tests ---\n const hitCorner = useCallback(\n (mx: number, my: number, r: Rect): Corner | null => {\n const cs: [Corner, number, number][] = [\n [\"tl\", r.x, r.y],\n [\"tr\", r.x + r.w, r.y],\n [\"bl\", r.x, r.y + r.h],\n [\"br\", r.x + r.w, r.y + r.h],\n ];\n for (const [c, cx, cy] of cs) {\n if (Math.abs(mx - cx) <= HANDLE_HIT && Math.abs(my - cy) <= HANDLE_HIT)\n return c;\n }\n return null;\n },\n [],\n );\n\n const hitInside = useCallback(\n (mx: number, my: number, r: Rect): boolean =>\n mx >= r.x && mx <= r.x + r.w && my >= r.y && my <= r.y + r.h,\n [],\n );\n\n // --- Mouse handlers ---\n const onDown = useCallback(\n (e: React.MouseEvent) => {\n if (panelRef.current?.contains(e.target as Node)) return;\n e.preventDefault();\n setAspectOpen(false);\n setSavedOpen(false);\n const mx = e.clientX,\n my = e.clientY;\n\n if (placed && rect) {\n const c = hitCorner(mx, my, rect);\n if (c) {\n mode.current = \"resizing\";\n corner.current = c;\n start.current = { x: mx, y: my };\n snap.current = { ...rect };\n return;\n }\n if (hitInside(mx, my, rect)) {\n mode.current = \"moving\";\n start.current = { x: mx, y: my };\n snap.current = { ...rect };\n return;\n }\n setPlaced(false);\n }\n\n mode.current = \"drawing\";\n start.current = { x: mx, y: my };\n setRect({ x: mx, y: my, w: 0, h: 0 });\n },\n [placed, rect, hitCorner, hitInside],\n );\n\n const onMove = useCallback(\n (e: React.MouseEvent) => {\n const mx = e.clientX,\n my = e.clientY;\n\n if (mode.current === \"drawing\") {\n const sx = start.current.x,\n sy = start.current.y;\n let x = Math.min(sx, mx),\n y = Math.min(sy, my);\n let w = Math.abs(mx - sx),\n h = Math.abs(my - sy);\n if (ratio > 0) {\n h = w / ratio;\n if (my < sy) y = sy - h;\n }\n setRect({ x, y, w, h });\n } else if (mode.current === \"moving\") {\n const dx = mx - start.current.x,\n dy = my - start.current.y;\n setRect({\n ...snap.current,\n x: snap.current.x + dx,\n y: snap.current.y + dy,\n });\n } else if (mode.current === \"resizing\") {\n const o = snap.current;\n const c = corner.current;\n const nr = { ...o };\n\n if (c === \"br\") {\n nr.w = Math.max(MIN_SIZE, mx - o.x);\n nr.h = ratio > 0 ? nr.w / ratio : Math.max(MIN_SIZE, my - o.y);\n } else if (c === \"bl\") {\n nr.w = Math.max(MIN_SIZE, o.x + o.w - mx);\n nr.x = o.x + o.w - nr.w;\n nr.h = ratio > 0 ? nr.w / ratio : Math.max(MIN_SIZE, my - o.y);\n } else if (c === \"tr\") {\n nr.w = Math.max(MIN_SIZE, mx - o.x);\n nr.h =\n ratio > 0\n ? nr.w / ratio\n : Math.max(MIN_SIZE, o.y + o.h - my);\n nr.y = o.y + o.h - nr.h;\n } else {\n nr.w = Math.max(MIN_SIZE, o.x + o.w - mx);\n nr.h =\n ratio > 0\n ? nr.w / ratio\n : Math.max(MIN_SIZE, o.y + o.h - my);\n nr.x = o.x + o.w - nr.w;\n nr.y = o.y + o.h - nr.h;\n }\n\n setRect(nr);\n } else if (placed && rect) {\n const c = hitCorner(mx, my, rect);\n if (c === \"tl\" || c === \"br\") setCursor(\"nwse-resize\");\n else if (c === \"tr\" || c === \"bl\") setCursor(\"nesw-resize\");\n else if (hitInside(mx, my, rect)) setCursor(\"move\");\n else setCursor(\"crosshair\");\n }\n },\n [ratio, placed, rect, hitCorner, hitInside],\n );\n\n const onUp = useCallback(() => {\n if (mode.current === \"drawing\" && rect) {\n if (rect.w >= MIN_SIZE && rect.h >= MIN_SIZE) {\n setPlaced(true);\n } else {\n setRect(null);\n }\n }\n mode.current = \"none\";\n }, [rect]);\n\n // --- Input handlers ---\n const setSize = useCallback(\n (field: \"w\" | \"h\", v: string) => {\n const n = parseInt(v, 10);\n if (isNaN(n) || n < MIN_SIZE || !rect) return;\n if (field === \"w\") {\n setRect({ ...rect, w: n, h: ratio > 0 ? n / ratio : rect.h });\n } else {\n setRect({ ...rect, h: n, w: ratio > 0 ? n * ratio : rect.w });\n }\n },\n [rect, ratio],\n );\n\n const setPos = useCallback(\n (field: \"x\" | \"y\", v: string) => {\n const n = parseInt(v, 10);\n if (isNaN(n) || !rect) return;\n setRect({ ...rect, [field]: n });\n },\n [rect],\n );\n\n // --- Presets ---\n const savePreset = useCallback(() => {\n if (!rect) return;\n const label = `${Math.round(rect.w)}\\u00d7${Math.round(rect.h)}`;\n const next = [\n ...presets.filter((p) => p.label !== label),\n { label, rect: { ...rect } },\n ];\n setPresets(next);\n try {\n localStorage.setItem(\"ab-area-presets\", JSON.stringify(next));\n } catch {\n /* noop */\n }\n setSavedOpen(false);\n }, [rect, presets]);\n\n const loadPreset = useCallback((p: { label: string; rect: Rect }) => {\n setRect({ ...p.rect });\n setPlaced(true);\n setSavedOpen(false);\n }, []);\n\n // --- Cursor ---\n const activeCursor =\n mode.current === \"moving\"\n ? \"move\"\n : mode.current === \"resizing\"\n ? \"nwse-resize\"\n : mode.current === \"drawing\"\n ? \"crosshair\"\n : cursor;\n\n // --- Panel position ---\n const panelAbove =\n rect && rect.y + rect.h + PANEL_HEIGHT_EST > window.innerHeight;\n\n const hasRect = rect && rect.w > 0 && rect.h > 0;\n\n return (\n <div\n data-afterbefore=\"true\"\n onMouseDown={onDown}\n onMouseMove={onMove}\n onMouseUp={onUp}\n style={{\n position: \"fixed\",\n inset: 0,\n zIndex: 2147483647,\n cursor: activeCursor,\n }}\n >\n {/* Dim overlay with cutout */}\n <div\n style={{\n position: \"absolute\",\n inset: 0,\n background: \"rgba(0, 0, 0, 0.5)\",\n pointerEvents: \"none\",\n ...(hasRect\n ? {\n clipPath: `polygon(\n 0% 0%, 0% 100%, 100% 100%, 100% 0%, 0% 0%,\n ${rect.x}px ${rect.y}px,\n ${rect.x}px ${rect.y + rect.h}px,\n ${rect.x + rect.w}px ${rect.y + rect.h}px,\n ${rect.x + rect.w}px ${rect.y}px,\n ${rect.x}px ${rect.y}px\n )`,\n }\n : {}),\n }}\n />\n\n {hasRect && (\n <>\n {/* Dashed selection border */}\n <div\n style={{\n position: \"absolute\",\n left: rect.x,\n top: rect.y,\n width: rect.w,\n height: rect.h,\n border: \"1.5px dashed rgba(255, 255, 255, 0.45)\",\n pointerEvents: \"none\",\n }}\n />\n\n {/* Rule-of-thirds grid (placed only) */}\n {placed &&\n [1, 2].map((i) => (\n <React.Fragment key={i}>\n <div\n style={{\n position: \"absolute\",\n left: rect.x + (rect.w * i) / 3,\n top: rect.y,\n width: 0,\n height: rect.h,\n borderLeft: \"1px dashed rgba(255, 255, 255, 0.18)\",\n pointerEvents: \"none\",\n }}\n />\n <div\n style={{\n position: \"absolute\",\n left: rect.x,\n top: rect.y + (rect.h * i) / 3,\n width: rect.w,\n height: 0,\n borderTop: \"1px dashed rgba(255, 255, 255, 0.18)\",\n pointerEvents: \"none\",\n }}\n />\n </React.Fragment>\n ))}\n\n {/* Corner handles (placed only) */}\n {placed &&\n (\n [\n [rect.x, rect.y],\n [rect.x + rect.w, rect.y],\n [rect.x, rect.y + rect.h],\n [rect.x + rect.w, rect.y + rect.h],\n ] as [number, number][]\n ).map(([cx, cy], i) => (\n <div\n key={i}\n style={{\n position: \"absolute\",\n left: cx - HANDLE_R,\n top: cy - HANDLE_R,\n width: HANDLE_R * 2,\n height: HANDLE_R * 2,\n borderRadius: \"50%\",\n border: \"2px solid rgba(255, 255, 255, 0.8)\",\n background: \"rgba(0, 0, 0, 0.25)\",\n pointerEvents: \"none\",\n }}\n />\n ))}\n\n {/* Floating info panel (placed only) */}\n {placed && (\n <div\n ref={panelRef}\n onMouseDown={(e) => e.stopPropagation()}\n style={{\n position: \"absolute\",\n left: rect.x + rect.w / 2,\n ...(panelAbove\n ? { bottom: window.innerHeight - rect.y + 16 }\n : { top: rect.y + rect.h + 16 }),\n transform: \"translateX(-50%)\",\n background: \"rgba(32, 32, 36, 0.92)\",\n backdropFilter: \"blur(20px)\",\n WebkitBackdropFilter: \"blur(20px)\",\n border: \"1px solid rgba(255, 255, 255, 0.1)\",\n borderRadius: 14,\n padding: \"16px 24px\",\n display: \"flex\",\n flexDirection: \"column\" as const,\n gap: 12,\n minWidth: 340,\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n color: \"rgba(255, 255, 255, 0.9)\",\n boxShadow: \"0 8px 32px rgba(0, 0, 0, 0.4)\",\n zIndex: 1,\n }}\n >\n {/* Size */}\n <Row label=\"Size\">\n <NumInput\n value={Math.round(rect.w)}\n onChange={(v) => setSize(\"w\", v)}\n />\n <Sep>\\u00d7</Sep>\n <NumInput\n value={Math.round(rect.h)}\n onChange={(v) => setSize(\"h\", v)}\n />\n <Unit>px</Unit>\n </Row>\n\n {/* Position */}\n <Row label=\"Position\">\n <NumInput\n value={Math.round(rect.x)}\n onChange={(v) => setPos(\"x\", v)}\n />\n <Sep />\n <NumInput\n value={Math.round(rect.y)}\n onChange={(v) => setPos(\"y\", v)}\n />\n <Unit>px</Unit>\n </Row>\n\n {/* Divider */}\n <div\n style={{\n height: 1,\n background: \"rgba(255, 255, 255, 0.08)\",\n margin: \"2px 0\",\n }}\n />\n\n {/* Aspect ratio + saved */}\n <div\n style={{ display: \"flex\", alignItems: \"center\", gap: 20 }}\n >\n {/* Aspect ratio */}\n <div style={{ position: \"relative\" }}>\n <DropBtn\n active={aspect !== \"Free\"}\n onClick={() => {\n setAspectOpen(!aspectOpen);\n setSavedOpen(false);\n }}\n >\n <AspectIcon />\n {aspect === \"Free\" ? \"Free\" : aspect}\n <Chevron />\n </DropBtn>\n {aspectOpen && (\n <DropMenu>\n {ASPECT_RATIOS.map((ar) => (\n <DropItem\n key={ar.label}\n active={ar.label === aspect}\n onClick={() => {\n setAspect(ar.label);\n setAspectOpen(false);\n if (ar.value > 0 && rect) {\n setRect({ ...rect, h: rect.w / ar.value });\n }\n }}\n >\n {ar.label}\n </DropItem>\n ))}\n </DropMenu>\n )}\n </div>\n\n {/* Saved presets */}\n <div style={{ position: \"relative\" }}>\n <DropBtn\n onClick={() => {\n setSavedOpen(!savedOpen);\n setAspectOpen(false);\n }}\n >\n <SavedIcon />\n Saved\n <Chevron />\n </DropBtn>\n {savedOpen && (\n <DropMenu>\n <DropItem\n accent\n onClick={savePreset}\n >\n Save current\n </DropItem>\n {presets.length > 0 && (\n <div\n style={{\n height: 1,\n background: \"rgba(255,255,255,0.08)\",\n margin: \"4px 0\",\n }}\n />\n )}\n {presets.map((p) => (\n <DropItem\n key={p.label}\n onClick={() => loadPreset(p)}\n >\n {p.label}\n </DropItem>\n ))}\n {presets.length === 0 && (\n <div\n style={{\n padding: \"6px 12px\",\n color: \"rgba(255,255,255,0.3)\",\n fontSize: 12,\n }}\n >\n No saved areas\n </div>\n )}\n </DropMenu>\n )}\n </div>\n </div>\n\n {/* Hint */}\n <div\n style={{\n fontSize: 11,\n color: \"rgba(255, 255, 255, 0.25)\",\n textAlign: \"center\" as const,\n }}\n >\n Enter to capture &middot; Esc to cancel\n </div>\n </div>\n )}\n\n {/* Dimensions label while drawing */}\n {!placed && (\n <div\n style={{\n position: \"absolute\",\n left: rect.x + rect.w / 2,\n top: rect.y + rect.h + 8,\n transform: \"translateX(-50%)\",\n background: \"rgba(24, 24, 27, 0.9)\",\n color: \"rgba(255, 255, 255, 0.9)\",\n fontSize: 11,\n fontFamily: \"system-ui, -apple-system, monospace\",\n padding: \"2px 8px\",\n borderRadius: 4,\n whiteSpace: \"nowrap\" as const,\n pointerEvents: \"none\" as const,\n }}\n >\n {Math.round(rect.w)} &times; {Math.round(rect.h)}\n </div>\n )}\n </>\n )}\n\n {/* Instruction hint */}\n {!rect && (\n <div\n style={{\n position: \"absolute\",\n top: \"50%\",\n left: \"50%\",\n transform: \"translate(-50%, -50%)\",\n color: \"rgba(255, 255, 255, 0.7)\",\n fontSize: 14,\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n pointerEvents: \"none\" as const,\n textShadow: \"0 1px 4px rgba(0, 0, 0, 0.5)\",\n }}\n >\n Drag to select an area &middot; Esc to cancel\n </div>\n )}\n </div>\n );\n}\n\n/* ── Sub-components ─────────────────────────────────────── */\n\nfunction Row({\n label,\n children,\n}: {\n label: string;\n children: React.ReactNode;\n}) {\n return (\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 12 }}>\n <span\n style={{\n width: 64,\n fontSize: 13,\n color: \"rgba(255, 255, 255, 0.45)\",\n fontWeight: 400,\n flexShrink: 0,\n }}\n >\n {label}\n </span>\n {children}\n </div>\n );\n}\n\nfunction Sep({ children }: { children?: React.ReactNode }) {\n return (\n <span\n style={{\n fontSize: 13,\n color: \"rgba(255, 255, 255, 0.35)\",\n width: 14,\n textAlign: \"center\" as const,\n flexShrink: 0,\n visibility: children ? \"visible\" : (\"hidden\" as const),\n }}\n >\n {children || \"\\u00d7\"}\n </span>\n );\n}\n\nfunction Unit({ children }: { children: React.ReactNode }) {\n return (\n <span\n style={{\n fontSize: 12,\n color: \"rgba(255, 255, 255, 0.3)\",\n flexShrink: 0,\n }}\n >\n {children}\n </span>\n );\n}\n\nfunction NumInput({\n value,\n onChange,\n}: {\n value: number;\n onChange: (v: string) => void;\n}) {\n const [editing, setEditing] = useState(false);\n const [text, setText] = useState(String(value));\n\n useEffect(() => {\n if (!editing) setText(String(value));\n }, [value, editing]);\n\n return (\n <input\n type=\"text\"\n value={editing ? text : String(value)}\n onFocus={() => {\n setEditing(true);\n setText(String(value));\n }}\n onBlur={() => {\n setEditing(false);\n onChange(text);\n }}\n onChange={(e) => setText(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") (e.target as HTMLElement).blur();\n }}\n style={{\n width: 72,\n padding: \"6px 10px\",\n background: \"rgba(255, 255, 255, 0.07)\",\n border: \"1px solid rgba(255, 255, 255, 0.1)\",\n borderRadius: 6,\n color: \"rgba(255, 255, 255, 0.9)\",\n fontSize: 14,\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n textAlign: \"center\" as const,\n outline: \"none\",\n }}\n />\n );\n}\n\nfunction DropBtn({\n children,\n onClick,\n active,\n}: {\n children: React.ReactNode;\n onClick: () => void;\n active?: boolean;\n}) {\n return (\n <button\n onClick={onClick}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n background: \"none\",\n border: \"none\",\n color: active\n ? \"rgba(147, 130, 220, 0.9)\"\n : \"rgba(255, 255, 255, 0.5)\",\n cursor: \"pointer\",\n fontSize: 13,\n fontFamily: \"inherit\",\n padding: \"4px 2px\",\n }}\n >\n {children}\n </button>\n );\n}\n\nfunction DropMenu({ children }: { children: React.ReactNode }) {\n return (\n <div\n style={{\n position: \"absolute\",\n bottom: \"100%\",\n left: 0,\n marginBottom: 4,\n background: \"rgba(32, 32, 36, 0.95)\",\n border: \"1px solid rgba(255, 255, 255, 0.1)\",\n borderRadius: 8,\n padding: \"4px 0\",\n minWidth: 110,\n boxShadow: \"0 4px 16px rgba(0, 0, 0, 0.3)\",\n backdropFilter: \"blur(20px)\",\n WebkitBackdropFilter: \"blur(20px)\",\n }}\n >\n {children}\n </div>\n );\n}\n\nfunction DropItem({\n children,\n onClick,\n active,\n accent,\n}: {\n children: React.ReactNode;\n onClick: () => void;\n active?: boolean;\n accent?: boolean;\n}) {\n return (\n <button\n onClick={onClick}\n style={{\n display: \"block\",\n width: \"100%\",\n padding: \"6px 12px\",\n background: active ? \"rgba(255, 255, 255, 0.08)\" : \"none\",\n border: \"none\",\n color: accent\n ? \"rgba(147, 130, 220, 0.9)\"\n : \"rgba(255, 255, 255, 0.8)\",\n textAlign: \"left\" as const,\n cursor: \"pointer\",\n fontSize: 13,\n fontFamily: \"inherit\",\n }}\n >\n {children}\n </button>\n );\n}\n\nfunction Chevron() {\n return (\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <path\n d=\"M3 4l2 2.5L7 4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.2\"\n />\n </svg>\n );\n}\n\nfunction AspectIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <rect\n x=\"2\"\n y=\"4\"\n width=\"12\"\n height=\"8\"\n rx=\"1.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.2\"\n strokeDasharray=\"2 1.5\"\n />\n <line\n x1=\"6.33\"\n y1=\"4\"\n x2=\"6.33\"\n y2=\"12\"\n stroke=\"currentColor\"\n strokeWidth=\"0.8\"\n strokeDasharray=\"1.5 1\"\n />\n <line\n x1=\"9.67\"\n y1=\"4\"\n x2=\"9.67\"\n y2=\"12\"\n stroke=\"currentColor\"\n strokeWidth=\"0.8\"\n strokeDasharray=\"1.5 1\"\n />\n </svg>\n );\n}\n\nfunction SavedIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <rect\n x=\"2\"\n y=\"3\"\n width=\"12\"\n height=\"10\"\n rx=\"1.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.2\"\n strokeDasharray=\"2 1.5\"\n />\n </svg>\n );\n}\n","\"use client\";\n\nimport React, { useEffect, useRef, useCallback, useState } from \"react\";\n\ninterface InspectorProps {\n onSelect: (element: HTMLElement) => void;\n onCancel: () => void;\n}\n\nexport function Inspector({ onSelect, onCancel }: InspectorProps) {\n const [highlight, setHighlight] = useState<{\n x: number;\n y: number;\n width: number;\n height: number;\n tag: string;\n } | null>(null);\n const hoveredEl = useRef<HTMLElement | null>(null);\n const styleEl = useRef<HTMLStyleElement | null>(null);\n\n // Inject global crosshair cursor style\n useEffect(() => {\n const style = document.createElement(\"style\");\n style.setAttribute(\"data-afterbefore\", \"true\");\n style.textContent = \"*, *::before, *::after { cursor: crosshair !important; }\";\n document.head.appendChild(style);\n styleEl.current = style;\n return () => {\n style.remove();\n };\n }, []);\n\n const isOverlayElement = useCallback((el: Element | null): boolean => {\n let node = el;\n while (node) {\n if (node instanceof HTMLElement && node.dataset.afterbefore) return true;\n node = node.parentElement;\n }\n return false;\n }, []);\n\n const handleMouseMove = useCallback(\n (e: MouseEvent) => {\n const el = document.elementFromPoint(e.clientX, e.clientY);\n if (!el || !(el instanceof HTMLElement) || isOverlayElement(el)) {\n setHighlight(null);\n hoveredEl.current = null;\n return;\n }\n hoveredEl.current = el;\n const rect = el.getBoundingClientRect();\n setHighlight({\n x: rect.x,\n y: rect.y,\n width: rect.width,\n height: rect.height,\n tag: el.tagName.toLowerCase() + (el.className && typeof el.className === \"string\" ? `.${el.className.split(\" \")[0]}` : \"\"),\n });\n },\n [isOverlayElement],\n );\n\n const handleClick = useCallback(\n (e: MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n e.stopImmediatePropagation();\n if (hoveredEl.current) {\n onSelect(hoveredEl.current);\n }\n },\n [onSelect],\n );\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n onCancel();\n }\n },\n [onCancel],\n );\n\n useEffect(() => {\n document.addEventListener(\"mousemove\", handleMouseMove, true);\n document.addEventListener(\"click\", handleClick, true);\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => {\n document.removeEventListener(\"mousemove\", handleMouseMove, true);\n document.removeEventListener(\"click\", handleClick, true);\n document.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [handleMouseMove, handleClick, handleKeyDown]);\n\n return (\n <div data-afterbefore=\"true\" style={{ position: \"fixed\", inset: 0, zIndex: 2147483646, pointerEvents: \"none\" }}>\n {highlight && (\n <>\n {/* Highlight overlay */}\n <div\n style={{\n position: \"fixed\",\n left: highlight.x,\n top: highlight.y,\n width: highlight.width,\n height: highlight.height,\n background: \"rgba(59, 130, 246, 0.15)\",\n border: \"2px solid rgba(59, 130, 246, 0.7)\",\n borderRadius: 2,\n pointerEvents: \"none\",\n }}\n />\n {/* Tag label */}\n <div\n style={{\n position: \"fixed\",\n left: highlight.x,\n top: Math.max(0, highlight.y - 24),\n background: \"rgba(59, 130, 246, 0.9)\",\n color: \"#fff\",\n fontSize: 11,\n fontFamily: \"system-ui, -apple-system, monospace\",\n padding: \"2px 6px\",\n borderRadius: 3,\n pointerEvents: \"none\",\n whiteSpace: \"nowrap\",\n lineHeight: \"18px\",\n }}\n >\n {highlight.tag}\n </div>\n </>\n )}\n\n {/* Instruction hint */}\n {!highlight && (\n <div\n style={{\n position: \"fixed\",\n top: \"50%\",\n left: \"50%\",\n transform: \"translate(-50%, -50%)\",\n color: \"rgba(255, 255, 255, 0.7)\",\n fontSize: 14,\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n pointerEvents: \"none\",\n textShadow: \"0 1px 4px rgba(0, 0, 0, 0.5)\",\n background: \"rgba(0, 0, 0, 0.5)\",\n padding: \"8px 16px\",\n borderRadius: 8,\n }}\n >\n Hover to inspect · Click to capture · Esc to cancel\n </div>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useState, useRef, useEffect, useCallback } from \"react\";\n\ninterface StatusProps {\n onReset: () => void;\n position: { x: number; y: number };\n onClose: () => void;\n}\n\ninterface Toast {\n message: string;\n type: \"success\" | \"error\";\n}\n\nconst PANEL_WIDTH = 220;\n\nexport function Status({ onReset, position, onClose }: StatusProps) {\n const panelRef = useRef<HTMLDivElement>(null);\n const [toast, setToast] = useState<Toast | null>(null);\n const [pushing, setPushing] = useState(false);\n\n const showToast = useCallback((message: string, type: Toast[\"type\"]) => {\n setToast({ message, type });\n setTimeout(() => setToast(null), 3000);\n }, []);\n\n // Click outside to close\n useEffect(() => {\n const handler = (e: MouseEvent) => {\n if (panelRef.current && !panelRef.current.contains(e.target as Node)) {\n onClose();\n }\n };\n document.addEventListener(\"mousedown\", handler);\n return () => document.removeEventListener(\"mousedown\", handler);\n }, [onClose]);\n\n // Escape to close\n useEffect(() => {\n const handler = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") onClose();\n };\n document.addEventListener(\"keydown\", handler);\n return () => document.removeEventListener(\"keydown\", handler);\n }, [onClose]);\n\n const handleOpenFolder = async () => {\n try {\n const res = await fetch(\"/__afterbefore/open\", { method: \"POST\" });\n if (!res.ok) throw new Error();\n showToast(\"Opened folder\", \"success\");\n } catch {\n showToast(\"Could not open folder\", \"error\");\n }\n };\n\n const handleCopyMarkdown = async () => {\n try {\n const res = await fetch(\"/__afterbefore/markdown\");\n if (!res.ok) throw new Error();\n const { markdown } = await res.json();\n await navigator.clipboard.writeText(markdown);\n showToast(\"Copied!\", \"success\");\n } catch {\n showToast(\"Copy failed\", \"error\");\n }\n };\n\n const handlePush = async () => {\n setPushing(true);\n try {\n const res = await fetch(\"/__afterbefore/push\", { method: \"POST\" });\n const data = await res.json();\n if (!res.ok) {\n showToast(data.error || \"Push failed\", \"error\");\n } else if (data.pr) {\n showToast(`Posted to PR #${data.pr}`, \"success\");\n } else {\n showToast(\"No PR found\", \"error\");\n }\n } catch {\n showToast(\"Push failed\", \"error\");\n } finally {\n setPushing(false);\n }\n };\n\n const handleReset = () => {\n onReset();\n onClose();\n };\n\n const panelLeft = Math.max(\n 8,\n Math.min(position.x - PANEL_WIDTH / 2 + 20, window.innerWidth - PANEL_WIDTH - 8),\n );\n const panelBottom = window.innerHeight - position.y + 8;\n\n const buttonStyle: React.CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n width: \"100%\",\n padding: \"7px 10px\",\n border: \"none\",\n background: \"transparent\",\n color: \"rgba(255,255,255,0.9)\",\n fontSize: 13,\n borderRadius: 6,\n cursor: \"pointer\",\n textAlign: \"left\" as const,\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n transition: \"background 0.1s\",\n };\n\n const onEnter = (e: React.MouseEvent) => {\n (e.currentTarget as HTMLButtonElement).style.background =\n \"rgba(255,255,255,0.1)\";\n };\n const onLeave = (e: React.MouseEvent) => {\n (e.currentTarget as HTMLButtonElement).style.background = \"transparent\";\n };\n\n return (\n <div\n ref={panelRef}\n data-afterbefore=\"true\"\n style={{\n position: \"fixed\",\n left: panelLeft,\n bottom: panelBottom,\n width: PANEL_WIDTH,\n background: \"rgba(24, 24, 27, 0.95)\",\n borderRadius: 10,\n boxShadow:\n \"0 4px 20px rgba(0,0,0,0.4), 0 0 0 1px rgba(255,255,255,0.08)\",\n zIndex: 2147483647,\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n backdropFilter: \"blur(12px)\",\n overflow: \"hidden\",\n }}\n >\n {/* Header */}\n <div\n style={{\n padding: \"10px 12px 6px\",\n fontSize: 12,\n fontWeight: 600,\n color: \"rgba(255,255,255,0.5)\",\n letterSpacing: \"0.02em\",\n }}\n >\n Before &amp; After captured\n </div>\n\n {/* Actions */}\n <div style={{ padding: \"0 4px 4px\" }}>\n <button\n style={buttonStyle}\n onClick={handleOpenFolder}\n onMouseEnter={onEnter}\n onMouseLeave={onLeave}\n >\n <FolderIcon />\n Open Folder\n </button>\n <button\n style={buttonStyle}\n onClick={handleCopyMarkdown}\n onMouseEnter={onEnter}\n onMouseLeave={onLeave}\n >\n <CopyIcon />\n Copy Markdown\n </button>\n <button\n style={buttonStyle}\n onClick={handlePush}\n disabled={pushing}\n onMouseEnter={onEnter}\n onMouseLeave={onLeave}\n >\n <PushIcon />\n {pushing ? \"Pushing...\" : \"Push to PR\"}\n </button>\n\n {/* Separator */}\n <div\n style={{\n height: 1,\n background: \"rgba(255,255,255,0.08)\",\n margin: \"4px 6px\",\n }}\n />\n\n <button\n style={{ ...buttonStyle, color: \"rgba(255,255,255,0.5)\" }}\n onClick={handleReset}\n onMouseEnter={onEnter}\n onMouseLeave={onLeave}\n >\n <ResetIcon />\n Reset\n </button>\n </div>\n\n {/* Toast */}\n {toast && (\n <div\n style={{\n position: \"absolute\",\n bottom: \"100%\",\n left: \"50%\",\n transform: \"translateX(-50%)\",\n marginBottom: 8,\n padding: \"6px 12px\",\n borderRadius: 6,\n fontSize: 12,\n fontWeight: 500,\n whiteSpace: \"nowrap\",\n color: \"white\",\n background:\n toast.type === \"success\"\n ? \"rgba(34, 197, 94, 0.9)\"\n : \"rgba(239, 68, 68, 0.9)\",\n boxShadow: \"0 2px 8px rgba(0,0,0,0.3)\",\n }}\n >\n {toast.message}\n </div>\n )}\n </div>\n );\n}\n\nfunction FolderIcon() {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n style={{ color: \"rgba(255,255,255,0.5)\" }}\n >\n <path\n d=\"M1.5 3A1.5 1.5 0 013 1.5h2.38a1 1 0 01.72.3L7 2.72a1 1 0 00.72.3H11A1.5 1.5 0 0112.5 4.5v6A1.5 1.5 0 0111 12H3A1.5 1.5 0 011.5 10.5V3z\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.3\"\n />\n </svg>\n );\n}\n\nfunction CopyIcon() {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n style={{ color: \"rgba(255,255,255,0.5)\" }}\n >\n <rect\n x=\"4\"\n y=\"4\"\n width=\"8.5\"\n height=\"8.5\"\n rx=\"1.5\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.3\"\n />\n <path\n d=\"M10 4V2.5A1.5 1.5 0 008.5 1h-6A1.5 1.5 0 001 2.5v6A1.5 1.5 0 002.5 10H4\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.3\"\n />\n </svg>\n );\n}\n\nfunction PushIcon() {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n style={{ color: \"rgba(255,255,255,0.5)\" }}\n >\n <path\n d=\"M7 11V3m0 0L4 6m3-3l3 3\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.3\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction ResetIcon() {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n style={{ color: \"rgba(255,255,255,0.4)\" }}\n >\n <path\n d=\"M2.5 7a4.5 4.5 0 118 2.5\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.3\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M2.5 3v4h4\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.3\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n"],"mappings":"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","names":["useState","useCallback","useRef","useCallback","useState","useEffect","useRef","useCallback","jsx","jsxs","React","useState","useRef","useCallback","useEffect","jsx","jsxs","useEffect","useRef","useCallback","useState","Fragment","jsx","jsxs","useState","useRef","useEffect","useCallback","jsx","jsxs","jsx","jsxs","useState","useRef","useCallback"]}
@@ -2,7 +2,7 @@ import {
2
2
  handleOpen,
3
3
  handlePush,
4
4
  handleSave
5
- } from "../chunk-DAWAW3ZL.js";
5
+ } from "../chunk-A73KCX5G.js";
6
6
 
7
7
  // src/server/middleware.ts
8
8
  import { NextResponse } from "next/server";
@@ -2,7 +2,7 @@ import {
2
2
  handleOpen,
3
3
  handlePush,
4
4
  handleSave
5
- } from "../chunk-DAWAW3ZL.js";
5
+ } from "../chunk-A73KCX5G.js";
6
6
 
7
7
  // src/server/route.ts
8
8
  import { NextResponse } from "next/server";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "afterbefore",
3
- "version": "0.2.2",
3
+ "version": "0.2.3",
4
4
  "description": "Before/after screenshot overlay for Next.js development",
5
5
  "type": "module",
6
6
  "main": "./dist/overlay/index.js",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/server/save.ts","../src/server/push.ts","../src/server/open.ts"],"sourcesContent":["import { NextRequest, NextResponse } from \"next/server\";\nimport { writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\n\nconst execFileAsync = promisify(execFile);\n\nasync function getBranch(): Promise<string> {\n const { stdout } = await execFileAsync(\"git\", [\"rev-parse\", \"--abbrev-ref\", \"HEAD\"], {\n cwd: process.cwd(),\n });\n return stdout.trim();\n}\n\nconst VALID_TYPES = [\"before\", \"after\"] as const;\ntype ScreenshotType = (typeof VALID_TYPES)[number];\n\nconst VALID_MODES = [\"fullpage\", \"viewport\", \"area\"] as const;\n\nconst DATA_URL_PREFIX = \"data:image/png;base64,\";\n\ninterface SaveRequestBody {\n type: ScreenshotType;\n mode: string;\n image: string;\n}\n\nexport async function handleSave(req: NextRequest): Promise<NextResponse> {\n let body: SaveRequestBody;\n try {\n body = await req.json();\n } catch {\n return NextResponse.json(\n { error: \"Invalid JSON body\" },\n { status: 400 },\n );\n }\n\n const { type, mode, image } = body;\n\n if (!VALID_TYPES.includes(type as ScreenshotType)) {\n return NextResponse.json(\n { error: `Invalid type: must be \"before\" or \"after\"` },\n { status: 400 },\n );\n }\n\n if (!VALID_MODES.includes(mode as (typeof VALID_MODES)[number])) {\n return NextResponse.json(\n { error: `Invalid mode: must be \"fullpage\", \"viewport\", or \"area\"` },\n { status: 400 },\n );\n }\n\n if (typeof image !== \"string\" || !image.startsWith(DATA_URL_PREFIX)) {\n return NextResponse.json(\n { error: \"Invalid image: must be a data:image/png;base64 data URL\" },\n { status: 400 },\n );\n }\n\n const base64 = image.slice(DATA_URL_PREFIX.length);\n const buffer = Buffer.from(base64, \"base64\");\n\n const branch = await getBranch();\n const filename = `${branch}-${type}.png`;\n const filepath = join(homedir(), \"Desktop\", filename);\n\n try {\n await writeFile(filepath, buffer);\n } catch (err) {\n return NextResponse.json(\n { error: \"Failed to write screenshot\", detail: String(err) },\n { status: 500 },\n );\n }\n\n return NextResponse.json({ success: true, path: `~/Desktop/${filename}` });\n}\n","import { NextRequest, NextResponse } from \"next/server\";\nimport { execFile } from \"node:child_process\";\nimport { access, mkdir, copyFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { promisify } from \"node:util\";\n\nconst execFileAsync = promisify(execFile);\n\ninterface PrInfo {\n number: number;\n url: string;\n headRepository: { owner: { login: string }; name: string };\n headRefName: string;\n}\n\nasync function run(\n cmd: string,\n args: string[],\n): Promise<{ stdout: string; stderr: string }> {\n return execFileAsync(cmd, args, { cwd: process.cwd() });\n}\n\nasync function ghAvailable(): Promise<boolean> {\n try {\n await run(\"gh\", [\"--version\"]);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function getPrInfo(): Promise<PrInfo | null> {\n try {\n const { stdout } = await run(\"gh\", [\n \"pr\",\n \"view\",\n \"--json\",\n \"number,url,headRepository,headRefName\",\n ]);\n return JSON.parse(stdout) as PrInfo;\n } catch {\n return null;\n }\n}\n\nasync function fileExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function handlePush(req: NextRequest): Promise<NextResponse> {\n // 1. Check gh CLI availability\n if (!(await ghAvailable())) {\n return NextResponse.json(\n { success: false, error: \"GitHub CLI (gh) is not installed or not in PATH\" },\n { status: 500 },\n );\n }\n\n // 2. Check for active PR\n const pr = await getPrInfo();\n if (!pr) {\n return NextResponse.json(\n { success: false, error: \"No PR found for current branch\" },\n { status: 404 },\n );\n }\n\n // 3. Check that screenshot files exist on Desktop\n const desktop = join(homedir(), \"Desktop\");\n const branch = pr.headRefName;\n const beforePath = join(desktop, `${branch}-before.png`);\n const afterPath = join(desktop, `${branch}-after.png`);\n\n const [hasBefore, hasAfter] = await Promise.all([\n fileExists(beforePath),\n fileExists(afterPath),\n ]);\n\n if (!hasBefore || !hasAfter) {\n const missing = [\n !hasBefore && `${branch}-before.png`,\n !hasAfter && `${branch}-after.png`,\n ].filter(Boolean);\n return NextResponse.json(\n { success: false, error: `Missing screenshots: ${missing.join(\", \")}` },\n { status: 400 },\n );\n }\n\n // 4. Copy from Desktop into repo, stage, commit, and push\n const repoDir = join(process.cwd(), \".afterbefore\");\n const repoBefore = join(repoDir, `${branch}-before.png`);\n const repoAfter = join(repoDir, `${branch}-after.png`);\n\n try {\n await mkdir(repoDir, { recursive: true });\n await copyFile(beforePath, repoBefore);\n await copyFile(afterPath, repoAfter);\n } catch (err) {\n return NextResponse.json(\n { success: false, error: \"Failed to copy screenshots into repo\", detail: String(err) },\n { status: 500 },\n );\n }\n\n try {\n await run(\"git\", [\"add\", repoBefore, repoAfter]);\n await run(\"git\", [\n \"commit\",\n \"-m\",\n \"chore: add before/after screenshots\",\n ]);\n } catch (err) {\n // Commit may fail if files are already committed with no changes.\n // That's fine -- we still want to push and comment.\n const msg = String(err);\n if (!msg.includes(\"nothing to commit\")) {\n return NextResponse.json(\n { success: false, error: \"Failed to commit screenshots\", detail: msg },\n { status: 500 },\n );\n }\n }\n\n try {\n await run(\"git\", [\"push\"]);\n } catch (err) {\n return NextResponse.json(\n { success: false, error: \"Failed to push to remote\", detail: String(err) },\n { status: 500 },\n );\n }\n\n // 5. Build raw GitHub URLs for the images\n const owner = pr.headRepository.owner.login;\n const repo = pr.headRepository.name;\n const rawBase = `https://raw.githubusercontent.com/${owner}/${repo}/${branch}`;\n\n const beforeUrl = `${rawBase}/.afterbefore/${branch}-before.png`;\n const afterUrl = `${rawBase}/.afterbefore/${branch}-after.png`;\n\n // Cache-bust with timestamp so GitHub doesn't serve stale images\n const ts = Date.now();\n const commentBody = [\n \"## Before / After\",\n \"\",\n \"| Before | After |\",\n \"|--------|-------|\",\n `| ![before](${beforeUrl}?t=${ts}) | ![after](${afterUrl}?t=${ts}) |`,\n ].join(\"\\n\");\n\n // 6. Post PR comment\n let commentUrl: string | undefined;\n try {\n const { stdout } = await run(\"gh\", [\n \"pr\",\n \"comment\",\n String(pr.number),\n \"--body\",\n commentBody,\n ]);\n // gh pr comment prints the comment URL to stdout\n commentUrl = stdout.trim() || undefined;\n } catch (err) {\n return NextResponse.json(\n { success: false, error: \"Failed to post PR comment\", detail: String(err) },\n { status: 500 },\n );\n }\n\n return NextResponse.json({\n success: true,\n prNumber: pr.number,\n prUrl: pr.url,\n commentUrl,\n });\n}\n","import { NextRequest, NextResponse } from \"next/server\";\nimport { execFile } from \"node:child_process\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\n\nexport async function handleOpen(_req: NextRequest): Promise<NextResponse> {\n const desktop = join(homedir(), \"Desktop\");\n\n const cmd =\n process.platform === \"darwin\"\n ? \"open\"\n : process.platform === \"win32\"\n ? \"explorer\"\n : \"xdg-open\";\n\n execFile(cmd, [desktop]);\n\n return NextResponse.json({ success: true });\n}\n"],"mappings":"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","names":["NextResponse","execFile","join","homedir","promisify","execFileAsync","NextResponse","execFile","join","homedir"]}