afterbefore 0.2.13 → 0.2.14

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.
@@ -181,11 +181,13 @@ function loadImage(src) {
181
181
  import { useRef, useCallback as useCallback2, useEffect, useState as useState2 } from "react";
182
182
  import { Camera, Check, LoaderCircle } from "lucide-react";
183
183
  import { jsx, jsxs } from "react/jsx-runtime";
184
- var ICON_SIZE = 32;
184
+ var CONTAINER_SIZE = 38;
185
+ var ICON_SIZE = CONTAINER_SIZE;
185
186
  var EDGE_MARGIN = 24;
186
187
  function Icon({ phase, onClick, loading, onPositionChange }) {
187
188
  const ref = useRef(null);
188
189
  const [pos, setPos] = useState2({ x: -1, y: -1 });
190
+ const [dragging, setDragging] = useState2(false);
189
191
  const dragState = useRef(null);
190
192
  useEffect(() => {
191
193
  setPos((prev) => {
@@ -206,6 +208,7 @@ function Icon({ phase, onClick, loading, onPositionChange }) {
206
208
  const handleMouseDown = useCallback2(
207
209
  (e) => {
208
210
  e.preventDefault();
211
+ setDragging(true);
209
212
  dragState.current = {
210
213
  dragging: true,
211
214
  startX: e.clientX,
@@ -240,6 +243,7 @@ function Icon({ phase, onClick, loading, onPositionChange }) {
240
243
  if (ds.distance < 5) {
241
244
  onClick();
242
245
  }
246
+ setDragging(false);
243
247
  dragState.current = null;
244
248
  };
245
249
  window.addEventListener("mousemove", handleMouseMove);
@@ -260,17 +264,17 @@ function Icon({ phase, onClick, loading, onPositionChange }) {
260
264
  position: "fixed",
261
265
  left: pos.x,
262
266
  top: pos.y,
263
- width: ICON_SIZE,
264
- height: ICON_SIZE,
267
+ width: CONTAINER_SIZE,
268
+ height: CONTAINER_SIZE,
265
269
  borderRadius: "50%",
266
270
  background: "rgba(32, 32, 36, 0.92)",
267
271
  backdropFilter: "blur(20px)",
268
272
  WebkitBackdropFilter: "blur(20px)",
269
- border: "1px solid rgba(255, 255, 255, 0.1)",
273
+ border: "none",
270
274
  display: "flex",
271
275
  alignItems: "center",
272
276
  justifyContent: "center",
273
- cursor: "grab",
277
+ cursor: dragging ? "grabbing" : "pointer",
274
278
  zIndex: 2147483647,
275
279
  boxShadow: "0 8px 32px rgba(0, 0, 0, 0.4)",
276
280
  transition: "background 0.15s",
@@ -310,7 +314,7 @@ function Icon({ phase, onClick, loading, onPositionChange }) {
310
314
 
311
315
  // src/overlay/ui/preview.tsx
312
316
  import { jsx as jsx2 } from "react/jsx-runtime";
313
- var CAMERA_CURSOR = `url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M14.5 4h-5L7 7H4a2 2 0 0 0-2 2v9a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2h-3l-2.5-3z'/%3E%3Ccircle cx='12' cy='13' r='3'/%3E%3C/svg%3E") 16 16, pointer`;
317
+ var CAMERA_CURSOR = `url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32' viewBox='0 0 32 32'%3E%3Cpath d='M6 12h4l2-3h8l2 3h4a3 3 0 0 1 3 3v9a3 3 0 0 1-3 3H6a3 3 0 0 1-3-3v-9a3 3 0 0 1 3-3z' fill='black' fill-opacity='0.25' transform='translate(0,1)'/%3E%3Cpath d='M6 12h4l2-3h8l2 3h4a3 3 0 0 1 3 3v9a3 3 0 0 1-3 3H6a3 3 0 0 1-3-3v-9a3 3 0 0 1 3-3z' fill='white'/%3E%3Ccircle cx='16' cy='19' r='4.5' fill='none' stroke='%23555' stroke-width='1.5'/%3E%3Ccircle cx='16' cy='19' r='1.5' fill='%23999'/%3E%3C/svg%3E") 16 16, pointer`;
314
318
  function CapturePreview({ mode, onClick }) {
315
319
  if (mode === "viewport" || mode === "fullpage") {
316
320
  return /* @__PURE__ */ jsx2(
@@ -323,8 +327,7 @@ function CapturePreview({ mode, onClick }) {
323
327
  inset: 0,
324
328
  zIndex: 2147483645,
325
329
  cursor: CAMERA_CURSOR,
326
- background: "rgba(59, 130, 246, 0.15)",
327
- boxShadow: "inset 0 0 0 2px rgba(59, 130, 246, 0.7)"
330
+ background: "rgba(59, 130, 246, 0.15)"
328
331
  }
329
332
  }
330
333
  );
@@ -403,7 +406,7 @@ function Toolbar({
403
406
  background: "rgba(32, 32, 36, 0.92)",
404
407
  backdropFilter: "blur(20px)",
405
408
  WebkitBackdropFilter: "blur(20px)",
406
- border: "1px solid rgba(255, 255, 255, 0.1)",
409
+ border: "none",
407
410
  borderRadius: 999,
408
411
  padding: 6,
409
412
  boxShadow: "0 8px 32px rgba(0, 0, 0, 0.4)",
@@ -450,7 +453,7 @@ function CloseButton({ onClick }) {
450
453
  style: {
451
454
  width: 32,
452
455
  height: 32,
453
- borderRadius: 10,
456
+ borderRadius: "50%",
454
457
  border: "none",
455
458
  background: hovered ? "rgba(255, 255, 255, 0.12)" : "transparent",
456
459
  display: "flex",
@@ -505,7 +508,7 @@ function ModeButton({
505
508
  style: {
506
509
  width: 32,
507
510
  height: 32,
508
- borderRadius: 10,
511
+ borderRadius: "50%",
509
512
  border: "none",
510
513
  background: selected || hovered ? "rgba(255, 255, 255, 0.12)" : "transparent",
511
514
  display: "flex",
@@ -663,7 +666,30 @@ function FrameSizeControl({
663
666
  const isCustom = !currentPreset;
664
667
  return /* @__PURE__ */ jsxs2("div", { children: [
665
668
  /* @__PURE__ */ jsx3(SettingsLabel, { children: "Size" }),
666
- /* @__PURE__ */ jsx3("div", { style: { display: "flex", alignItems: "center", gap: 6, marginTop: 4 }, children: /* @__PURE__ */ jsxs2("div", { style: { position: "relative", flex: 1 }, children: [
669
+ /* @__PURE__ */ jsxs2("div", { style: { display: "flex", alignItems: "center", gap: 4, marginTop: 4 }, children: [
670
+ /* @__PURE__ */ jsx3(
671
+ NumInput,
672
+ {
673
+ value: size.w,
674
+ onChange: (v) => {
675
+ const n = parseInt(v, 10);
676
+ if (!Number.isNaN(n) && n > 0) onChange({ ...size, w: n });
677
+ }
678
+ }
679
+ ),
680
+ /* @__PURE__ */ jsx3(StaticText, { children: "x" }),
681
+ /* @__PURE__ */ jsx3(
682
+ NumInput,
683
+ {
684
+ value: size.h,
685
+ onChange: (v) => {
686
+ const n = parseInt(v, 10);
687
+ if (!Number.isNaN(n) && n > 0) onChange({ ...size, h: n });
688
+ }
689
+ }
690
+ )
691
+ ] }),
692
+ /* @__PURE__ */ jsxs2("div", { style: { position: "relative", marginTop: 6 }, children: [
667
693
  /* @__PURE__ */ jsxs2(
668
694
  "button",
669
695
  {
@@ -690,7 +716,7 @@ function FrameSizeControl({
690
716
  ]
691
717
  }
692
718
  ),
693
- sizeOpen && /* @__PURE__ */ jsxs2(
719
+ sizeOpen && /* @__PURE__ */ jsx3(
694
720
  "div",
695
721
  {
696
722
  style: {
@@ -707,44 +733,18 @@ function FrameSizeControl({
707
733
  WebkitBackdropFilter: "blur(20px)",
708
734
  zIndex: 1
709
735
  },
710
- children: [
711
- FRAME_SIZE_PRESETS.map((preset) => /* @__PURE__ */ jsx3(
712
- DropItem,
713
- {
714
- active: !isCustom && preset.w === size.w && preset.h === size.h,
715
- onClick: () => {
716
- onChange({ w: preset.w, h: preset.h });
717
- setSizeOpen(false);
718
- },
719
- children: preset.label
736
+ children: FRAME_SIZE_PRESETS.map((preset) => /* @__PURE__ */ jsx3(
737
+ DropItem,
738
+ {
739
+ active: !isCustom && preset.w === size.w && preset.h === size.h,
740
+ onClick: () => {
741
+ onChange({ w: preset.w, h: preset.h });
742
+ setSizeOpen(false);
720
743
  },
721
- preset.label
722
- )),
723
- /* @__PURE__ */ jsx3(DropItem, { active: isCustom, onClick: () => setSizeOpen(false), children: "Custom" })
724
- ]
725
- }
726
- )
727
- ] }) }),
728
- isCustom && /* @__PURE__ */ jsxs2("div", { style: { display: "flex", alignItems: "center", gap: 4, marginTop: 6 }, children: [
729
- /* @__PURE__ */ jsx3(
730
- NumInput,
731
- {
732
- value: size.w,
733
- onChange: (v) => {
734
- const n = parseInt(v, 10);
735
- if (!Number.isNaN(n) && n > 0) onChange({ ...size, w: n });
736
- }
737
- }
738
- ),
739
- /* @__PURE__ */ jsx3(StaticText, { children: "x" }),
740
- /* @__PURE__ */ jsx3(
741
- NumInput,
742
- {
743
- value: size.h,
744
- onChange: (v) => {
745
- const n = parseInt(v, 10);
746
- if (!Number.isNaN(n) && n > 0) onChange({ ...size, h: n });
747
- }
744
+ children: preset.label
745
+ },
746
+ preset.label
747
+ ))
748
748
  }
749
749
  )
750
750
  ] })
@@ -805,7 +805,7 @@ function FrameBackgroundControl({
805
805
  ] }),
806
806
  bgType === "color" && /* @__PURE__ */ jsxs2("div", { style: { display: "flex", alignItems: "center", gap: 8, marginTop: 6 }, children: [
807
807
  /* @__PURE__ */ jsx3(ColorSwatch, { color: bgColor, onChange: (c) => onChange({ bgColor: c }) }),
808
- /* @__PURE__ */ jsx3("span", { style: { fontSize: 12, color: "rgba(255,255,255,0.6)" }, children: bgColor })
808
+ /* @__PURE__ */ jsx3(HexInput, { value: bgColor, onChange: (c) => onChange({ bgColor: c }) })
809
809
  ] }),
810
810
  bgType === "image" && /* @__PURE__ */ jsxs2("div", { style: { marginTop: 6 }, children: [
811
811
  /* @__PURE__ */ jsx3(
@@ -1148,6 +1148,57 @@ function NumInput({
1148
1148
  }
1149
1149
  );
1150
1150
  }
1151
+ function HexInput({
1152
+ value,
1153
+ onChange
1154
+ }) {
1155
+ const [editing, setEditing] = useState3(false);
1156
+ const [text, setText] = useState3(value);
1157
+ useEffect2(() => {
1158
+ if (!editing) {
1159
+ setText(value);
1160
+ }
1161
+ }, [editing, value]);
1162
+ const commit = (raw) => {
1163
+ const hex = raw.startsWith("#") ? raw : `#${raw}`;
1164
+ if (/^#[0-9a-fA-F]{6}$/.test(hex)) {
1165
+ onChange(hex);
1166
+ }
1167
+ };
1168
+ return /* @__PURE__ */ jsx3(
1169
+ "input",
1170
+ {
1171
+ type: "text",
1172
+ value: editing ? text : value,
1173
+ onFocus: () => {
1174
+ setEditing(true);
1175
+ setText(value);
1176
+ },
1177
+ onBlur: () => {
1178
+ setEditing(false);
1179
+ commit(text);
1180
+ },
1181
+ onChange: (e) => setText(e.target.value),
1182
+ onKeyDown: (e) => {
1183
+ if (e.key === "Enter") {
1184
+ e.target.blur();
1185
+ }
1186
+ },
1187
+ style: {
1188
+ width: 72,
1189
+ padding: "4px 6px",
1190
+ background: "rgba(255, 255, 255, 0.07)",
1191
+ border: "1px solid rgba(255, 255, 255, 0.1)",
1192
+ borderRadius: 7,
1193
+ color: "rgba(255, 255, 255, 0.9)",
1194
+ fontSize: 12,
1195
+ fontFamily: "system-ui, -apple-system, sans-serif",
1196
+ textAlign: "left",
1197
+ outline: "none"
1198
+ }
1199
+ }
1200
+ );
1201
+ }
1151
1202
  function StaticText({ children }) {
1152
1203
  return /* @__PURE__ */ jsx3(
1153
1204
  "span",
@@ -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/preview.tsx","../../src/overlay/ui/toolbar.tsx","../../src/overlay/ui/inspector.tsx","../../src/overlay/ui/status.tsx"],"sourcesContent":["\"use client\";\n\nimport React, { useState, useCallback, useRef, useEffect } from \"react\";\nimport { useOverlayState } from \"./state\";\nimport type { CaptureMode } from \"./state\";\nimport { capture, DEFAULT_FRAME_SETTINGS, type FrameSettings } from \"./capture\";\nimport { Icon } from \"./ui/icon\";\nimport { CapturePreview } from \"./ui/preview\";\nimport { Toolbar } from \"./ui/toolbar\";\nimport { Inspector } from \"./ui/inspector\";\nimport { Status } from \"./ui/status\";\n\nasync function saveCapture(mode: CaptureMode, dataUrl: string) {\n try {\n const res = await fetch(\"/__afterbefore/save\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ 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 = \"screenshot.png\";\n link.href = dataUrl;\n link.click();\n }\n}\n\nexport function AfterBefore() {\n const { state, captureComplete, reset } = useOverlayState();\n const [statusOpen, setStatusOpen] = useState(false);\n const [toolbarActive, setToolbarActive] = useState(false);\n const [inspectorActive, setInspectorActive] = useState(false);\n const [loading, setLoading] = useState(false);\n const [selectedMode, setSelectedMode] = useState<CaptureMode>(\"component\");\n const [frameSettings, setFrameSettings] = useState<FrameSettings>(DEFAULT_FRAME_SETTINGS);\n const iconPos = useRef<{ x: number; y: number }>({ x: 24, y: 0 });\n\n useEffect(() => {\n try {\n const stored = localStorage.getItem(\"ab-frame-settings\");\n if (stored) {\n setFrameSettings({ ...DEFAULT_FRAME_SETTINGS, ...JSON.parse(stored) });\n } else if (localStorage.getItem(\"ab-frame-black\") === \"true\") {\n // Migration from old boolean setting\n const migrated = { ...DEFAULT_FRAME_SETTINGS, enabled: true };\n setFrameSettings(migrated);\n localStorage.setItem(\"ab-frame-settings\", JSON.stringify(migrated));\n localStorage.removeItem(\"ab-frame-black\");\n }\n } catch {\n setFrameSettings(DEFAULT_FRAME_SETTINGS);\n }\n }, []);\n\n useEffect(() => {\n if (state.phase === \"ready\") {\n const timer = setTimeout(() => {\n reset();\n setStatusOpen(false);\n }, 1500);\n return () => clearTimeout(timer);\n }\n }, [state.phase, reset]);\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 } else if (toolbarActive || inspectorActive) {\n setToolbarActive(false);\n setInspectorActive(false);\n setStatusOpen(false);\n } else {\n setStatusOpen(false);\n if (selectedMode === \"component\") {\n setToolbarActive(true);\n setInspectorActive(true);\n } else {\n setToolbarActive(true);\n setInspectorActive(false);\n }\n }\n }, [state.phase, loading, toolbarActive, inspectorActive, selectedMode]);\n\n const performCapture = useCallback(\n async (\n mode: CaptureMode,\n element?: HTMLElement,\n ) => {\n setLoading(true);\n try {\n const dataUrl = await capture({ mode, element, frameSettings });\n await saveCapture(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 [captureComplete, frameSettings],\n );\n\n const handleToolbarCapture = useCallback(\n (mode: CaptureMode) => {\n if (mode === \"viewport\") {\n setToolbarActive(false);\n performCapture(\"viewport\");\n } else if (mode === \"fullpage\") {\n setToolbarActive(false);\n performCapture(\"fullpage\");\n } else if (mode === \"component\") {\n setInspectorActive(true);\n }\n },\n [performCapture],\n );\n\n const handleToolbarCancel = useCallback(() => {\n setToolbarActive(false);\n }, []);\n\n const handleComponentSelect = useCallback(\n (element: HTMLElement) => {\n setInspectorActive(false);\n setToolbarActive(false);\n performCapture(\"component\", element);\n },\n [performCapture],\n );\n\n const handleComponentCancel = useCallback(() => {\n setInspectorActive(false);\n setToolbarActive(true);\n }, []);\n\n const handleFrameSettingsChange = useCallback((next: FrameSettings) => {\n setFrameSettings(next);\n try {\n localStorage.setItem(\"ab-frame-settings\", JSON.stringify(next));\n } catch {\n // noop\n }\n }, []);\n\n const handleModeChange = useCallback((mode: CaptureMode) => {\n setSelectedMode(mode);\n if (mode === \"component\") {\n setInspectorActive(true);\n }\n }, []);\n\n const handleReset = useCallback(() => {\n reset();\n setStatusOpen(false);\n }, [reset]);\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 {toolbarActive && !inspectorActive && !loading && (\n <CapturePreview\n mode={selectedMode}\n onClick={() => handleToolbarCapture(selectedMode)}\n />\n )}\n\n {toolbarActive && (\n <Toolbar\n selectedMode={selectedMode}\n onModeChange={handleModeChange}\n onCapture={handleToolbarCapture}\n onCancel={handleToolbarCancel}\n frameSettings={frameSettings}\n onFrameSettingsChange={handleFrameSettingsChange}\n />\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\" | \"component\";\n\nexport type OverlayPhase = \"idle\" | \"ready\";\n\nexport interface CaptureResult {\n dataUrl: string;\n mode: CaptureMode;\n timestamp: number;\n}\n\nexport interface OverlayState {\n phase: OverlayPhase;\n lastCapture: CaptureResult | null;\n}\n\nconst initialState: OverlayState = {\n phase: \"idle\",\n lastCapture: null,\n};\n\nexport function useOverlayState() {\n const [state, setState] = useState<OverlayState>(initialState);\n\n const captureComplete = useCallback(\n (result: CaptureResult) => {\n setState({ phase: \"ready\", lastCapture: result });\n },\n [],\n );\n\n const reset = useCallback(() => {\n setState(initialState);\n }, []);\n\n return { state, captureComplete, reset };\n}\n","import { snapdom } from \"@zumer/snapdom\";\nimport type { CaptureMode } from \"./state\";\n\nexport interface FrameSettings {\n enabled: boolean;\n size: { w: number; h: number };\n bgType: \"color\" | \"image\";\n bgColor: string;\n bgImage: string | null;\n padding: number;\n}\n\nexport const DEFAULT_FRAME_SETTINGS: FrameSettings = {\n enabled: false,\n size: { w: 1920, h: 1080 },\n bgType: \"color\",\n bgColor: \"#000000\",\n bgImage: null,\n padding: 40,\n};\n\nexport const FRAME_SIZE_PRESETS: { label: string; w: number; h: number }[] = [\n { label: \"1920 x 1080\", w: 1920, h: 1080 },\n { label: \"1080 x 1080\", w: 1080, h: 1080 },\n { label: \"1200 x 630\", w: 1200, h: 630 },\n { label: \"1080 x 1920\", w: 1080, h: 1920 },\n];\n\ninterface CaptureOptions {\n mode: CaptureMode;\n element?: HTMLElement;\n frameSettings?: FrameSettings;\n}\n\n/** Selectors for dev tool UI that should be excluded from capture */\nconst DEV_UI_SELECTORS = [\n // Afterbefore overlay\n \"[data-afterbefore]\",\n // Next.js dev indicators\n \"[data-nextjs-toast]\",\n \"[data-nextjs-dev-overlay]\",\n \"[data-nextjs-dialog]\",\n \"[data-nextjs-dialog-backdrop]\",\n \"[data-next-badge]\",\n \"[data-next-mark]\",\n];\n\nconst SNAPDOM_BASE = {\n exclude: DEV_UI_SELECTORS,\n excludeMode: \"remove\" as const,\n};\n\nasync function toPngDataUrl(\n el: Element,\n opts?: Record<string, unknown>,\n): Promise<string> {\n const result = await snapdom(el, { ...SNAPDOM_BASE, ...opts });\n const img = await result.toPng();\n return img.src;\n}\n\nexport async function capture(options: CaptureOptions): Promise<string> {\n const { mode, element } = options;\n\n if (mode === \"viewport\") {\n return captureViewport();\n }\n if (mode === \"fullpage\") {\n return captureFullPage();\n }\n if (mode === \"component\" && element) {\n return captureComponent(element, options.frameSettings);\n }\n throw new Error(`Invalid capture mode: ${mode}`);\n}\n\nasync function captureViewport(): Promise<string> {\n const dpr = window.devicePixelRatio || 1;\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n const scrollY = window.scrollY;\n\n // snapdom renders the full element content, so capture full page and crop to viewport\n const fullDataUrl = await captureFullPage();\n const img = await loadImage(fullDataUrl);\n\n const canvas = document.createElement(\"canvas\");\n canvas.width = vw * dpr;\n canvas.height = vh * dpr;\n\n const ctx = canvas.getContext(\"2d\")!;\n ctx.drawImage(\n img,\n 0,\n scrollY * dpr,\n vw * dpr,\n vh * dpr,\n 0,\n 0,\n vw * dpr,\n vh * dpr,\n );\n\n return canvas.toDataURL(\"image/png\");\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 prevOverflow = html.style.overflow;\n const prevHeight = html.style.height;\n html.style.overflow = \"visible\";\n html.style.height = `${fullHeight}px`;\n\n try {\n return await toPngDataUrl(document.documentElement, {\n width: window.innerWidth,\n height: fullHeight,\n });\n } finally {\n html.style.overflow = prevOverflow;\n html.style.height = prevHeight;\n window.scrollTo(0, scrollY);\n }\n}\n\nasync function captureComponent(\n element: HTMLElement,\n frameSettings?: FrameSettings,\n): Promise<string> {\n const dataUrl = await toPngDataUrl(element);\n\n if (!frameSettings?.enabled) {\n return dataUrl;\n }\n\n const img = await loadImage(dataUrl);\n const dpr = window.devicePixelRatio || 1;\n\n const FRAME_W = frameSettings.size.w;\n const FRAME_H = frameSettings.size.h;\n const padding = frameSettings.padding;\n\n // Component dimensions in CSS pixels\n const compW = img.width / dpr;\n const compH = img.height / dpr;\n\n // Scale down if component exceeds frame (with padding)\n const maxW = FRAME_W - padding * 2;\n const maxH = FRAME_H - padding * 2;\n const scale = Math.min(1, maxW / compW, maxH / compH);\n\n const drawW = compW * scale * dpr;\n const drawH = compH * scale * dpr;\n\n const canvas = document.createElement(\"canvas\");\n canvas.width = FRAME_W * dpr;\n canvas.height = FRAME_H * dpr;\n\n const ctx = canvas.getContext(\"2d\")!;\n\n // Draw background\n if (frameSettings.bgType === \"image\" && frameSettings.bgImage) {\n try {\n const bgImg = await loadImage(frameSettings.bgImage);\n drawCover(ctx, bgImg, canvas.width, canvas.height);\n } catch {\n // Fallback to color if image fails\n ctx.fillStyle = frameSettings.bgColor;\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n }\n } else {\n ctx.fillStyle = frameSettings.bgColor;\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n }\n\n // Center the component\n const dx = (canvas.width - drawW) / 2;\n const dy = (canvas.height - drawH) / 2;\n ctx.drawImage(img, dx, dy, drawW, drawH);\n\n return canvas.toDataURL(\"image/png\");\n}\n\n/** Draw image with cover-fit (like CSS background-size: cover) */\nfunction drawCover(\n ctx: CanvasRenderingContext2D,\n img: HTMLImageElement,\n cw: number,\n ch: number,\n) {\n const scale = Math.max(cw / img.width, ch / img.height);\n const sw = cw / scale;\n const sh = ch / scale;\n const sx = (img.width - sw) / 2;\n const sy = (img.height - sh) / 2;\n ctx.drawImage(img, sx, sy, sw, sh, 0, 0, cw, ch);\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","\"use client\";\n\nimport React, { useRef, useCallback, useEffect, useState } from \"react\";\nimport { Camera, Check, LoaderCircle } from \"lucide-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 = 32;\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: -1, 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 position on mount (need window dimensions)\n useEffect(() => {\n setPos((prev) => {\n if (prev.x === -1 || prev.y === -1) {\n return {\n x: window.innerWidth - ICON_SIZE - EDGE_MARGIN,\n y: window.innerHeight - ICON_SIZE - EDGE_MARGIN,\n };\n }\n return prev;\n });\n }, []);\n\n // Report position changes upstream\n useEffect(() => {\n if (pos.x !== -1 && 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 position is initialized\n if (pos.x === -1 || 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(32, 32, 36, 0.92)\",\n backdropFilter: \"blur(20px)\",\n WebkitBackdropFilter: \"blur(20px)\",\n border: \"1px solid rgba(255, 255, 255, 0.1)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n cursor: \"grab\",\n zIndex: 2147483647,\n boxShadow: \"0 8px 32px rgba(0, 0, 0, 0.4)\",\n transition: \"background 0.15s\",\n userSelect: \"none\",\n }}\n onMouseEnter={(e) => {\n (e.currentTarget as HTMLDivElement).style.background =\n \"rgba(32, 32, 36, 0.98)\";\n }}\n onMouseLeave={(e) => {\n (e.currentTarget as HTMLDivElement).style.background =\n \"rgba(32, 32, 36, 0.92)\";\n }}\n >\n <style\n dangerouslySetInnerHTML={{\n __html: `\n@keyframes ab-spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n}`,\n }}\n />\n\n {loading ? (\n <LoaderCircle\n size={16}\n strokeWidth={2}\n style={{ animation: \"ab-spin 0.8s linear infinite\", color: \"white\" }}\n />\n ) : phase === \"ready\" ? (\n <Check size={16} strokeWidth={2.6} color=\"#4ade80\" />\n ) : (\n <Camera size={16} strokeWidth={1.9} color=\"white\" />\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport React from \"react\";\nimport type { CaptureMode } from \"../state\";\n\ninterface CapturePreviewProps {\n mode: CaptureMode;\n onClick?: () => void;\n}\n\nconst CAMERA_CURSOR = `url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M14.5 4h-5L7 7H4a2 2 0 0 0-2 2v9a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2h-3l-2.5-3z'/%3E%3Ccircle cx='12' cy='13' r='3'/%3E%3C/svg%3E\") 16 16, pointer`;\n\nexport function CapturePreview({ mode, onClick }: CapturePreviewProps) {\n if (mode === \"viewport\" || mode === \"fullpage\") {\n return (\n <div\n data-afterbefore=\"true\"\n onClick={onClick}\n style={{\n position: \"fixed\",\n inset: 0,\n zIndex: 2147483645,\n cursor: CAMERA_CURSOR,\n background: \"rgba(59, 130, 246, 0.15)\",\n boxShadow: \"inset 0 0 0 2px rgba(59, 130, 246, 0.7)\",\n }}\n />\n );\n }\n\n return null;\n}\n","\"use client\";\n\nimport React, { useEffect, useRef, useState } from \"react\";\nimport {\n ChevronDown,\n Maximize,\n FolderOpen,\n Frame,\n ImageIcon,\n Monitor,\n MousePointer2,\n Palette,\n Settings,\n Trash2,\n Upload,\n X,\n} from \"lucide-react\";\nimport type { CaptureMode } from \"../state\";\nimport { FRAME_SIZE_PRESETS, type FrameSettings } from \"../capture\";\n\ninterface ToolbarProps {\n selectedMode: CaptureMode;\n onModeChange: (mode: CaptureMode) => void;\n onCapture: (mode: CaptureMode) => void;\n onCancel: () => void;\n frameSettings: FrameSettings;\n onFrameSettingsChange: (settings: FrameSettings) => void;\n}\n\nconst MODES: { mode: CaptureMode; label: string; icon: React.ComponentType<{ size?: number; strokeWidth?: number }> }[] = [\n { mode: \"component\", label: \"Capture Component\", icon: MousePointer2 },\n { mode: \"viewport\", label: \"Capture Viewport\", icon: Monitor },\n { mode: \"fullpage\", label: \"Capture Full Page\", icon: Maximize },\n];\n\nexport function Toolbar({\n selectedMode,\n onModeChange,\n onCapture,\n onCancel,\n frameSettings,\n onFrameSettingsChange,\n}: ToolbarProps) {\n const [settingsOpen, setSettingsOpen] = useState(false);\n\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if ((e.target as HTMLElement)?.tagName === \"INPUT\") {\n if (e.key === \"Escape\") {\n (e.target as HTMLElement).blur();\n }\n return;\n }\n\n if (e.key === \"Escape\") {\n if (settingsOpen) {\n setSettingsOpen(false);\n return;\n }\n onCancel();\n } else if (e.key === \"Enter\") {\n onCapture(selectedMode);\n }\n };\n\n document.addEventListener(\"keydown\", onKey);\n return () => document.removeEventListener(\"keydown\", onKey);\n }, [onCancel, onCapture, selectedMode, settingsOpen]);\n\n return (\n <div\n data-afterbefore=\"true\"\n style={{\n position: \"fixed\",\n bottom: 48,\n left: \"50%\",\n transform: \"translateX(-50%)\",\n zIndex: 2147483647,\n display: \"flex\",\n alignItems: \"center\",\n gap: 10,\n flexWrap: \"wrap\",\n justifyContent: \"center\",\n maxWidth: \"min(calc(100vw - 32px), 1120px)\",\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: 999,\n padding: 6,\n boxShadow: \"0 8px 32px rgba(0, 0, 0, 0.4)\",\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n }}\n >\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 0 }}>\n <CloseButton onClick={onCancel} />\n\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 2, padding: \"0 4px\" }}>\n {MODES.map(({ mode, label, icon: Icon }) => (\n <ModeButton\n key={mode}\n label={label}\n selected={selectedMode === mode}\n onClick={() => {\n setSettingsOpen(false);\n onModeChange(mode);\n }}\n >\n <Icon size={16} strokeWidth={1.7} />\n </ModeButton>\n ))}\n </div>\n\n <Separator />\n\n <SettingsButton\n open={settingsOpen}\n onClick={() => setSettingsOpen((prev) => !prev)}\n selectedMode={selectedMode}\n frameSettings={frameSettings}\n onFrameSettingsChange={onFrameSettingsChange}\n />\n\n </div>\n </div>\n );\n}\n\nfunction CloseButton({ onClick }: { onClick: () => void }) {\n const [hovered, setHovered] = useState(false);\n\n return (\n <button\n onClick={onClick}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n style={{\n width: 32,\n height: 32,\n borderRadius: 10,\n border: \"none\",\n background: hovered ? \"rgba(255, 255, 255, 0.12)\" : \"transparent\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n cursor: \"pointer\",\n padding: 0,\n color: hovered\n ? \"rgba(255, 255, 255, 0.96)\"\n : \"rgba(255, 255, 255, 0.52)\",\n transition: \"background 0.12s ease, color 0.12s ease\",\n }}\n >\n <X size={16} strokeWidth={1.7} />\n </button>\n );\n}\n\nfunction ModeButton({\n children,\n label,\n selected,\n onClick,\n}: {\n children: React.ReactNode;\n label: string;\n selected: boolean;\n onClick: () => void;\n}) {\n const [hovered, setHovered] = useState(false);\n\n return (\n <div style={{ position: \"relative\" }}>\n {hovered && (\n <div\n style={{\n position: \"absolute\",\n left: \"50%\",\n bottom: \"calc(100% + 10px)\",\n transform: \"translateX(-50%)\",\n background: \"rgba(32, 32, 36, 0.96)\",\n backdropFilter: \"blur(20px)\",\n WebkitBackdropFilter: \"blur(20px)\",\n border: \"1px solid rgba(255, 255, 255, 0.1)\",\n borderRadius: 8,\n padding: \"5px 10px\",\n color: \"rgba(255, 255, 255, 0.88)\",\n fontSize: 12,\n whiteSpace: \"nowrap\",\n boxShadow: \"0 8px 28px rgba(0, 0, 0, 0.28)\",\n pointerEvents: \"none\",\n }}\n >\n {label}\n </div>\n )}\n\n <button\n onClick={onClick}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n style={{\n width: 32,\n height: 32,\n borderRadius: 10,\n border: \"none\",\n background: selected || hovered\n ? \"rgba(255, 255, 255, 0.12)\"\n : \"transparent\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n cursor: \"pointer\",\n padding: 0,\n color: selected || hovered\n ? \"rgba(255, 255, 255, 0.96)\"\n : \"rgba(255, 255, 255, 0.52)\",\n transition: \"background 0.12s ease, color 0.12s ease\",\n }}\n >\n {children}\n </button>\n </div>\n );\n}\n\nfunction SettingsButton({\n open,\n onClick,\n selectedMode,\n frameSettings,\n onFrameSettingsChange,\n}: {\n open: boolean;\n onClick: () => void;\n selectedMode: CaptureMode;\n frameSettings: FrameSettings;\n onFrameSettingsChange: (settings: FrameSettings) => void;\n}) {\n const [hovered, setHovered] = useState(false);\n const [saveDir, setSaveDir] = useState<string | null>(null);\n const [picking, setPicking] = useState(false);\n\n useEffect(() => {\n if (!open) return;\n fetch(\"/__afterbefore/config\")\n .then((r) => r.json())\n .then((data) => setSaveDir(data.saveDir))\n .catch(() => {});\n }, [open]);\n\n const handlePickFolder = async () => {\n setPicking(true);\n try {\n const res = await fetch(\"/__afterbefore/pick-folder\", { method: \"POST\" });\n const data = await res.json();\n if (data.folder) {\n await fetch(\"/__afterbefore/config\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ saveDir: data.folder }),\n });\n setSaveDir(data.folder);\n }\n } catch {\n // noop\n } finally {\n setPicking(false);\n }\n };\n\n const shortDir = saveDir\n ? saveDir.replace(/^\\/Users\\/[^/]+/, \"~\")\n : \"~/Desktop\";\n\n return (\n <div style={{ position: \"relative\" }}>\n <button\n onClick={onClick}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n style={{\n width: 32,\n height: 32,\n borderRadius: \"50%\",\n border: \"none\",\n background: open || hovered ? \"rgba(255, 255, 255, 0.12)\" : \"transparent\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n cursor: \"pointer\",\n padding: 0,\n color: open || hovered\n ? \"rgba(255, 255, 255, 0.96)\"\n : \"rgba(255, 255, 255, 0.52)\",\n transition: \"background 0.12s ease, color 0.12s ease\",\n }}\n >\n <Settings size={16} strokeWidth={1.7} />\n </button>\n\n {open && (\n <div\n style={{\n position: \"absolute\",\n left: \"50%\",\n bottom: \"calc(100% + 12px)\",\n transform: \"translateX(-50%)\",\n minWidth: 260,\n padding: \"10px 12px\",\n borderRadius: 12,\n background: \"rgba(32, 32, 36, 0.96)\",\n border: \"1px solid rgba(255, 255, 255, 0.1)\",\n boxShadow: \"0 14px 36px rgba(0, 0, 0, 0.32)\",\n backdropFilter: \"blur(20px)\",\n WebkitBackdropFilter: \"blur(20px)\",\n }}\n >\n <div\n style={{\n fontSize: 11,\n color: \"rgba(255, 255, 255, 0.46)\",\n letterSpacing: \"0.03em\",\n textTransform: \"uppercase\",\n marginBottom: 10,\n }}\n >\n Settings\n </div>\n\n {selectedMode === \"component\" && (\n <>\n <ToggleRow\n icon={<Frame size={15} strokeWidth={1.8} />}\n label=\"Frame\"\n enabled={frameSettings.enabled}\n onChange={() =>\n onFrameSettingsChange({ ...frameSettings, enabled: !frameSettings.enabled })\n }\n />\n\n {frameSettings.enabled && (\n <div style={{ marginTop: 8, display: \"flex\", flexDirection: \"column\", gap: 10 }}>\n <FrameSizeControl\n size={frameSettings.size}\n onChange={(size) => onFrameSettingsChange({ ...frameSettings, size })}\n />\n <FrameBackgroundControl\n bgType={frameSettings.bgType}\n bgColor={frameSettings.bgColor}\n bgImage={frameSettings.bgImage}\n frameSize={frameSettings.size}\n onChange={(updates) => onFrameSettingsChange({ ...frameSettings, ...updates })}\n />\n </div>\n )}\n </>\n )}\n\n {selectedMode === \"component\" && (\n <div style={{ height: 1, background: \"rgba(255,255,255,0.08)\", margin: \"8px 0\" }} />\n )}\n\n <SaveLocationRow\n dir={shortDir}\n picking={picking}\n onPick={handlePickFolder}\n />\n </div>\n )}\n </div>\n );\n}\n\nfunction FrameSizeControl({\n size,\n onChange,\n}: {\n size: { w: number; h: number };\n onChange: (size: { w: number; h: number }) => void;\n}) {\n const [sizeOpen, setSizeOpen] = useState(false);\n\n const currentPreset = FRAME_SIZE_PRESETS.find((p) => p.w === size.w && p.h === size.h);\n const isCustom = !currentPreset;\n\n return (\n <div>\n <SettingsLabel>Size</SettingsLabel>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 6, marginTop: 4 }}>\n <div style={{ position: \"relative\", flex: 1 }}>\n <button\n onClick={() => setSizeOpen((prev) => !prev)}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: 6,\n width: \"100%\",\n height: 30,\n padding: \"0 8px\",\n borderRadius: 7,\n border: \"1px solid rgba(255,255,255,0.1)\",\n background: \"rgba(255,255,255,0.07)\",\n color: \"rgba(255,255,255,0.88)\",\n cursor: \"pointer\",\n fontSize: 12,\n fontFamily: \"inherit\",\n }}\n >\n {currentPreset ? currentPreset.label : \"Custom\"}\n <ChevronDown size={12} strokeWidth={2} />\n </button>\n\n {sizeOpen && (\n <div\n style={{\n position: \"absolute\",\n bottom: \"calc(100% + 4px)\",\n left: 0,\n right: 0,\n background: \"rgba(32, 32, 36, 0.96)\",\n border: \"1px solid rgba(255, 255, 255, 0.1)\",\n borderRadius: 8,\n padding: \"4px 0\",\n boxShadow: \"0 10px 30px rgba(0, 0, 0, 0.3)\",\n backdropFilter: \"blur(20px)\",\n WebkitBackdropFilter: \"blur(20px)\",\n zIndex: 1,\n }}\n >\n {FRAME_SIZE_PRESETS.map((preset) => (\n <DropItem\n key={preset.label}\n active={!isCustom && preset.w === size.w && preset.h === size.h}\n onClick={() => {\n onChange({ w: preset.w, h: preset.h });\n setSizeOpen(false);\n }}\n >\n {preset.label}\n </DropItem>\n ))}\n <DropItem active={isCustom} onClick={() => setSizeOpen(false)}>\n Custom\n </DropItem>\n </div>\n )}\n </div>\n </div>\n\n {isCustom && (\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 4, marginTop: 6 }}>\n <NumInput\n value={size.w}\n onChange={(v) => {\n const n = parseInt(v, 10);\n if (!Number.isNaN(n) && n > 0) onChange({ ...size, w: n });\n }}\n />\n <StaticText>x</StaticText>\n <NumInput\n value={size.h}\n onChange={(v) => {\n const n = parseInt(v, 10);\n if (!Number.isNaN(n) && n > 0) onChange({ ...size, h: n });\n }}\n />\n </div>\n )}\n </div>\n );\n}\n\nfunction FrameBackgroundControl({\n bgType,\n bgColor,\n bgImage,\n frameSize,\n onChange,\n}: {\n bgType: \"color\" | \"image\";\n bgColor: string;\n bgImage: string | null;\n frameSize: { w: number; h: number };\n onChange: (updates: Partial<Pick<FrameSettings, \"bgType\" | \"bgColor\" | \"bgImage\">>) => void;\n}) {\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n const handleFileSelect = (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (!file) return;\n\n const reader = new FileReader();\n reader.onload = () => {\n const dataUrl = reader.result as string;\n // Downscale if too large for localStorage\n if (dataUrl.length > 2 * 1024 * 1024) {\n downscaleImage(dataUrl, frameSize.w, frameSize.h).then((scaled) => {\n onChange({ bgType: \"image\", bgImage: scaled });\n });\n } else {\n onChange({ bgType: \"image\", bgImage: dataUrl });\n }\n };\n reader.readAsDataURL(file);\n // Reset so same file can be re-selected\n e.target.value = \"\";\n };\n\n return (\n <div>\n <SettingsLabel>Background</SettingsLabel>\n\n <div style={{ display: \"flex\", gap: 2, marginTop: 4 }}>\n <SegmentButton\n active={bgType === \"color\"}\n onClick={() => onChange({ bgType: \"color\" })}\n style={{ borderRadius: \"6px 0 0 6px\" }}\n >\n <Palette size={12} strokeWidth={2} />\n Color\n </SegmentButton>\n <SegmentButton\n active={bgType === \"image\"}\n onClick={() => onChange({ bgType: \"image\" })}\n style={{ borderRadius: \"0 6px 6px 0\" }}\n >\n <ImageIcon size={12} strokeWidth={2} />\n Image\n </SegmentButton>\n </div>\n\n {bgType === \"color\" && (\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 8, marginTop: 6 }}>\n <ColorSwatch color={bgColor} onChange={(c) => onChange({ bgColor: c })} />\n <span style={{ fontSize: 12, color: \"rgba(255,255,255,0.6)\" }}>\n {bgColor}\n </span>\n </div>\n )}\n\n {bgType === \"image\" && (\n <div style={{ marginTop: 6 }}>\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\"image/*\"\n onChange={handleFileSelect}\n style={{ display: \"none\" }}\n />\n\n {bgImage ? (\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 8 }}>\n <img\n src={bgImage}\n alt=\"\"\n style={{\n width: 48,\n height: 28,\n borderRadius: 4,\n objectFit: \"cover\",\n border: \"1px solid rgba(255,255,255,0.12)\",\n }}\n />\n <SmallButton onClick={() => fileInputRef.current?.click()}>\n <Upload size={11} strokeWidth={2} />\n Replace\n </SmallButton>\n <SmallButton onClick={() => onChange({ bgImage: null })}>\n <Trash2 size={11} strokeWidth={2} />\n </SmallButton>\n </div>\n ) : (\n <SmallButton onClick={() => fileInputRef.current?.click()}>\n <Upload size={11} strokeWidth={2} />\n Upload image\n </SmallButton>\n )}\n </div>\n )}\n </div>\n );\n}\n\nfunction SettingsLabel({ children }: { children: React.ReactNode }) {\n return (\n <div\n style={{\n fontSize: 11,\n color: \"rgba(255, 255, 255, 0.42)\",\n letterSpacing: \"0.02em\",\n }}\n >\n {children}\n </div>\n );\n}\n\nfunction SegmentButton({\n children,\n active,\n onClick,\n style,\n}: {\n children: React.ReactNode;\n active: boolean;\n onClick: () => void;\n style?: React.CSSProperties;\n}) {\n return (\n <button\n onClick={onClick}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 4,\n height: 26,\n padding: \"0 10px\",\n border: \"1px solid rgba(255,255,255,0.1)\",\n background: active ? \"rgba(255,255,255,0.14)\" : \"rgba(255,255,255,0.04)\",\n color: active ? \"rgba(255,255,255,0.92)\" : \"rgba(255,255,255,0.5)\",\n cursor: \"pointer\",\n fontSize: 11,\n fontFamily: \"inherit\",\n transition: \"background 0.12s ease, color 0.12s ease\",\n ...style,\n }}\n >\n {children}\n </button>\n );\n}\n\nfunction ColorSwatch({\n color,\n onChange,\n}: {\n color: string;\n onChange: (color: string) => void;\n}) {\n const inputRef = useRef<HTMLInputElement>(null);\n\n return (\n <div style={{ position: \"relative\" }}>\n <button\n onClick={() => inputRef.current?.click()}\n style={{\n width: 24,\n height: 24,\n borderRadius: 6,\n border: \"1px solid rgba(255,255,255,0.18)\",\n background: color,\n cursor: \"pointer\",\n padding: 0,\n }}\n />\n <input\n ref={inputRef}\n type=\"color\"\n value={color}\n onChange={(e) => onChange(e.target.value)}\n style={{\n position: \"absolute\",\n top: 0,\n left: 0,\n width: 0,\n height: 0,\n opacity: 0,\n pointerEvents: \"none\",\n }}\n />\n </div>\n );\n}\n\nfunction SmallButton({\n children,\n onClick,\n}: {\n children: React.ReactNode;\n onClick: () => void;\n}) {\n const [hovered, setHovered] = useState(false);\n\n return (\n <button\n onClick={onClick}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 4,\n padding: \"3px 8px\",\n borderRadius: 6,\n border: \"1px solid rgba(255,255,255,0.12)\",\n background: hovered ? \"rgba(255,255,255,0.12)\" : \"rgba(255,255,255,0.06)\",\n color: \"rgba(255,255,255,0.78)\",\n fontSize: 11,\n cursor: \"pointer\",\n fontFamily: \"inherit\",\n transition: \"background 0.12s ease\",\n }}\n >\n {children}\n </button>\n );\n}\n\nasync function downscaleImage(dataUrl: string, maxW: number, maxH: number): Promise<string> {\n return new Promise((resolve) => {\n const img = new Image();\n img.onload = () => {\n const canvas = document.createElement(\"canvas\");\n const scale = Math.min(maxW / img.width, maxH / img.height, 1);\n canvas.width = img.width * scale;\n canvas.height = img.height * scale;\n const ctx = canvas.getContext(\"2d\")!;\n ctx.drawImage(img, 0, 0, canvas.width, canvas.height);\n resolve(canvas.toDataURL(\"image/jpeg\", 0.85));\n };\n img.onerror = () => resolve(dataUrl);\n img.src = dataUrl;\n });\n}\n\nfunction SaveLocationRow({\n dir,\n picking,\n onPick,\n}: {\n dir: string;\n picking: boolean;\n onPick: () => void;\n}) {\n const [btnHovered, setBtnHovered] = useState(false);\n\n return (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 6 }}>\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n color: \"rgba(255, 255, 255, 0.88)\",\n fontSize: 13,\n }}\n >\n <FolderOpen size={15} strokeWidth={1.8} style={{ flexShrink: 0 }} />\n <span\n style={{\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n flex: 1,\n minWidth: 0,\n }}\n title={dir}\n >\n {dir}\n </span>\n <button\n onClick={onPick}\n disabled={picking}\n onMouseEnter={() => setBtnHovered(true)}\n onMouseLeave={() => setBtnHovered(false)}\n style={{\n padding: \"3px 8px\",\n borderRadius: 6,\n border: \"1px solid rgba(255,255,255,0.12)\",\n background: btnHovered ? \"rgba(255,255,255,0.12)\" : \"rgba(255,255,255,0.06)\",\n color: \"rgba(255,255,255,0.78)\",\n fontSize: 11,\n cursor: picking ? \"wait\" : \"pointer\",\n flexShrink: 0,\n fontFamily: \"inherit\",\n transition: \"background 0.12s ease\",\n }}\n >\n {picking ? \"...\" : \"Change\"}\n </button>\n </div>\n </div>\n );\n}\n\nfunction ToggleRow({\n icon,\n label,\n enabled,\n onChange,\n}: {\n icon: React.ReactNode;\n label: string;\n enabled: boolean;\n onChange: () => void;\n}) {\n return (\n <label\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: 12,\n cursor: \"pointer\",\n }}\n >\n <span\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n color: \"rgba(255, 255, 255, 0.88)\",\n fontSize: 13,\n whiteSpace: \"nowrap\",\n }}\n >\n {icon}\n {label}\n </span>\n\n <button\n type=\"button\"\n onClick={onChange}\n style={{\n width: 38,\n height: 22,\n borderRadius: 999,\n border: \"none\",\n background: enabled ? \"#38bdf8\" : \"rgba(255, 255, 255, 0.18)\",\n position: \"relative\",\n cursor: \"pointer\",\n padding: 0,\n flexShrink: 0,\n transition: \"background 0.12s ease\",\n }}\n >\n <span\n style={{\n position: \"absolute\",\n top: 2,\n left: enabled ? 18 : 2,\n width: 18,\n height: 18,\n borderRadius: \"50%\",\n background: \"#fff\",\n transition: \"left 0.12s ease\",\n }}\n />\n </button>\n </label>\n );\n}\n\nfunction NumInput({\n value,\n onChange,\n}: {\n value: number;\n onChange: (value: string) => void;\n}) {\n const [editing, setEditing] = useState(false);\n const [text, setText] = useState(String(value));\n\n useEffect(() => {\n if (!editing) {\n setText(String(value));\n }\n }, [editing, value]);\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\") {\n (e.target as HTMLElement).blur();\n }\n }}\n style={{\n width: 54,\n padding: \"4px 6px\",\n background: \"rgba(255, 255, 255, 0.07)\",\n border: \"1px solid rgba(255, 255, 255, 0.1)\",\n borderRadius: 7,\n color: \"rgba(255, 255, 255, 0.9)\",\n fontSize: 12,\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n textAlign: \"center\",\n outline: \"none\",\n }}\n />\n );\n}\n\nfunction StaticText({ children }: { children: React.ReactNode }) {\n return (\n <span\n style={{\n fontSize: 11,\n color: \"rgba(255,255,255,0.35)\",\n minWidth: 8,\n textAlign: \"center\",\n }}\n >\n {children}\n </span>\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: \"7px 12px\",\n background: active ? \"rgba(255, 255, 255, 0.08)\" : \"transparent\",\n border: \"none\",\n color: accent\n ? \"rgba(125, 211, 252, 0.96)\"\n : \"rgba(255, 255, 255, 0.86)\",\n textAlign: \"left\",\n cursor: \"pointer\",\n fontSize: 13,\n fontFamily: \"inherit\",\n }}\n >\n {children}\n </button>\n );\n}\n\nfunction Separator({ vertical = true }: { vertical?: boolean }) {\n return (\n <div\n style={{\n width: vertical ? 1 : 24,\n height: vertical ? 18 : 1,\n background: \"rgba(255,255,255,0.12)\",\n flexShrink: 0,\n margin: vertical ? \"0 6px\" : \"6px 0\",\n }}\n />\n );\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 if (isOverlayElement(e.target as Element)) return;\n e.preventDefault();\n e.stopPropagation();\n e.stopImmediatePropagation();\n if (hoveredEl.current) {\n onSelect(hoveredEl.current);\n }\n },\n [onSelect, isOverlayElement],\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 </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 Screenshot 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","useEffect","useCallback","useState","jsx","useEffect","useRef","useState","jsx","jsxs","useState","useEffect","Icon","useRef","useEffect","useRef","useCallback","useState","Fragment","jsx","jsxs","useState","useRef","useEffect","useCallback","jsx","jsxs","jsx","jsxs","useState","useRef","useEffect","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/preview.tsx","../../src/overlay/ui/toolbar.tsx","../../src/overlay/ui/inspector.tsx","../../src/overlay/ui/status.tsx"],"sourcesContent":["\"use client\";\n\nimport React, { useState, useCallback, useRef, useEffect } from \"react\";\nimport { useOverlayState } from \"./state\";\nimport type { CaptureMode } from \"./state\";\nimport { capture, DEFAULT_FRAME_SETTINGS, type FrameSettings } from \"./capture\";\nimport { Icon } from \"./ui/icon\";\nimport { CapturePreview } from \"./ui/preview\";\nimport { Toolbar } from \"./ui/toolbar\";\nimport { Inspector } from \"./ui/inspector\";\nimport { Status } from \"./ui/status\";\n\nasync function saveCapture(mode: CaptureMode, dataUrl: string) {\n try {\n const res = await fetch(\"/__afterbefore/save\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ 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 = \"screenshot.png\";\n link.href = dataUrl;\n link.click();\n }\n}\n\nexport function AfterBefore() {\n const { state, captureComplete, reset } = useOverlayState();\n const [statusOpen, setStatusOpen] = useState(false);\n const [toolbarActive, setToolbarActive] = useState(false);\n const [inspectorActive, setInspectorActive] = useState(false);\n const [loading, setLoading] = useState(false);\n const [selectedMode, setSelectedMode] = useState<CaptureMode>(\"component\");\n const [frameSettings, setFrameSettings] = useState<FrameSettings>(DEFAULT_FRAME_SETTINGS);\n const iconPos = useRef<{ x: number; y: number }>({ x: 24, y: 0 });\n\n useEffect(() => {\n try {\n const stored = localStorage.getItem(\"ab-frame-settings\");\n if (stored) {\n setFrameSettings({ ...DEFAULT_FRAME_SETTINGS, ...JSON.parse(stored) });\n } else if (localStorage.getItem(\"ab-frame-black\") === \"true\") {\n // Migration from old boolean setting\n const migrated = { ...DEFAULT_FRAME_SETTINGS, enabled: true };\n setFrameSettings(migrated);\n localStorage.setItem(\"ab-frame-settings\", JSON.stringify(migrated));\n localStorage.removeItem(\"ab-frame-black\");\n }\n } catch {\n setFrameSettings(DEFAULT_FRAME_SETTINGS);\n }\n }, []);\n\n useEffect(() => {\n if (state.phase === \"ready\") {\n const timer = setTimeout(() => {\n reset();\n setStatusOpen(false);\n }, 1500);\n return () => clearTimeout(timer);\n }\n }, [state.phase, reset]);\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 } else if (toolbarActive || inspectorActive) {\n setToolbarActive(false);\n setInspectorActive(false);\n setStatusOpen(false);\n } else {\n setStatusOpen(false);\n if (selectedMode === \"component\") {\n setToolbarActive(true);\n setInspectorActive(true);\n } else {\n setToolbarActive(true);\n setInspectorActive(false);\n }\n }\n }, [state.phase, loading, toolbarActive, inspectorActive, selectedMode]);\n\n const performCapture = useCallback(\n async (\n mode: CaptureMode,\n element?: HTMLElement,\n ) => {\n setLoading(true);\n try {\n const dataUrl = await capture({ mode, element, frameSettings });\n await saveCapture(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 [captureComplete, frameSettings],\n );\n\n const handleToolbarCapture = useCallback(\n (mode: CaptureMode) => {\n if (mode === \"viewport\") {\n setToolbarActive(false);\n performCapture(\"viewport\");\n } else if (mode === \"fullpage\") {\n setToolbarActive(false);\n performCapture(\"fullpage\");\n } else if (mode === \"component\") {\n setInspectorActive(true);\n }\n },\n [performCapture],\n );\n\n const handleToolbarCancel = useCallback(() => {\n setToolbarActive(false);\n }, []);\n\n const handleComponentSelect = useCallback(\n (element: HTMLElement) => {\n setInspectorActive(false);\n setToolbarActive(false);\n performCapture(\"component\", element);\n },\n [performCapture],\n );\n\n const handleComponentCancel = useCallback(() => {\n setInspectorActive(false);\n setToolbarActive(true);\n }, []);\n\n const handleFrameSettingsChange = useCallback((next: FrameSettings) => {\n setFrameSettings(next);\n try {\n localStorage.setItem(\"ab-frame-settings\", JSON.stringify(next));\n } catch {\n // noop\n }\n }, []);\n\n const handleModeChange = useCallback((mode: CaptureMode) => {\n setSelectedMode(mode);\n if (mode === \"component\") {\n setInspectorActive(true);\n }\n }, []);\n\n const handleReset = useCallback(() => {\n reset();\n setStatusOpen(false);\n }, [reset]);\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 {toolbarActive && !inspectorActive && !loading && (\n <CapturePreview\n mode={selectedMode}\n onClick={() => handleToolbarCapture(selectedMode)}\n />\n )}\n\n {toolbarActive && (\n <Toolbar\n selectedMode={selectedMode}\n onModeChange={handleModeChange}\n onCapture={handleToolbarCapture}\n onCancel={handleToolbarCancel}\n frameSettings={frameSettings}\n onFrameSettingsChange={handleFrameSettingsChange}\n />\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\" | \"component\";\n\nexport type OverlayPhase = \"idle\" | \"ready\";\n\nexport interface CaptureResult {\n dataUrl: string;\n mode: CaptureMode;\n timestamp: number;\n}\n\nexport interface OverlayState {\n phase: OverlayPhase;\n lastCapture: CaptureResult | null;\n}\n\nconst initialState: OverlayState = {\n phase: \"idle\",\n lastCapture: null,\n};\n\nexport function useOverlayState() {\n const [state, setState] = useState<OverlayState>(initialState);\n\n const captureComplete = useCallback(\n (result: CaptureResult) => {\n setState({ phase: \"ready\", lastCapture: result });\n },\n [],\n );\n\n const reset = useCallback(() => {\n setState(initialState);\n }, []);\n\n return { state, captureComplete, reset };\n}\n","import { snapdom } from \"@zumer/snapdom\";\nimport type { CaptureMode } from \"./state\";\n\nexport interface FrameSettings {\n enabled: boolean;\n size: { w: number; h: number };\n bgType: \"color\" | \"image\";\n bgColor: string;\n bgImage: string | null;\n padding: number;\n}\n\nexport const DEFAULT_FRAME_SETTINGS: FrameSettings = {\n enabled: false,\n size: { w: 1920, h: 1080 },\n bgType: \"color\",\n bgColor: \"#000000\",\n bgImage: null,\n padding: 40,\n};\n\nexport const FRAME_SIZE_PRESETS: { label: string; w: number; h: number }[] = [\n { label: \"1920 x 1080\", w: 1920, h: 1080 },\n { label: \"1080 x 1080\", w: 1080, h: 1080 },\n { label: \"1200 x 630\", w: 1200, h: 630 },\n { label: \"1080 x 1920\", w: 1080, h: 1920 },\n];\n\ninterface CaptureOptions {\n mode: CaptureMode;\n element?: HTMLElement;\n frameSettings?: FrameSettings;\n}\n\n/** Selectors for dev tool UI that should be excluded from capture */\nconst DEV_UI_SELECTORS = [\n // Afterbefore overlay\n \"[data-afterbefore]\",\n // Next.js dev indicators\n \"[data-nextjs-toast]\",\n \"[data-nextjs-dev-overlay]\",\n \"[data-nextjs-dialog]\",\n \"[data-nextjs-dialog-backdrop]\",\n \"[data-next-badge]\",\n \"[data-next-mark]\",\n];\n\nconst SNAPDOM_BASE = {\n exclude: DEV_UI_SELECTORS,\n excludeMode: \"remove\" as const,\n};\n\nasync function toPngDataUrl(\n el: Element,\n opts?: Record<string, unknown>,\n): Promise<string> {\n const result = await snapdom(el, { ...SNAPDOM_BASE, ...opts });\n const img = await result.toPng();\n return img.src;\n}\n\nexport async function capture(options: CaptureOptions): Promise<string> {\n const { mode, element } = options;\n\n if (mode === \"viewport\") {\n return captureViewport();\n }\n if (mode === \"fullpage\") {\n return captureFullPage();\n }\n if (mode === \"component\" && element) {\n return captureComponent(element, options.frameSettings);\n }\n throw new Error(`Invalid capture mode: ${mode}`);\n}\n\nasync function captureViewport(): Promise<string> {\n const dpr = window.devicePixelRatio || 1;\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n const scrollY = window.scrollY;\n\n // snapdom renders the full element content, so capture full page and crop to viewport\n const fullDataUrl = await captureFullPage();\n const img = await loadImage(fullDataUrl);\n\n const canvas = document.createElement(\"canvas\");\n canvas.width = vw * dpr;\n canvas.height = vh * dpr;\n\n const ctx = canvas.getContext(\"2d\")!;\n ctx.drawImage(\n img,\n 0,\n scrollY * dpr,\n vw * dpr,\n vh * dpr,\n 0,\n 0,\n vw * dpr,\n vh * dpr,\n );\n\n return canvas.toDataURL(\"image/png\");\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 prevOverflow = html.style.overflow;\n const prevHeight = html.style.height;\n html.style.overflow = \"visible\";\n html.style.height = `${fullHeight}px`;\n\n try {\n return await toPngDataUrl(document.documentElement, {\n width: window.innerWidth,\n height: fullHeight,\n });\n } finally {\n html.style.overflow = prevOverflow;\n html.style.height = prevHeight;\n window.scrollTo(0, scrollY);\n }\n}\n\nasync function captureComponent(\n element: HTMLElement,\n frameSettings?: FrameSettings,\n): Promise<string> {\n const dataUrl = await toPngDataUrl(element);\n\n if (!frameSettings?.enabled) {\n return dataUrl;\n }\n\n const img = await loadImage(dataUrl);\n const dpr = window.devicePixelRatio || 1;\n\n const FRAME_W = frameSettings.size.w;\n const FRAME_H = frameSettings.size.h;\n const padding = frameSettings.padding;\n\n // Component dimensions in CSS pixels\n const compW = img.width / dpr;\n const compH = img.height / dpr;\n\n // Scale down if component exceeds frame (with padding)\n const maxW = FRAME_W - padding * 2;\n const maxH = FRAME_H - padding * 2;\n const scale = Math.min(1, maxW / compW, maxH / compH);\n\n const drawW = compW * scale * dpr;\n const drawH = compH * scale * dpr;\n\n const canvas = document.createElement(\"canvas\");\n canvas.width = FRAME_W * dpr;\n canvas.height = FRAME_H * dpr;\n\n const ctx = canvas.getContext(\"2d\")!;\n\n // Draw background\n if (frameSettings.bgType === \"image\" && frameSettings.bgImage) {\n try {\n const bgImg = await loadImage(frameSettings.bgImage);\n drawCover(ctx, bgImg, canvas.width, canvas.height);\n } catch {\n // Fallback to color if image fails\n ctx.fillStyle = frameSettings.bgColor;\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n }\n } else {\n ctx.fillStyle = frameSettings.bgColor;\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n }\n\n // Center the component\n const dx = (canvas.width - drawW) / 2;\n const dy = (canvas.height - drawH) / 2;\n ctx.drawImage(img, dx, dy, drawW, drawH);\n\n return canvas.toDataURL(\"image/png\");\n}\n\n/** Draw image with cover-fit (like CSS background-size: cover) */\nfunction drawCover(\n ctx: CanvasRenderingContext2D,\n img: HTMLImageElement,\n cw: number,\n ch: number,\n) {\n const scale = Math.max(cw / img.width, ch / img.height);\n const sw = cw / scale;\n const sh = ch / scale;\n const sx = (img.width - sw) / 2;\n const sy = (img.height - sh) / 2;\n ctx.drawImage(img, sx, sy, sw, sh, 0, 0, cw, ch);\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","\"use client\";\n\nimport React, { useRef, useCallback, useEffect, useState } from \"react\";\nimport { Camera, Check, LoaderCircle } from \"lucide-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 CONTAINER_SIZE = 38;\nconst ICON_SIZE = CONTAINER_SIZE;\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: -1, y: -1 });\n const [dragging, setDragging] = useState(false);\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 position on mount (need window dimensions)\n useEffect(() => {\n setPos((prev) => {\n if (prev.x === -1 || prev.y === -1) {\n return {\n x: window.innerWidth - ICON_SIZE - EDGE_MARGIN,\n y: window.innerHeight - ICON_SIZE - EDGE_MARGIN,\n };\n }\n return prev;\n });\n }, []);\n\n // Report position changes upstream\n useEffect(() => {\n if (pos.x !== -1 && 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 setDragging(true);\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 setDragging(false);\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 position is initialized\n if (pos.x === -1 || 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: CONTAINER_SIZE,\n height: CONTAINER_SIZE,\n borderRadius: \"50%\",\n background: \"rgba(32, 32, 36, 0.92)\",\n backdropFilter: \"blur(20px)\",\n WebkitBackdropFilter: \"blur(20px)\",\n border: \"none\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n cursor: dragging ? \"grabbing\" : \"pointer\",\n zIndex: 2147483647,\n boxShadow: \"0 8px 32px rgba(0, 0, 0, 0.4)\",\n transition: \"background 0.15s\",\n userSelect: \"none\",\n }}\n onMouseEnter={(e) => {\n (e.currentTarget as HTMLDivElement).style.background =\n \"rgba(32, 32, 36, 0.98)\";\n }}\n onMouseLeave={(e) => {\n (e.currentTarget as HTMLDivElement).style.background =\n \"rgba(32, 32, 36, 0.92)\";\n }}\n >\n <style\n dangerouslySetInnerHTML={{\n __html: `\n@keyframes ab-spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n}`,\n }}\n />\n\n {loading ? (\n <LoaderCircle\n size={16}\n strokeWidth={2}\n style={{ animation: \"ab-spin 0.8s linear infinite\", color: \"white\" }}\n />\n ) : phase === \"ready\" ? (\n <Check size={16} strokeWidth={2.6} color=\"#4ade80\" />\n ) : (\n <Camera size={16} strokeWidth={1.9} color=\"white\" />\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport React from \"react\";\nimport type { CaptureMode } from \"../state\";\n\ninterface CapturePreviewProps {\n mode: CaptureMode;\n onClick?: () => void;\n}\n\nconst CAMERA_CURSOR = `url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32' viewBox='0 0 32 32'%3E%3Cpath d='M6 12h4l2-3h8l2 3h4a3 3 0 0 1 3 3v9a3 3 0 0 1-3 3H6a3 3 0 0 1-3-3v-9a3 3 0 0 1 3-3z' fill='black' fill-opacity='0.25' transform='translate(0,1)'/%3E%3Cpath d='M6 12h4l2-3h8l2 3h4a3 3 0 0 1 3 3v9a3 3 0 0 1-3 3H6a3 3 0 0 1-3-3v-9a3 3 0 0 1 3-3z' fill='white'/%3E%3Ccircle cx='16' cy='19' r='4.5' fill='none' stroke='%23555' stroke-width='1.5'/%3E%3Ccircle cx='16' cy='19' r='1.5' fill='%23999'/%3E%3C/svg%3E\") 16 16, pointer`;\n\nexport function CapturePreview({ mode, onClick }: CapturePreviewProps) {\n if (mode === \"viewport\" || mode === \"fullpage\") {\n return (\n <div\n data-afterbefore=\"true\"\n onClick={onClick}\n style={{\n position: \"fixed\",\n inset: 0,\n zIndex: 2147483645,\n cursor: CAMERA_CURSOR,\n background: \"rgba(59, 130, 246, 0.15)\",\n }}\n />\n );\n }\n\n return null;\n}\n","\"use client\";\n\nimport React, { useEffect, useRef, useState } from \"react\";\nimport {\n ChevronDown,\n Maximize,\n FolderOpen,\n Frame,\n ImageIcon,\n Monitor,\n MousePointer2,\n Palette,\n Settings,\n Trash2,\n Upload,\n X,\n} from \"lucide-react\";\nimport type { CaptureMode } from \"../state\";\nimport { FRAME_SIZE_PRESETS, type FrameSettings } from \"../capture\";\n\ninterface ToolbarProps {\n selectedMode: CaptureMode;\n onModeChange: (mode: CaptureMode) => void;\n onCapture: (mode: CaptureMode) => void;\n onCancel: () => void;\n frameSettings: FrameSettings;\n onFrameSettingsChange: (settings: FrameSettings) => void;\n}\n\nconst MODES: { mode: CaptureMode; label: string; icon: React.ComponentType<{ size?: number; strokeWidth?: number }> }[] = [\n { mode: \"component\", label: \"Capture Component\", icon: MousePointer2 },\n { mode: \"viewport\", label: \"Capture Viewport\", icon: Monitor },\n { mode: \"fullpage\", label: \"Capture Full Page\", icon: Maximize },\n];\n\nexport function Toolbar({\n selectedMode,\n onModeChange,\n onCapture,\n onCancel,\n frameSettings,\n onFrameSettingsChange,\n}: ToolbarProps) {\n const [settingsOpen, setSettingsOpen] = useState(false);\n\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if ((e.target as HTMLElement)?.tagName === \"INPUT\") {\n if (e.key === \"Escape\") {\n (e.target as HTMLElement).blur();\n }\n return;\n }\n\n if (e.key === \"Escape\") {\n if (settingsOpen) {\n setSettingsOpen(false);\n return;\n }\n onCancel();\n } else if (e.key === \"Enter\") {\n onCapture(selectedMode);\n }\n };\n\n document.addEventListener(\"keydown\", onKey);\n return () => document.removeEventListener(\"keydown\", onKey);\n }, [onCancel, onCapture, selectedMode, settingsOpen]);\n\n return (\n <div\n data-afterbefore=\"true\"\n style={{\n position: \"fixed\",\n bottom: 48,\n left: \"50%\",\n transform: \"translateX(-50%)\",\n zIndex: 2147483647,\n display: \"flex\",\n alignItems: \"center\",\n gap: 10,\n flexWrap: \"wrap\",\n justifyContent: \"center\",\n maxWidth: \"min(calc(100vw - 32px), 1120px)\",\n background: \"rgba(32, 32, 36, 0.92)\",\n backdropFilter: \"blur(20px)\",\n WebkitBackdropFilter: \"blur(20px)\",\n border: \"none\",\n borderRadius: 999,\n padding: 6,\n boxShadow: \"0 8px 32px rgba(0, 0, 0, 0.4)\",\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n }}\n >\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 0 }}>\n <CloseButton onClick={onCancel} />\n\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 2, padding: \"0 4px\" }}>\n {MODES.map(({ mode, label, icon: Icon }) => (\n <ModeButton\n key={mode}\n label={label}\n selected={selectedMode === mode}\n onClick={() => {\n setSettingsOpen(false);\n onModeChange(mode);\n }}\n >\n <Icon size={16} strokeWidth={1.7} />\n </ModeButton>\n ))}\n </div>\n\n <Separator />\n\n <SettingsButton\n open={settingsOpen}\n onClick={() => setSettingsOpen((prev) => !prev)}\n selectedMode={selectedMode}\n frameSettings={frameSettings}\n onFrameSettingsChange={onFrameSettingsChange}\n />\n\n </div>\n </div>\n );\n}\n\nfunction CloseButton({ onClick }: { onClick: () => void }) {\n const [hovered, setHovered] = useState(false);\n\n return (\n <button\n onClick={onClick}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n style={{\n width: 32,\n height: 32,\n borderRadius: \"50%\",\n border: \"none\",\n background: hovered ? \"rgba(255, 255, 255, 0.12)\" : \"transparent\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n cursor: \"pointer\",\n padding: 0,\n color: hovered\n ? \"rgba(255, 255, 255, 0.96)\"\n : \"rgba(255, 255, 255, 0.52)\",\n transition: \"background 0.12s ease, color 0.12s ease\",\n }}\n >\n <X size={16} strokeWidth={1.7} />\n </button>\n );\n}\n\nfunction ModeButton({\n children,\n label,\n selected,\n onClick,\n}: {\n children: React.ReactNode;\n label: string;\n selected: boolean;\n onClick: () => void;\n}) {\n const [hovered, setHovered] = useState(false);\n\n return (\n <div style={{ position: \"relative\" }}>\n {hovered && (\n <div\n style={{\n position: \"absolute\",\n left: \"50%\",\n bottom: \"calc(100% + 10px)\",\n transform: \"translateX(-50%)\",\n background: \"rgba(32, 32, 36, 0.96)\",\n backdropFilter: \"blur(20px)\",\n WebkitBackdropFilter: \"blur(20px)\",\n border: \"1px solid rgba(255, 255, 255, 0.1)\",\n borderRadius: 8,\n padding: \"5px 10px\",\n color: \"rgba(255, 255, 255, 0.88)\",\n fontSize: 12,\n whiteSpace: \"nowrap\",\n boxShadow: \"0 8px 28px rgba(0, 0, 0, 0.28)\",\n pointerEvents: \"none\",\n }}\n >\n {label}\n </div>\n )}\n\n <button\n onClick={onClick}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n style={{\n width: 32,\n height: 32,\n borderRadius: \"50%\",\n border: \"none\",\n background: selected || hovered\n ? \"rgba(255, 255, 255, 0.12)\"\n : \"transparent\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n cursor: \"pointer\",\n padding: 0,\n color: selected || hovered\n ? \"rgba(255, 255, 255, 0.96)\"\n : \"rgba(255, 255, 255, 0.52)\",\n transition: \"background 0.12s ease, color 0.12s ease\",\n }}\n >\n {children}\n </button>\n </div>\n );\n}\n\nfunction SettingsButton({\n open,\n onClick,\n selectedMode,\n frameSettings,\n onFrameSettingsChange,\n}: {\n open: boolean;\n onClick: () => void;\n selectedMode: CaptureMode;\n frameSettings: FrameSettings;\n onFrameSettingsChange: (settings: FrameSettings) => void;\n}) {\n const [hovered, setHovered] = useState(false);\n const [saveDir, setSaveDir] = useState<string | null>(null);\n const [picking, setPicking] = useState(false);\n\n useEffect(() => {\n if (!open) return;\n fetch(\"/__afterbefore/config\")\n .then((r) => r.json())\n .then((data) => setSaveDir(data.saveDir))\n .catch(() => {});\n }, [open]);\n\n const handlePickFolder = async () => {\n setPicking(true);\n try {\n const res = await fetch(\"/__afterbefore/pick-folder\", { method: \"POST\" });\n const data = await res.json();\n if (data.folder) {\n await fetch(\"/__afterbefore/config\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ saveDir: data.folder }),\n });\n setSaveDir(data.folder);\n }\n } catch {\n // noop\n } finally {\n setPicking(false);\n }\n };\n\n const shortDir = saveDir\n ? saveDir.replace(/^\\/Users\\/[^/]+/, \"~\")\n : \"~/Desktop\";\n\n return (\n <div style={{ position: \"relative\" }}>\n <button\n onClick={onClick}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n style={{\n width: 32,\n height: 32,\n borderRadius: \"50%\",\n border: \"none\",\n background: open || hovered ? \"rgba(255, 255, 255, 0.12)\" : \"transparent\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n cursor: \"pointer\",\n padding: 0,\n color: open || hovered\n ? \"rgba(255, 255, 255, 0.96)\"\n : \"rgba(255, 255, 255, 0.52)\",\n transition: \"background 0.12s ease, color 0.12s ease\",\n }}\n >\n <Settings size={16} strokeWidth={1.7} />\n </button>\n\n {open && (\n <div\n style={{\n position: \"absolute\",\n left: \"50%\",\n bottom: \"calc(100% + 12px)\",\n transform: \"translateX(-50%)\",\n minWidth: 260,\n padding: \"10px 12px\",\n borderRadius: 12,\n background: \"rgba(32, 32, 36, 0.96)\",\n border: \"1px solid rgba(255, 255, 255, 0.1)\",\n boxShadow: \"0 14px 36px rgba(0, 0, 0, 0.32)\",\n backdropFilter: \"blur(20px)\",\n WebkitBackdropFilter: \"blur(20px)\",\n }}\n >\n <div\n style={{\n fontSize: 11,\n color: \"rgba(255, 255, 255, 0.46)\",\n letterSpacing: \"0.03em\",\n textTransform: \"uppercase\",\n marginBottom: 10,\n }}\n >\n Settings\n </div>\n\n {selectedMode === \"component\" && (\n <>\n <ToggleRow\n icon={<Frame size={15} strokeWidth={1.8} />}\n label=\"Frame\"\n enabled={frameSettings.enabled}\n onChange={() =>\n onFrameSettingsChange({ ...frameSettings, enabled: !frameSettings.enabled })\n }\n />\n\n {frameSettings.enabled && (\n <div style={{ marginTop: 8, display: \"flex\", flexDirection: \"column\", gap: 10 }}>\n <FrameSizeControl\n size={frameSettings.size}\n onChange={(size) => onFrameSettingsChange({ ...frameSettings, size })}\n />\n <FrameBackgroundControl\n bgType={frameSettings.bgType}\n bgColor={frameSettings.bgColor}\n bgImage={frameSettings.bgImage}\n frameSize={frameSettings.size}\n onChange={(updates) => onFrameSettingsChange({ ...frameSettings, ...updates })}\n />\n </div>\n )}\n </>\n )}\n\n {selectedMode === \"component\" && (\n <div style={{ height: 1, background: \"rgba(255,255,255,0.08)\", margin: \"8px 0\" }} />\n )}\n\n <SaveLocationRow\n dir={shortDir}\n picking={picking}\n onPick={handlePickFolder}\n />\n </div>\n )}\n </div>\n );\n}\n\nfunction FrameSizeControl({\n size,\n onChange,\n}: {\n size: { w: number; h: number };\n onChange: (size: { w: number; h: number }) => void;\n}) {\n const [sizeOpen, setSizeOpen] = useState(false);\n\n const currentPreset = FRAME_SIZE_PRESETS.find((p) => p.w === size.w && p.h === size.h);\n const isCustom = !currentPreset;\n\n return (\n <div>\n <SettingsLabel>Size</SettingsLabel>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 4, marginTop: 4 }}>\n <NumInput\n value={size.w}\n onChange={(v) => {\n const n = parseInt(v, 10);\n if (!Number.isNaN(n) && n > 0) onChange({ ...size, w: n });\n }}\n />\n <StaticText>x</StaticText>\n <NumInput\n value={size.h}\n onChange={(v) => {\n const n = parseInt(v, 10);\n if (!Number.isNaN(n) && n > 0) onChange({ ...size, h: n });\n }}\n />\n </div>\n <div style={{ position: \"relative\", marginTop: 6 }}>\n <button\n onClick={() => setSizeOpen((prev) => !prev)}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: 6,\n width: \"100%\",\n height: 30,\n padding: \"0 8px\",\n borderRadius: 7,\n border: \"1px solid rgba(255,255,255,0.1)\",\n background: \"rgba(255,255,255,0.07)\",\n color: \"rgba(255,255,255,0.88)\",\n cursor: \"pointer\",\n fontSize: 12,\n fontFamily: \"inherit\",\n }}\n >\n {currentPreset ? currentPreset.label : \"Custom\"}\n <ChevronDown size={12} strokeWidth={2} />\n </button>\n\n {sizeOpen && (\n <div\n style={{\n position: \"absolute\",\n bottom: \"calc(100% + 4px)\",\n left: 0,\n right: 0,\n background: \"rgba(32, 32, 36, 0.96)\",\n border: \"1px solid rgba(255, 255, 255, 0.1)\",\n borderRadius: 8,\n padding: \"4px 0\",\n boxShadow: \"0 10px 30px rgba(0, 0, 0, 0.3)\",\n backdropFilter: \"blur(20px)\",\n WebkitBackdropFilter: \"blur(20px)\",\n zIndex: 1,\n }}\n >\n {FRAME_SIZE_PRESETS.map((preset) => (\n <DropItem\n key={preset.label}\n active={!isCustom && preset.w === size.w && preset.h === size.h}\n onClick={() => {\n onChange({ w: preset.w, h: preset.h });\n setSizeOpen(false);\n }}\n >\n {preset.label}\n </DropItem>\n ))}\n </div>\n )}\n </div>\n </div>\n );\n}\n\nfunction FrameBackgroundControl({\n bgType,\n bgColor,\n bgImage,\n frameSize,\n onChange,\n}: {\n bgType: \"color\" | \"image\";\n bgColor: string;\n bgImage: string | null;\n frameSize: { w: number; h: number };\n onChange: (updates: Partial<Pick<FrameSettings, \"bgType\" | \"bgColor\" | \"bgImage\">>) => void;\n}) {\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n const handleFileSelect = (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (!file) return;\n\n const reader = new FileReader();\n reader.onload = () => {\n const dataUrl = reader.result as string;\n // Downscale if too large for localStorage\n if (dataUrl.length > 2 * 1024 * 1024) {\n downscaleImage(dataUrl, frameSize.w, frameSize.h).then((scaled) => {\n onChange({ bgType: \"image\", bgImage: scaled });\n });\n } else {\n onChange({ bgType: \"image\", bgImage: dataUrl });\n }\n };\n reader.readAsDataURL(file);\n // Reset so same file can be re-selected\n e.target.value = \"\";\n };\n\n return (\n <div>\n <SettingsLabel>Background</SettingsLabel>\n\n <div style={{ display: \"flex\", gap: 2, marginTop: 4 }}>\n <SegmentButton\n active={bgType === \"color\"}\n onClick={() => onChange({ bgType: \"color\" })}\n style={{ borderRadius: \"6px 0 0 6px\" }}\n >\n <Palette size={12} strokeWidth={2} />\n Color\n </SegmentButton>\n <SegmentButton\n active={bgType === \"image\"}\n onClick={() => onChange({ bgType: \"image\" })}\n style={{ borderRadius: \"0 6px 6px 0\" }}\n >\n <ImageIcon size={12} strokeWidth={2} />\n Image\n </SegmentButton>\n </div>\n\n {bgType === \"color\" && (\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 8, marginTop: 6 }}>\n <ColorSwatch color={bgColor} onChange={(c) => onChange({ bgColor: c })} />\n <HexInput value={bgColor} onChange={(c) => onChange({ bgColor: c })} />\n </div>\n )}\n\n {bgType === \"image\" && (\n <div style={{ marginTop: 6 }}>\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\"image/*\"\n onChange={handleFileSelect}\n style={{ display: \"none\" }}\n />\n\n {bgImage ? (\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 8 }}>\n <img\n src={bgImage}\n alt=\"\"\n style={{\n width: 48,\n height: 28,\n borderRadius: 4,\n objectFit: \"cover\",\n border: \"1px solid rgba(255,255,255,0.12)\",\n }}\n />\n <SmallButton onClick={() => fileInputRef.current?.click()}>\n <Upload size={11} strokeWidth={2} />\n Replace\n </SmallButton>\n <SmallButton onClick={() => onChange({ bgImage: null })}>\n <Trash2 size={11} strokeWidth={2} />\n </SmallButton>\n </div>\n ) : (\n <SmallButton onClick={() => fileInputRef.current?.click()}>\n <Upload size={11} strokeWidth={2} />\n Upload image\n </SmallButton>\n )}\n </div>\n )}\n </div>\n );\n}\n\nfunction SettingsLabel({ children }: { children: React.ReactNode }) {\n return (\n <div\n style={{\n fontSize: 11,\n color: \"rgba(255, 255, 255, 0.42)\",\n letterSpacing: \"0.02em\",\n }}\n >\n {children}\n </div>\n );\n}\n\nfunction SegmentButton({\n children,\n active,\n onClick,\n style,\n}: {\n children: React.ReactNode;\n active: boolean;\n onClick: () => void;\n style?: React.CSSProperties;\n}) {\n return (\n <button\n onClick={onClick}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 4,\n height: 26,\n padding: \"0 10px\",\n border: \"1px solid rgba(255,255,255,0.1)\",\n background: active ? \"rgba(255,255,255,0.14)\" : \"rgba(255,255,255,0.04)\",\n color: active ? \"rgba(255,255,255,0.92)\" : \"rgba(255,255,255,0.5)\",\n cursor: \"pointer\",\n fontSize: 11,\n fontFamily: \"inherit\",\n transition: \"background 0.12s ease, color 0.12s ease\",\n ...style,\n }}\n >\n {children}\n </button>\n );\n}\n\nfunction ColorSwatch({\n color,\n onChange,\n}: {\n color: string;\n onChange: (color: string) => void;\n}) {\n const inputRef = useRef<HTMLInputElement>(null);\n\n return (\n <div style={{ position: \"relative\" }}>\n <button\n onClick={() => inputRef.current?.click()}\n style={{\n width: 24,\n height: 24,\n borderRadius: 6,\n border: \"1px solid rgba(255,255,255,0.18)\",\n background: color,\n cursor: \"pointer\",\n padding: 0,\n }}\n />\n <input\n ref={inputRef}\n type=\"color\"\n value={color}\n onChange={(e) => onChange(e.target.value)}\n style={{\n position: \"absolute\",\n top: 0,\n left: 0,\n width: 0,\n height: 0,\n opacity: 0,\n pointerEvents: \"none\",\n }}\n />\n </div>\n );\n}\n\nfunction SmallButton({\n children,\n onClick,\n}: {\n children: React.ReactNode;\n onClick: () => void;\n}) {\n const [hovered, setHovered] = useState(false);\n\n return (\n <button\n onClick={onClick}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 4,\n padding: \"3px 8px\",\n borderRadius: 6,\n border: \"1px solid rgba(255,255,255,0.12)\",\n background: hovered ? \"rgba(255,255,255,0.12)\" : \"rgba(255,255,255,0.06)\",\n color: \"rgba(255,255,255,0.78)\",\n fontSize: 11,\n cursor: \"pointer\",\n fontFamily: \"inherit\",\n transition: \"background 0.12s ease\",\n }}\n >\n {children}\n </button>\n );\n}\n\nasync function downscaleImage(dataUrl: string, maxW: number, maxH: number): Promise<string> {\n return new Promise((resolve) => {\n const img = new Image();\n img.onload = () => {\n const canvas = document.createElement(\"canvas\");\n const scale = Math.min(maxW / img.width, maxH / img.height, 1);\n canvas.width = img.width * scale;\n canvas.height = img.height * scale;\n const ctx = canvas.getContext(\"2d\")!;\n ctx.drawImage(img, 0, 0, canvas.width, canvas.height);\n resolve(canvas.toDataURL(\"image/jpeg\", 0.85));\n };\n img.onerror = () => resolve(dataUrl);\n img.src = dataUrl;\n });\n}\n\nfunction SaveLocationRow({\n dir,\n picking,\n onPick,\n}: {\n dir: string;\n picking: boolean;\n onPick: () => void;\n}) {\n const [btnHovered, setBtnHovered] = useState(false);\n\n return (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 6 }}>\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n color: \"rgba(255, 255, 255, 0.88)\",\n fontSize: 13,\n }}\n >\n <FolderOpen size={15} strokeWidth={1.8} style={{ flexShrink: 0 }} />\n <span\n style={{\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n flex: 1,\n minWidth: 0,\n }}\n title={dir}\n >\n {dir}\n </span>\n <button\n onClick={onPick}\n disabled={picking}\n onMouseEnter={() => setBtnHovered(true)}\n onMouseLeave={() => setBtnHovered(false)}\n style={{\n padding: \"3px 8px\",\n borderRadius: 6,\n border: \"1px solid rgba(255,255,255,0.12)\",\n background: btnHovered ? \"rgba(255,255,255,0.12)\" : \"rgba(255,255,255,0.06)\",\n color: \"rgba(255,255,255,0.78)\",\n fontSize: 11,\n cursor: picking ? \"wait\" : \"pointer\",\n flexShrink: 0,\n fontFamily: \"inherit\",\n transition: \"background 0.12s ease\",\n }}\n >\n {picking ? \"...\" : \"Change\"}\n </button>\n </div>\n </div>\n );\n}\n\nfunction ToggleRow({\n icon,\n label,\n enabled,\n onChange,\n}: {\n icon: React.ReactNode;\n label: string;\n enabled: boolean;\n onChange: () => void;\n}) {\n return (\n <label\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: 12,\n cursor: \"pointer\",\n }}\n >\n <span\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n color: \"rgba(255, 255, 255, 0.88)\",\n fontSize: 13,\n whiteSpace: \"nowrap\",\n }}\n >\n {icon}\n {label}\n </span>\n\n <button\n type=\"button\"\n onClick={onChange}\n style={{\n width: 38,\n height: 22,\n borderRadius: 999,\n border: \"none\",\n background: enabled ? \"#38bdf8\" : \"rgba(255, 255, 255, 0.18)\",\n position: \"relative\",\n cursor: \"pointer\",\n padding: 0,\n flexShrink: 0,\n transition: \"background 0.12s ease\",\n }}\n >\n <span\n style={{\n position: \"absolute\",\n top: 2,\n left: enabled ? 18 : 2,\n width: 18,\n height: 18,\n borderRadius: \"50%\",\n background: \"#fff\",\n transition: \"left 0.12s ease\",\n }}\n />\n </button>\n </label>\n );\n}\n\nfunction NumInput({\n value,\n onChange,\n}: {\n value: number;\n onChange: (value: string) => void;\n}) {\n const [editing, setEditing] = useState(false);\n const [text, setText] = useState(String(value));\n\n useEffect(() => {\n if (!editing) {\n setText(String(value));\n }\n }, [editing, value]);\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\") {\n (e.target as HTMLElement).blur();\n }\n }}\n style={{\n width: 54,\n padding: \"4px 6px\",\n background: \"rgba(255, 255, 255, 0.07)\",\n border: \"1px solid rgba(255, 255, 255, 0.1)\",\n borderRadius: 7,\n color: \"rgba(255, 255, 255, 0.9)\",\n fontSize: 12,\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n textAlign: \"center\",\n outline: \"none\",\n }}\n />\n );\n}\n\nfunction HexInput({\n value,\n onChange,\n}: {\n value: string;\n onChange: (color: string) => void;\n}) {\n const [editing, setEditing] = useState(false);\n const [text, setText] = useState(value);\n\n useEffect(() => {\n if (!editing) {\n setText(value);\n }\n }, [editing, value]);\n\n const commit = (raw: string) => {\n const hex = raw.startsWith(\"#\") ? raw : `#${raw}`;\n if (/^#[0-9a-fA-F]{6}$/.test(hex)) {\n onChange(hex);\n }\n };\n\n return (\n <input\n type=\"text\"\n value={editing ? text : value}\n onFocus={() => {\n setEditing(true);\n setText(value);\n }}\n onBlur={() => {\n setEditing(false);\n commit(text);\n }}\n onChange={(e) => setText(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n (e.target as HTMLElement).blur();\n }\n }}\n style={{\n width: 72,\n padding: \"4px 6px\",\n background: \"rgba(255, 255, 255, 0.07)\",\n border: \"1px solid rgba(255, 255, 255, 0.1)\",\n borderRadius: 7,\n color: \"rgba(255, 255, 255, 0.9)\",\n fontSize: 12,\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n textAlign: \"left\",\n outline: \"none\",\n }}\n />\n );\n}\n\nfunction StaticText({ children }: { children: React.ReactNode }) {\n return (\n <span\n style={{\n fontSize: 11,\n color: \"rgba(255,255,255,0.35)\",\n minWidth: 8,\n textAlign: \"center\",\n }}\n >\n {children}\n </span>\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: \"7px 12px\",\n background: active ? \"rgba(255, 255, 255, 0.08)\" : \"transparent\",\n border: \"none\",\n color: accent\n ? \"rgba(125, 211, 252, 0.96)\"\n : \"rgba(255, 255, 255, 0.86)\",\n textAlign: \"left\",\n cursor: \"pointer\",\n fontSize: 13,\n fontFamily: \"inherit\",\n }}\n >\n {children}\n </button>\n );\n}\n\nfunction Separator({ vertical = true }: { vertical?: boolean }) {\n return (\n <div\n style={{\n width: vertical ? 1 : 24,\n height: vertical ? 18 : 1,\n background: \"rgba(255,255,255,0.12)\",\n flexShrink: 0,\n margin: vertical ? \"0 6px\" : \"6px 0\",\n }}\n />\n );\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 if (isOverlayElement(e.target as Element)) return;\n e.preventDefault();\n e.stopPropagation();\n e.stopImmediatePropagation();\n if (hoveredEl.current) {\n onSelect(hoveredEl.current);\n }\n },\n [onSelect, isOverlayElement],\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 </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 Screenshot 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","useEffect","useCallback","useState","jsx","useEffect","useRef","useState","jsx","jsxs","useState","useEffect","Icon","useRef","useEffect","useRef","useCallback","useState","Fragment","jsx","jsxs","useState","useRef","useEffect","useCallback","jsx","jsxs","jsx","jsxs","useState","useRef","useEffect","useCallback"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "afterbefore",
3
- "version": "0.2.13",
3
+ "version": "0.2.14",
4
4
  "description": "Before/after screenshot overlay for Next.js development",
5
5
  "type": "module",
6
6
  "main": "./dist/overlay/index.js",