@alisamadiillc/devtools 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/element-info.ts","../src/components/editor.tsx","../src/utils/styles.ts","../src/components/element-reset-button.tsx","../src/components/inspector.tsx","../src/components/note-popup.tsx","../src/components/toast.tsx","../src/components/toolbar.tsx","../src/components/view-panel.tsx","../src/hooks/use-element-selector.ts","../src/hooks/use-feedback.ts","../src/hooks/use-local-storage.ts","../src/utils/clipboard.ts","../src/devtools.tsx"],"names":["useEffect","jsx","useState","jsxs","useRef","useCallback","Fragment","generateId"],"mappings":"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","file":"index.js","sourcesContent":["import type { ElementMeta } from \"../types\";\n\nexport function isDevToolsElement(el: Element | null): boolean {\n if (!el) return false;\n if (el.hasAttribute(\"data-devtools-ignore\")) return true;\n return isDevToolsElement(el.parentElement);\n}\n\n/**\n * Generate a unique CSS selector using strict nth-child positional path.\n * Every level gets :nth-child(n) to guarantee uniqueness even when\n * multiple elements share the same tag/classes.\n */\nexport function getCssSelector(element: Element): string {\n if (element.id) return `#${element.id}`;\n\n const parts: string[] = [];\n let current: Element | null = element;\n\n while (\n current &&\n current !== document.body &&\n current !== document.documentElement\n ) {\n const tag = current.tagName.toLowerCase();\n\n if (current.id) {\n parts.unshift(`#${current.id}`);\n break;\n }\n\n // Always use nth-child for uniqueness\n const parent = current.parentElement;\n if (parent) {\n const index =\n Array.from(parent.children).indexOf(current) + 1;\n parts.unshift(`${tag}:nth-child(${index})`);\n } else {\n parts.unshift(tag);\n }\n\n current = current.parentElement;\n }\n\n return parts.join(\" > \");\n}\n\nexport function getElementMeta(element: Element): ElementMeta {\n const tag = element.tagName.toLowerCase();\n const classes = Array.from(element.classList);\n const id = element.id || null;\n const isImage = tag === \"img\";\n const imageSrc = isImage ? (element as HTMLImageElement).src : null;\n\n const dataAttributes: Record<string, string> = {};\n for (const attr of Array.from(element.attributes)) {\n if (\n attr.name.startsWith(\"data-\") &&\n !attr.name.startsWith(\"data-devtools\")\n ) {\n dataAttributes[attr.name] = attr.value;\n }\n }\n\n const textContent = (element.textContent || \"\").trim().slice(0, 200);\n\n return {\n selector: getCssSelector(element),\n tag,\n classes,\n id,\n textContent,\n dataAttributes,\n isImage,\n imageSrc,\n };\n}\n\nexport function getElementLabel(element: Element): string {\n const tag = element.tagName.toLowerCase();\n const classes = Array.from(element.classList)\n .filter((c) => !c.startsWith(\"_\") && c.length < 30)\n .slice(0, 2);\n\n if (element.id) return `${tag}#${element.id}`;\n if (classes.length > 0) return `${tag}.${classes.join(\".\")}`;\n return tag;\n}\n","import { useCallback, useEffect, useRef } from \"react\";\n\nimport type { Change } from \"../types\";\nimport { getCssSelector, getElementLabel } from \"../utils/element-info\";\n\nfunction generateId(): string {\n if (typeof crypto !== \"undefined\" && crypto.randomUUID) {\n return crypto.randomUUID();\n }\n return Date.now().toString(36) + Math.random().toString(36).slice(2);\n}\n\ninterface EditorProps {\n element: Element;\n onTrackOriginal: (\n element: Element,\n type: \"text\" | \"image\",\n value: string\n ) => void;\n onAddChange: (change: Change) => void;\n}\n\nexport function Editor({ element, onTrackOriginal, onAddChange }: EditorProps) {\n const fileInputRef = useRef<HTMLInputElement | null>(null);\n const changeIdRef = useRef(generateId());\n\n const isImage = element.tagName.toLowerCase() === \"img\";\n const htmlEl = element as HTMLElement;\n\n const setupTextEditing = useCallback(() => {\n if (isImage) return;\n\n const originalText = htmlEl.textContent || \"\";\n onTrackOriginal(element, \"text\", originalText);\n\n htmlEl.contentEditable = \"true\";\n htmlEl.style.outline = \"2px solid rgba(59, 130, 246, 0.5)\";\n htmlEl.style.outlineOffset = \"2px\";\n htmlEl.style.cursor = \"text\";\n\n htmlEl.focus();\n\n const handleInput = () => {\n const newText = htmlEl.textContent || \"\";\n if (newText !== originalText) {\n onAddChange({\n id: changeIdRef.current,\n selector: getCssSelector(element),\n element: getElementLabel(element),\n type: \"text\",\n original: originalText,\n modified: newText,\n note: \"\",\n });\n }\n };\n\n htmlEl.addEventListener(\"input\", handleInput);\n return () => {\n htmlEl.removeEventListener(\"input\", handleInput);\n };\n }, [element, htmlEl, isImage, onTrackOriginal, onAddChange]);\n\n const setupImageEditing = useCallback(() => {\n if (!isImage) return;\n\n const imgEl = element as HTMLImageElement;\n const originalSrc = imgEl.src;\n onTrackOriginal(element, \"image\", originalSrc);\n\n const input = document.createElement(\"input\");\n input.type = \"file\";\n input.accept = \"image/*\";\n input.style.display = \"none\";\n document.body.appendChild(input);\n fileInputRef.current = input;\n\n const wrapper = document.createElement(\"div\");\n wrapper.setAttribute(\"data-devtools-ignore\", \"\");\n wrapper.style.cssText = `\n position: absolute;\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgba(0,0,0,0.5);\n backdrop-filter: blur(4px);\n border-radius: 4px;\n cursor: pointer;\n z-index: 99998;\n `;\n\n const updatePosition = () => {\n const rect = imgEl.getBoundingClientRect();\n wrapper.style.top = `${rect.top + window.scrollY}px`;\n wrapper.style.left = `${rect.left + window.scrollX}px`;\n wrapper.style.width = `${rect.width}px`;\n wrapper.style.height = `${rect.height}px`;\n };\n updatePosition();\n\n const btn = document.createElement(\"button\");\n btn.textContent = \"Replace Image\";\n btn.setAttribute(\"data-devtools-ignore\", \"\");\n btn.style.cssText = `\n padding: 8px 16px;\n border-radius: 8px;\n border: 1px solid rgba(255,255,255,0.2);\n background: rgba(255,255,255,0.1);\n color: #fff;\n font-size: 13px;\n cursor: pointer;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;\n `;\n wrapper.appendChild(btn);\n document.body.appendChild(wrapper);\n\n btn.addEventListener(\"click\", () => input.click());\n\n input.addEventListener(\"change\", () => {\n const file = input.files?.[0];\n if (!file) return;\n\n const reader = new FileReader();\n reader.onload = (e) => {\n const dataUrl = e.target?.result as string;\n imgEl.src = dataUrl;\n onAddChange({\n id: changeIdRef.current,\n selector: getCssSelector(element),\n element: getElementLabel(element),\n type: \"image\",\n original: originalSrc,\n modified: `[replaced with ${file.name}]`,\n note: \"\",\n });\n wrapper.remove();\n };\n reader.readAsDataURL(file);\n });\n\n return () => {\n wrapper.remove();\n input.remove();\n };\n }, [element, isImage, onTrackOriginal, onAddChange]);\n\n useEffect(() => {\n const cleanupText = setupTextEditing();\n const cleanupImage = setupImageEditing();\n\n return () => {\n cleanupText?.();\n cleanupImage?.();\n };\n }, [setupTextEditing, setupImageEditing]);\n\n return null;\n}\n","import type { CSSProperties } from \"react\";\n\nexport const FONT_FAMILY =\n '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", sans-serif';\n\n// Using shadcn CSS variables for automatic dark/light theme support.\n// These resolve from the host app's globals.css (:root / .dark).\nconst v = {\n bg: \"var(--card)\",\n fg: \"var(--card-foreground)\",\n muted: \"var(--muted)\",\n mutedFg: \"var(--muted-foreground)\",\n border: \"var(--border)\",\n primary: \"var(--primary)\",\n primaryFg: \"var(--primary-foreground)\",\n accent: \"var(--accent)\",\n accentFg: \"var(--accent-foreground)\",\n};\n\nexport const styles = {\n toolbar: {\n position: \"fixed\",\n bottom: 16,\n right: 16,\n display: \"flex\",\n alignItems: \"center\",\n gap: 2,\n padding: 4,\n borderRadius: 12,\n background: v.bg,\n border: `1px solid ${v.border}`,\n color: v.fg,\n fontSize: 13,\n fontFamily: FONT_FAMILY,\n boxShadow: \"0 8px 32px rgba(0, 0, 0, 0.12), 0 0 0 1px rgba(0,0,0,0.04)\",\n lineHeight: 1,\n } satisfies CSSProperties,\n\n toolbarButton: {\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n padding: \"8px 12px\",\n borderRadius: 8,\n border: \"none\",\n background: \"transparent\",\n color: v.mutedFg,\n fontSize: 12,\n fontFamily: FONT_FAMILY,\n cursor: \"pointer\",\n transition: \"all 150ms ease\",\n whiteSpace: \"nowrap\",\n lineHeight: 1,\n } satisfies CSSProperties,\n\n toolbarButtonActive: {\n background: v.accent,\n color: v.accentFg,\n } satisfies CSSProperties,\n\n toolbarButtonHover: {\n background: v.accent,\n color: v.accentFg,\n },\n\n toolbarDivider: {\n width: 1,\n height: 20,\n background: v.border,\n margin: \"0 2px\",\n } satisfies CSSProperties,\n\n badge: {\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n minWidth: 18,\n height: 18,\n padding: \"0 5px\",\n borderRadius: 999,\n background: v.primary,\n color: v.primaryFg,\n fontSize: 10,\n fontWeight: 600,\n lineHeight: 1,\n } satisfies CSSProperties,\n\n highlightRect: {\n position: \"fixed\",\n pointerEvents: \"none\",\n border: \"2px solid rgba(59, 130, 246, 0.6)\",\n background: \"rgba(59, 130, 246, 0.08)\",\n borderRadius: 4,\n transition: \"all 60ms ease-out\",\n } satisfies CSSProperties,\n\n elementLabel: {\n position: \"fixed\",\n pointerEvents: \"none\",\n padding: \"4px 8px\",\n borderRadius: 6,\n background: v.bg,\n border: `1px solid ${v.border}`,\n color: v.primary,\n fontSize: 11,\n fontFamily: FONT_FAMILY,\n fontWeight: 500,\n whiteSpace: \"nowrap\",\n lineHeight: 1,\n boxShadow: \"0 2px 8px rgba(0,0,0,0.08)\",\n } satisfies CSSProperties,\n\n toast: {\n position: \"fixed\",\n bottom: 72,\n right: 16,\n padding: \"10px 16px\",\n borderRadius: 10,\n background: v.bg,\n border: `1px solid ${v.border}`,\n color: v.fg,\n fontSize: 13,\n fontFamily: FONT_FAMILY,\n boxShadow: \"0 4px 20px rgba(0, 0, 0, 0.1)\",\n transition: \"all 300ms ease\",\n lineHeight: 1.4,\n } satisfies CSSProperties,\n\n primaryButton: {\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n padding: \"8px 16px\",\n borderRadius: 8,\n border: \"none\",\n background: v.primary,\n color: v.primaryFg,\n fontSize: 13,\n fontFamily: FONT_FAMILY,\n fontWeight: 500,\n cursor: \"pointer\",\n transition: \"all 150ms ease\",\n lineHeight: 1,\n } satisfies CSSProperties,\n\n secondaryButton: {\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n padding: \"8px 16px\",\n borderRadius: 8,\n border: `1px solid ${v.border}`,\n background: v.muted,\n color: v.mutedFg,\n fontSize: 13,\n fontFamily: FONT_FAMILY,\n fontWeight: 500,\n cursor: \"pointer\",\n transition: \"all 150ms ease\",\n lineHeight: 1,\n } satisfies CSSProperties,\n\n viewPanel: {\n position: \"fixed\",\n bottom: 64,\n right: 16,\n width: 320,\n maxHeight: 400,\n overflowY: \"auto\",\n padding: 12,\n borderRadius: 12,\n background: v.bg,\n border: `1px solid ${v.border}`,\n boxShadow: \"0 8px 32px rgba(0, 0, 0, 0.12)\",\n fontFamily: FONT_FAMILY,\n color: v.fg,\n animation: \"devtools-slide-up 200ms ease forwards\",\n } satisfies CSSProperties,\n\n viewPanelItem: {\n display: \"flex\",\n flexDirection: \"column\",\n gap: 4,\n padding: \"8px 10px\",\n borderRadius: 8,\n background: \"transparent\",\n marginBottom: 4,\n cursor: \"default\",\n transition: \"background 150ms ease\",\n } satisfies CSSProperties,\n\n viewPanelItemHover: {\n background: v.accent,\n } satisfies CSSProperties,\n\n notePopup: {\n position: \"fixed\",\n width: 280,\n padding: 12,\n borderRadius: 10,\n background: v.bg,\n border: `1px solid ${v.border}`,\n boxShadow: \"0 8px 32px rgba(0, 0, 0, 0.12)\",\n fontFamily: FONT_FAMILY,\n color: v.fg,\n animation: \"devtools-fade-in 150ms ease forwards\",\n } satisfies CSSProperties,\n\n noteTextarea: {\n width: \"100%\",\n height: 60,\n padding: 8,\n borderRadius: 6,\n border: `1px solid ${v.border}`,\n background: v.muted,\n color: v.fg,\n fontSize: 12,\n fontFamily: FONT_FAMILY,\n resize: \"vertical\",\n outline: \"none\",\n boxSizing: \"border-box\",\n } satisfies CSSProperties,\n\n resetButton: {\n position: \"fixed\",\n width: 22,\n height: 22,\n borderRadius: \"50%\",\n border: `1px solid ${v.border}`,\n background: \"rgba(239, 68, 68, 0.9)\",\n color: \"#fff\",\n fontSize: 12,\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n lineHeight: 1,\n padding: 0,\n boxShadow: \"0 2px 8px rgba(0, 0, 0, 0.15)\",\n transition: \"all 150ms ease\",\n } satisfies CSSProperties,\n} as const;\n\nexport const KEYFRAMES = `\n@keyframes devtools-fade-in {\n from { opacity: 0; transform: translateY(8px) scale(0.96); }\n to { opacity: 1; transform: translateY(0) scale(1); }\n}\n@keyframes devtools-fade-out {\n from { opacity: 1; transform: translateY(0) scale(1); }\n to { opacity: 0; transform: translateY(8px) scale(0.96); }\n}\n@keyframes devtools-pulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.5; }\n}\n@keyframes devtools-slide-up {\n from { opacity: 0; transform: translateY(16px); }\n to { opacity: 1; transform: translateY(0); }\n}\n@keyframes devtools-shake {\n 0%, 100% { transform: translateX(0); }\n 10%, 50%, 90% { transform: translateX(-4px); }\n 30%, 70% { transform: translateX(4px); }\n}\n`;\n","import React, { useEffect, useState } from \"react\";\n\nimport { styles } from \"../utils/styles\";\n\ninterface ElementResetButtonProps {\n element: Element;\n onReset: () => void;\n zIndex: number;\n}\n\nexport function ElementResetButton({\n element,\n onReset,\n zIndex,\n}: ElementResetButtonProps) {\n const [pos, setPos] = useState<{ top: number; left: number } | null>(null);\n\n useEffect(() => {\n const update = () => {\n const rect = element.getBoundingClientRect();\n setPos({\n top: rect.top - 10,\n left: rect.right - 10,\n });\n };\n update();\n window.addEventListener(\"scroll\", update, true);\n window.addEventListener(\"resize\", update);\n return () => {\n window.removeEventListener(\"scroll\", update, true);\n window.removeEventListener(\"resize\", update);\n };\n }, [element]);\n\n if (!pos) return null;\n\n return (\n <button\n data-devtools-ignore\n onClick={(e) => {\n e.stopPropagation();\n onReset();\n }}\n style={{\n ...styles.resetButton,\n top: pos.top,\n left: pos.left,\n zIndex: zIndex + 1,\n }}\n onMouseEnter={(e) => {\n (e.currentTarget as HTMLElement).style.background =\n \"rgba(239, 68, 68, 1)\";\n (e.currentTarget as HTMLElement).style.transform = \"scale(1.1)\";\n }}\n onMouseLeave={(e) => {\n (e.currentTarget as HTMLElement).style.background =\n \"rgba(239, 68, 68, 0.9)\";\n (e.currentTarget as HTMLElement).style.transform = \"scale(1)\";\n }}\n title=\"Reset this element\"\n >\n ×\n </button>\n );\n}\n","import React from \"react\";\n\nimport type { ElementRect } from \"../types\";\nimport { styles } from \"../utils/styles\";\n\ninterface InspectorProps {\n rect: ElementRect | null;\n label: string;\n zIndex: number;\n}\n\nexport function Inspector({ rect, label, zIndex }: InspectorProps) {\n if (!rect) return null;\n\n const labelTop = rect.top - 28;\n const showLabelAbove = labelTop > 8;\n\n return (\n <>\n {/* Highlight rectangle */}\n <div\n data-devtools-ignore\n style={{\n ...styles.highlightRect,\n zIndex: zIndex - 1,\n top: rect.top,\n left: rect.left,\n width: rect.width,\n height: rect.height,\n }}\n />\n\n {/* Element label */}\n {label && (\n <div\n data-devtools-ignore\n style={{\n ...styles.elementLabel,\n zIndex: zIndex - 1,\n left: rect.left,\n top: showLabelAbove ? labelTop : rect.top + rect.height + 4,\n }}\n >\n {label}\n </div>\n )}\n </>\n );\n}\n","import React, { useEffect, useState } from \"react\";\n\nimport { styles } from \"../utils/styles\";\n\ninterface NotePopupProps {\n element: Element;\n initialNote: string;\n onSave: (note: string) => void;\n onClose: () => void;\n zIndex: number;\n}\n\nexport function NotePopup({\n element,\n initialNote,\n onSave,\n onClose,\n zIndex,\n}: NotePopupProps) {\n const [note, setNote] = useState(initialNote);\n const [position, setPosition] = useState<{ top: number; left: number }>({\n top: 0,\n left: 0,\n });\n\n useEffect(() => {\n const rect = element.getBoundingClientRect();\n const spaceBelow = window.innerHeight - rect.bottom;\n const popupHeight = 160;\n\n const top =\n spaceBelow > popupHeight + 8\n ? rect.bottom + 8\n : rect.top - popupHeight - 8;\n\n setPosition({\n top: Math.max(8, Math.min(top, window.innerHeight - popupHeight - 8)),\n left: Math.max(8, Math.min(rect.left, window.innerWidth - 296)),\n });\n }, [element]);\n\n return (\n <div\n data-devtools-ignore\n style={{\n ...styles.notePopup,\n top: position.top,\n left: position.left,\n zIndex: zIndex + 1,\n }}\n >\n <div style={{ fontSize: 12, color: \"var(--muted-foreground)\", marginBottom: 8 }}>\n Describe the change you want:\n </div>\n <textarea\n data-devtools-ignore\n value={note}\n onChange={(e) => setNote(e.target.value)}\n placeholder=\"e.g., Make this text larger, change the color...\"\n autoFocus\n style={styles.noteTextarea as React.CSSProperties}\n onKeyDown={(e) => {\n e.stopPropagation();\n if (e.key === \"Enter\" && (e.metaKey || e.ctrlKey)) {\n onSave(note);\n }\n if (e.key === \"Escape\") {\n onClose();\n }\n }}\n />\n <div\n style={{\n display: \"flex\",\n gap: 6,\n justifyContent: \"flex-end\",\n marginTop: 8,\n }}\n >\n <button\n data-devtools-ignore\n onClick={onClose}\n style={styles.secondaryButton}\n >\n Skip\n </button>\n <button\n data-devtools-ignore\n onClick={() => onSave(note)}\n style={styles.primaryButton}\n >\n Save\n </button>\n </div>\n <div\n style={{\n fontSize: 10,\n color: \"var(--muted-foreground)\",\n marginTop: 6,\n textAlign: \"right\",\n }}\n >\n ⌘+Enter to save\n </div>\n </div>\n );\n}\n","import React, { useEffect, useState } from \"react\";\n\nimport { styles } from \"../utils/styles\";\n\nexport type ToastVariant = \"success\" | \"warning\";\n\ninterface ToastProps {\n message: string;\n variant?: ToastVariant;\n duration?: number;\n linkUrl?: string;\n linkText?: string;\n onDone: () => void;\n zIndex: number;\n position: \"bottom-right\" | \"bottom-left\";\n}\n\nconst warningStyle = {\n background: \"rgba(251, 146, 60, 0.15)\",\n border: \"1px solid rgba(251, 146, 60, 0.4)\",\n color: \"#c2410c\",\n};\n\nexport function Toast({\n message,\n variant = \"success\",\n duration = 3000,\n linkUrl,\n linkText,\n onDone,\n zIndex,\n position,\n}: ToastProps) {\n const [visible, setVisible] = useState(true);\n\n useEffect(() => {\n const timer = setTimeout(() => {\n setVisible(false);\n setTimeout(onDone, 300);\n }, duration);\n return () => clearTimeout(timer);\n }, [duration, onDone]);\n\n const positionStyle =\n position === \"bottom-left\"\n ? { left: 16, right: \"auto\" }\n : { right: 16, left: \"auto\" };\n\n const isWarning = variant === \"warning\";\n\n return (\n <div\n data-devtools-ignore\n style={{\n ...styles.toast,\n ...positionStyle,\n ...(isWarning ? warningStyle : {}),\n zIndex: zIndex + 1,\n opacity: visible ? 1 : 0,\n transform: visible ? \"translateY(0)\" : \"translateY(16px)\",\n animation: isWarning\n ? \"devtools-shake 0.5s ease\"\n : \"devtools-fade-in 200ms ease forwards\",\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n flexWrap: \"wrap\",\n }}\n >\n <span>{isWarning ? \"⚠\" : \"✓\"}</span>\n <span>{message}</span>\n {linkUrl && (\n <a\n href={linkUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n data-devtools-ignore\n style={{\n color: \"inherit\",\n textDecoration: \"underline\",\n textUnderlineOffset: 2,\n fontWeight: 500,\n cursor: \"pointer\",\n }}\n >\n {linkText || \"Submit here →\"}\n </a>\n )}\n </div>\n );\n}\n","import React, { useCallback, useEffect, useRef, useState } from \"react\";\n\nimport type { DevToolsState } from \"../types\";\nimport { styles } from \"../utils/styles\";\n\ninterface ToolbarProps {\n state: DevToolsState;\n changesCount: number;\n onSelectElement: () => void;\n onCopyFeedback: () => void;\n onView: () => void;\n onReset: () => void;\n onHide: () => void;\n onBack: () => void;\n isViewing: boolean;\n requestUrl: string;\n zIndex: number;\n position: \"bottom-right\" | \"bottom-left\";\n}\n\nfunction ToolbarIcon({ d, size = 14 }: { d: string; size?: number }) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d={d} />\n </svg>\n );\n}\n\nfunction hoverIn(e: React.MouseEvent, overrides?: Record<string, string>) {\n Object.assign(e.currentTarget.style, {\n background: \"var(--accent)\",\n color: \"var(--accent-foreground)\",\n ...overrides,\n });\n}\n\nfunction hoverOut(e: React.MouseEvent, overrides?: Record<string, string>) {\n Object.assign(e.currentTarget.style, {\n background: \"transparent\",\n color: \"var(--muted-foreground)\",\n ...overrides,\n });\n}\n\nfunction ResetButton({ onReset }: { onReset: () => void }) {\n const [confirming, setConfirming] = useState(false);\n const timerRef = useRef<ReturnType<typeof setTimeout>>();\n\n const handleClick = useCallback(() => {\n if (confirming) {\n clearTimeout(timerRef.current);\n setConfirming(false);\n onReset();\n } else {\n setConfirming(true);\n timerRef.current = setTimeout(() => setConfirming(false), 3000);\n }\n }, [confirming, onReset]);\n\n useEffect(() => {\n return () => clearTimeout(timerRef.current);\n }, []);\n\n return (\n <>\n <div style={styles.toolbarDivider} />\n <button\n onClick={handleClick}\n style={{\n ...styles.toolbarButton,\n ...(confirming\n ? { background: \"rgba(239, 68, 68, 0.15)\", color: \"#f87171\" }\n : {}),\n }}\n onMouseEnter={(e) => {\n if (!confirming) hoverIn(e, {\n background: \"rgba(239, 68, 68, 0.1)\",\n color: \"#f87171\",\n });\n }}\n onMouseLeave={(e) => {\n if (!confirming) hoverOut(e);\n }}\n title={confirming ? \"Click again to confirm reset\" : \"Reset all changes\"}\n >\n <ToolbarIcon d=\"M1 4v6h6M23 20v-6h-6M20.49 9A9 9 0 005.64 5.64L1 10m22 4l-4.64 4.36A9 9 0 013.51 15\" />\n {confirming && (\n <span style={{ fontSize: 11 }}>Confirm?</span>\n )}\n </button>\n </>\n );\n}\n\nfunction HideButton({ onHide }: { onHide: () => void }) {\n const [confirming, setConfirming] = useState(false);\n const timerRef = useRef<ReturnType<typeof setTimeout>>();\n\n const handleClick = useCallback(() => {\n if (confirming) {\n clearTimeout(timerRef.current);\n setConfirming(false);\n onHide();\n } else {\n setConfirming(true);\n timerRef.current = setTimeout(() => setConfirming(false), 3000);\n }\n }, [confirming, onHide]);\n\n useEffect(() => {\n return () => clearTimeout(timerRef.current);\n }, []);\n\n return (\n <button\n onClick={handleClick}\n style={{\n ...styles.toolbarButton,\n ...(confirming\n ? { background: \"rgba(239, 68, 68, 0.15)\", color: \"#f87171\" }\n : {}),\n }}\n onMouseEnter={(e) => {\n if (!confirming) hoverIn(e);\n }}\n onMouseLeave={(e) => {\n if (!confirming) hoverOut(e);\n }}\n title={confirming ? \"Click again to confirm\" : \"Hide devtools\"}\n >\n <ToolbarIcon d=\"M18 6L6 18M6 6l12 12\" />\n {confirming && <span style={{ fontSize: 11 }}>Confirm?</span>}\n </button>\n );\n}\n\nexport function Toolbar({\n state,\n changesCount,\n onSelectElement,\n onCopyFeedback,\n onView,\n onReset,\n onHide,\n onBack,\n isViewing,\n requestUrl,\n zIndex,\n position,\n}: ToolbarProps) {\n const positionStyle =\n position === \"bottom-left\"\n ? { left: 16, right: \"auto\" }\n : { right: 16, left: \"auto\" };\n\n const isInspecting = state === \"inspecting\";\n\n return (\n <div\n data-devtools-ignore\n style={{\n ...styles.toolbar,\n ...positionStyle,\n zIndex,\n animation: \"devtools-fade-in 200ms ease forwards\",\n }}\n >\n {/* Back button */}\n {state === \"editing\" && (\n <button\n onClick={onBack}\n style={styles.toolbarButton}\n onMouseEnter={(e) => hoverIn(e)}\n onMouseLeave={(e) => hoverOut(e)}\n title=\"Back\"\n >\n <ToolbarIcon d=\"M19 12H5M12 19l-7-7 7-7\" />\n </button>\n )}\n\n {/* Select Element */}\n <button\n onClick={onSelectElement}\n style={{\n ...styles.toolbarButton,\n ...(isInspecting ? styles.toolbarButtonActive : {}),\n }}\n onMouseEnter={(e) => {\n if (!isInspecting) hoverIn(e);\n }}\n onMouseLeave={(e) => {\n if (!isInspecting) hoverOut(e);\n }}\n title=\"Select an element to edit\"\n >\n <ToolbarIcon\n d=\"M3 3h7v7H3zM14 3h7v7h-7zM14 14h7v7h-7zM3 14h7v7H3z\"\n size={14}\n />\n Select\n </button>\n\n <div style={styles.toolbarDivider} />\n\n {/* View */}\n <button\n onClick={onView}\n style={{\n ...styles.toolbarButton,\n ...(isViewing ? styles.toolbarButtonActive : {}),\n }}\n onMouseEnter={(e) => {\n if (!isViewing) hoverIn(e);\n }}\n onMouseLeave={(e) => {\n if (!isViewing) hoverOut(e);\n }}\n title=\"View all feedback\"\n >\n <ToolbarIcon d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8zM12 9a3 3 0 100 6 3 3 0 000-6z\" />\n View\n {changesCount > 0 && <span style={styles.badge}>{changesCount}</span>}\n </button>\n\n <div style={styles.toolbarDivider} />\n\n {/* Copy Feedback */}\n <button\n onClick={onCopyFeedback}\n style={{\n ...styles.toolbarButton,\n ...(changesCount > 0\n ? { color: \"var(--card-foreground)\" }\n : { opacity: 0.5, cursor: \"default\" }),\n }}\n disabled={changesCount === 0}\n onMouseEnter={(e) => {\n if (changesCount > 0) hoverIn(e);\n }}\n onMouseLeave={(e) => {\n if (changesCount > 0)\n hoverOut(e, { color: \"var(--card-foreground)\" });\n }}\n title=\"Copy feedback to clipboard\"\n >\n <ToolbarIcon d=\"M16 4h2a2 2 0 012 2v14a2 2 0 01-2 2H6a2 2 0 01-2-2V6a2 2 0 012-2h2M9 2h6a1 1 0 011 1v1a1 1 0 01-1 1H9a1 1 0 01-1-1V3a1 1 0 011-1z\" />\n Copy\n </button>\n\n <div style={styles.toolbarDivider} />\n\n {/* Submit Request */}\n <a\n href={requestUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n data-devtools-ignore\n style={{\n ...styles.toolbarButton,\n textDecoration: \"none\",\n color: \"var(--card-foreground)\",\n }}\n onMouseEnter={(e) => hoverIn(e)}\n onMouseLeave={(e) =>\n hoverOut(e, { color: \"var(--card-foreground)\" })\n }\n title=\"Submit feedback request\"\n >\n <ToolbarIcon d=\"M22 2L11 13M22 2l-7 20-4-9-9-4 20-7z\" />\n Submit\n </a>\n\n {/* Reset with confirmation */}\n {changesCount > 0 && (\n <ResetButton onReset={onReset} />\n )}\n\n <div style={styles.toolbarDivider} />\n\n {/* Hide with confirmation */}\n <HideButton onHide={onHide} />\n </div>\n );\n}\n","import React, { useState } from \"react\";\n\nimport type { Change } from \"../types\";\nimport { styles } from \"../utils/styles\";\n\ninterface ViewPanelProps {\n changes: Change[];\n onDelete: (changeId: string) => void;\n onHover: (change: Change | null) => void;\n zIndex: number;\n position: \"bottom-right\" | \"bottom-left\";\n}\n\nexport function ViewPanel({\n changes,\n onDelete,\n onHover,\n zIndex,\n position,\n}: ViewPanelProps) {\n const [hoveredId, setHoveredId] = useState<string | null>(null);\n\n const positionStyle =\n position === \"bottom-left\"\n ? { left: 16, right: \"auto\" }\n : { right: 16, left: \"auto\" };\n\n return (\n <div\n data-devtools-ignore\n style={{\n ...styles.viewPanel,\n ...positionStyle,\n zIndex,\n }}\n >\n <div\n style={{\n fontSize: 13,\n fontWeight: 600,\n color: \"#e5e5e5\",\n marginBottom: 8,\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n }}\n >\n <span style={{ color: \"var(--card-foreground)\" }}>\n Feedback ({changes.length})\n </span>\n </div>\n\n {changes.length === 0 && (\n <div\n style={{\n fontSize: 12,\n color: \"var(--muted-foreground)\",\n padding: \"24px 0\",\n textAlign: \"center\",\n }}\n >\n No changes recorded yet.\n <br />\n <span style={{ fontSize: 11, color: \"var(--muted-foreground)\" }}>\n Click any element to start.\n </span>\n </div>\n )}\n\n {changes.map((change) => (\n <div\n key={change.id}\n data-devtools-ignore\n onMouseEnter={() => {\n setHoveredId(change.id);\n onHover(change);\n }}\n onMouseLeave={() => {\n setHoveredId(null);\n onHover(null);\n }}\n style={{\n ...(styles.viewPanelItem as React.CSSProperties),\n ...(hoveredId === change.id ? styles.viewPanelItemHover : {}),\n }}\n >\n <div\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n }}\n >\n <span\n style={{\n color: \"var(--primary)\",\n fontSize: 11,\n fontFamily: \"monospace\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n maxWidth: 240,\n }}\n >\n {change.element}\n </span>\n <button\n data-devtools-ignore\n onClick={(e) => {\n e.stopPropagation();\n onDelete(change.id);\n }}\n style={{\n background: \"none\",\n border: \"none\",\n color: \"var(--muted-foreground)\",\n cursor: \"pointer\",\n fontSize: 14,\n padding: \"0 2px\",\n lineHeight: 1,\n flexShrink: 0,\n }}\n onMouseEnter={(e) => {\n (e.currentTarget as HTMLElement).style.color = \"#f87171\";\n }}\n onMouseLeave={(e) => {\n (e.currentTarget as HTMLElement).style.color = \"#666\";\n }}\n title=\"Remove this feedback\"\n >\n ×\n </button>\n </div>\n\n <div style={{ fontSize: 11, color: \"var(--muted-foreground)\" }}>\n {change.type === \"text\" ? \"Text\" : \"Image\"} change\n {change.modified && change.type === \"text\" && (\n <span style={{ color: \"var(--muted-foreground)\" }}>\n {\" \"}\n — &quot;{change.modified.slice(0, 40)}\n {change.modified.length > 40 ? \"...\" : \"\"}&quot;\n </span>\n )}\n </div>\n\n {change.note && (\n <div\n style={{\n fontSize: 11,\n color: \"var(--muted-foreground)\",\n fontStyle: \"italic\",\n marginTop: 2,\n }}\n >\n &quot;{change.note}&quot;\n </div>\n )}\n </div>\n ))}\n </div>\n );\n}\n","import { useCallback, useEffect, useState } from \"react\";\n\nimport type { ElementRect } from \"../types\";\nimport { getElementLabel, isDevToolsElement } from \"../utils/element-info\";\n\nexport function useElementSelector(active: boolean) {\n const [hoveredElement, setHoveredElement] = useState<Element | null>(null);\n const [rect, setRect] = useState<ElementRect | null>(null);\n const [label, setLabel] = useState(\"\");\n const [selectedElement, setSelectedElement] = useState<Element | null>(null);\n\n const clearSelection = useCallback(() => {\n setSelectedElement(null);\n }, []);\n\n useEffect(() => {\n if (!active) {\n setHoveredElement(null);\n setRect(null);\n setLabel(\"\");\n return;\n }\n\n const handleMouseMove = (e: MouseEvent) => {\n // Don't highlight when hovering devtools UI\n if (isDevToolsElement(e.target as Element)) {\n setHoveredElement(null);\n setRect(null);\n setLabel(\"\");\n return;\n }\n\n const elements = document.elementsFromPoint(e.clientX, e.clientY);\n const target = elements.find((el) => !isDevToolsElement(el));\n\n if (\n !target ||\n target === document.body ||\n target === document.documentElement\n ) {\n setHoveredElement(null);\n setRect(null);\n setLabel(\"\");\n return;\n }\n\n setHoveredElement(target);\n const bounds = target.getBoundingClientRect();\n setRect({\n top: bounds.top,\n left: bounds.left,\n width: bounds.width,\n height: bounds.height,\n });\n setLabel(getElementLabel(target));\n };\n\n const handleClick = (e: MouseEvent) => {\n // Don't intercept clicks on devtools UI\n if (isDevToolsElement(e.target as Element)) return;\n\n e.preventDefault();\n e.stopPropagation();\n\n const elements = document.elementsFromPoint(e.clientX, e.clientY);\n const target = elements.find((el) => !isDevToolsElement(el));\n\n if (\n target &&\n target !== document.body &&\n target !== document.documentElement\n ) {\n setSelectedElement(target);\n }\n };\n\n const handleScroll = () => {\n if (hoveredElement) {\n const bounds = hoveredElement.getBoundingClientRect();\n setRect({\n top: bounds.top,\n left: bounds.left,\n width: bounds.width,\n height: bounds.height,\n });\n }\n };\n\n document.addEventListener(\"mousemove\", handleMouseMove, true);\n document.addEventListener(\"click\", handleClick, true);\n window.addEventListener(\"scroll\", handleScroll, true);\n\n return () => {\n document.removeEventListener(\"mousemove\", handleMouseMove, true);\n document.removeEventListener(\"click\", handleClick, true);\n window.removeEventListener(\"scroll\", handleScroll, true);\n };\n }, [active, hoveredElement]);\n\n return { hoveredElement, rect, label, selectedElement, clearSelection };\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\";\n\nimport type { Change, PersistedFeedback } from \"../types\";\n\nconst STORAGE_PREFIX = \"devtools-feedback\";\n\nfunction getStorageKey(): string {\n return `${STORAGE_PREFIX}-${window.location.pathname}`;\n}\n\nfunction loadPersisted(): PersistedFeedback | null {\n try {\n const raw = localStorage.getItem(getStorageKey());\n if (!raw) return null;\n return JSON.parse(raw);\n } catch {\n return null;\n }\n}\n\nfunction persist(data: PersistedFeedback): void {\n try {\n localStorage.setItem(getStorageKey(), JSON.stringify(data));\n } catch {\n /* quota exceeded */\n }\n}\n\nfunction clearPersisted(): void {\n localStorage.removeItem(getStorageKey());\n}\n\nfunction generateId(): string {\n if (typeof crypto !== \"undefined\" && crypto.randomUUID) {\n return crypto.randomUUID();\n }\n return Date.now().toString(36) + Math.random().toString(36).slice(2);\n}\n\nexport function useFeedback() {\n const [changes, setChanges] = useState<Change[]>(() => {\n if (typeof window === \"undefined\") return [];\n return loadPersisted()?.changes ?? [];\n });\n const originalsRef = useRef<\n Map<Element, { type: \"text\" | \"image\"; value: string }>\n >(new Map());\n\n useEffect(() => {\n persist({ changes });\n }, [changes]);\n\n const trackOriginal = useCallback(\n (element: Element, type: \"text\" | \"image\", value: string) => {\n if (!originalsRef.current.has(element)) {\n originalsRef.current.set(element, { type, value });\n }\n },\n []\n );\n\n const addChange = useCallback((change: Change) => {\n setChanges((prev) => {\n const existing = prev.findIndex(\n (c) => c.selector === change.selector && c.type === change.type\n );\n if (existing !== -1) {\n const updated = [...prev];\n updated[existing] = { ...change, id: prev[existing].id };\n return updated;\n }\n return [...prev, { ...change, id: change.id || generateId() }];\n });\n }, []);\n\n const removeChange = useCallback((changeId: string) => {\n setChanges((prev) => prev.filter((c) => c.id !== changeId));\n }, []);\n\n const updateNote = useCallback((changeId: string, note: string) => {\n setChanges((prev) =>\n prev.map((c) => (c.id === changeId ? { ...c, note } : c))\n );\n }, []);\n\n const resetElement = useCallback(\n (changeId: string) => {\n const change = changes.find((c) => c.id === changeId);\n if (!change) return;\n\n const el = document.querySelector(change.selector);\n if (el) {\n if (change.modified) {\n const original = originalsRef.current.get(el);\n if (original) {\n if (original.type === \"text\") {\n el.textContent = original.value;\n } else if (original.type === \"image\") {\n (el as HTMLImageElement).src = original.value;\n }\n }\n }\n originalsRef.current.delete(el);\n (el as HTMLElement).contentEditable = \"false\";\n (el as HTMLElement).style.outline = \"\";\n (el as HTMLElement).style.outlineOffset = \"\";\n (el as HTMLElement).style.cursor = \"\";\n }\n\n setChanges((prev) => prev.filter((c) => c.id !== changeId));\n },\n [changes]\n );\n\n const getPayload = useCallback(() => {\n return {\n url: window.location.href,\n path: window.location.pathname,\n changes,\n timestamp: new Date().toISOString(),\n };\n }, [changes]);\n\n const reset = useCallback(() => {\n originalsRef.current.forEach((original, element) => {\n const change = changes.find(\n (c) => document.querySelector(c.selector) === element\n );\n if (change?.modified) {\n if (original.type === \"text\") {\n element.textContent = original.value;\n } else if (original.type === \"image\") {\n (element as HTMLImageElement).src = original.value;\n }\n }\n (element as HTMLElement).contentEditable = \"false\";\n (element as HTMLElement).style.outline = \"\";\n (element as HTMLElement).style.outlineOffset = \"\";\n (element as HTMLElement).style.cursor = \"\";\n });\n originalsRef.current.clear();\n\n changes.forEach((change) => {\n const el = document.querySelector(change.selector);\n if (el) {\n (el as HTMLElement).style.outline = \"\";\n (el as HTMLElement).style.outlineOffset = \"\";\n (el as HTMLElement).contentEditable = \"false\";\n (el as HTMLElement).style.cursor = \"\";\n }\n });\n\n setChanges([]);\n clearPersisted();\n }, [changes]);\n\n return {\n changes,\n trackOriginal,\n addChange,\n removeChange,\n updateNote,\n resetElement,\n getPayload,\n reset,\n };\n}\n","import { useCallback, useEffect, useState } from \"react\";\n\nexport function useLocalStorageFlag(\n key: string\n): [boolean, (val: boolean | null) => void] {\n const [value, setValue] = useState<boolean>(() => {\n if (typeof window === \"undefined\") return false;\n return localStorage.getItem(key) === \"true\";\n });\n\n useEffect(() => {\n const onStorage = (e: StorageEvent) => {\n if (e.key === key) setValue(e.newValue === \"true\");\n };\n window.addEventListener(\"storage\", onStorage);\n\n const interval = setInterval(() => {\n const current = localStorage.getItem(key) === \"true\";\n setValue((prev) => (prev !== current ? current : prev));\n }, 1000);\n\n return () => {\n window.removeEventListener(\"storage\", onStorage);\n clearInterval(interval);\n };\n }, [key]);\n\n const setFlag = useCallback(\n (val: boolean | null) => {\n if (val === null || val === false) {\n localStorage.removeItem(key);\n setValue(false);\n } else {\n localStorage.setItem(key, \"true\");\n setValue(true);\n }\n },\n [key]\n );\n\n return [value, setFlag];\n}\n","import type { FeedbackPayload } from \"../types\";\n\nexport function formatFeedbackMarkdown(payload: FeedbackPayload): string {\n const lines: string[] = [\n \"## Client Feedback\",\n \"\",\n `**Page**: ${payload.url}`,\n `**Path**: ${payload.path}`,\n `**Date**: ${payload.timestamp}`,\n \"\",\n ];\n\n if (payload.changes.length > 0) {\n lines.push(\"### Changes Requested\", \"\");\n\n payload.changes.forEach((change, i) => {\n const num = i + 1;\n const typeLabel =\n change.type === \"text\" ? \"Text Change\" : \"Image Change\";\n lines.push(`${num}. **${typeLabel}** on \\`${change.selector}\\``);\n lines.push(` - **Element**: \\`${change.element}\\``);\n lines.push(` - **Current**: \"${change.original}\"`);\n lines.push(` - **Change to**: \"${change.modified}\"`);\n if (change.note) {\n lines.push(` - **Note**: \"${change.note}\"`);\n }\n lines.push(\"\");\n });\n }\n\n return lines.join(\"\\n\");\n}\n\nexport async function copyFeedbackToClipboard(\n payload: FeedbackPayload\n): Promise<boolean> {\n const markdown = formatFeedbackMarkdown(payload);\n\n try {\n await navigator.clipboard.writeText(markdown);\n return true;\n } catch {\n return false;\n }\n}\n","\"use client\";\n\nimport React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\n\nimport { Editor } from \"./components/editor\";\nimport { ElementResetButton } from \"./components/element-reset-button\";\nimport { Inspector } from \"./components/inspector\";\nimport { NotePopup } from \"./components/note-popup\";\nimport { Toast } from \"./components/toast\";\nimport { Toolbar } from \"./components/toolbar\";\nimport { ViewPanel } from \"./components/view-panel\";\nimport { useElementSelector } from \"./hooks/use-element-selector\";\nimport { useFeedback } from \"./hooks/use-feedback\";\nimport { useLocalStorageFlag } from \"./hooks/use-local-storage\";\nimport type { Change, DevToolsProps, DevToolsState, ElementRect } from \"./types\";\nimport { copyFeedbackToClipboard } from \"./utils/clipboard\";\nimport {\n getCssSelector,\n getElementLabel,\n isDevToolsElement,\n} from \"./utils/element-info\";\nimport { KEYFRAMES } from \"./utils/styles\";\n\nconst DEFAULT_REQUEST_URL = \"https://portal.alisamadii.com/requests\";\n\nexport function DevTools({\n storageKey = \"devtools-enabled\",\n position = \"bottom-right\",\n zIndex = 99999,\n requestUrl = DEFAULT_REQUEST_URL,\n}: DevToolsProps) {\n const [enabled, setEnabled] = useLocalStorageFlag(storageKey);\n const [state, setState] = useState<DevToolsState>(\"hidden\");\n const [mounted, setMounted] = useState(false);\n const [toast, setToast] = useState<{\n message: string;\n variant: \"success\" | \"warning\";\n linkUrl?: string;\n linkText?: string;\n } | null>(null);\n const [selectedElement, setSelectedElement] = useState<Element | null>(null);\n const [highlightedRect, setHighlightedRect] = useState<ElementRect | null>(\n null\n );\n const stylesInjected = useRef(false);\n\n const feedback = useFeedback();\n const feedbackResetRef = useRef(feedback.reset);\n feedbackResetRef.current = feedback.reset;\n\n const inspector = useElementSelector(state === \"inspecting\");\n\n // Inject keyframe styles once\n useEffect(() => {\n if (stylesInjected.current) return;\n if (typeof document === \"undefined\") return;\n\n const existing = document.querySelector(\"[data-devtools-styles]\");\n if (existing) return;\n\n const style = document.createElement(\"style\");\n style.setAttribute(\"data-devtools-styles\", \"\");\n style.textContent = KEYFRAMES;\n document.head.appendChild(style);\n stylesInjected.current = true;\n\n return () => {\n style.remove();\n stylesInjected.current = false;\n };\n }, []);\n\n useEffect(() => {\n setMounted(true);\n }, []);\n\n // Re-apply outlines to persisted elements on mount/page load\n useEffect(() => {\n if (!mounted || !enabled) return;\n\n feedback.changes.forEach((change) => {\n const el = document.querySelector(change.selector);\n if (el) {\n (el as HTMLElement).style.outline =\n \"2px solid rgba(59, 130, 246, 0.5)\";\n (el as HTMLElement).style.outlineOffset = \"2px\";\n }\n });\n }, [mounted, enabled]); // eslint-disable-line react-hooks/exhaustive-deps\n\n // Sync enabled ↔ state\n useEffect(() => {\n if (enabled && state === \"hidden\") {\n setState(\"inspecting\");\n } else if (!enabled && state !== \"hidden\") {\n setState(\"hidden\");\n feedbackResetRef.current();\n setSelectedElement(null);\n }\n }, [enabled, state]);\n\n // React to element selection from inspector — create a Change immediately\n const MAX_FEEDBACK = 5;\n\n useEffect(() => {\n if (inspector.selectedElement) {\n const el = inspector.selectedElement;\n const selector = getCssSelector(el);\n const existing = feedback.changes.find((c) => c.selector === selector);\n\n // Block new feedback if at limit (allow re-selecting existing ones)\n if (!existing && feedback.changes.length >= MAX_FEEDBACK) {\n setToast({\n message: `Limit reached (${MAX_FEEDBACK}). Copy feedback & create a ClickUp task, then reset to continue.`,\n variant: \"warning\",\n });\n inspector.clearSelection();\n return;\n }\n\n setSelectedElement(el);\n setState(\"editing\");\n\n if (!existing) {\n const isImage = el.tagName.toLowerCase() === \"img\";\n feedback.addChange({\n id: \"\",\n selector,\n element: getElementLabel(el),\n type: isImage ? \"image\" : \"text\",\n original: isImage\n ? (el as HTMLImageElement).src\n : (el.textContent || \"\").trim().slice(0, 200),\n modified: \"\",\n note: \"\",\n });\n }\n\n inspector.clearSelection();\n }\n }, [inspector.selectedElement, inspector.clearSelection]);\n\n // Intercept <a> tag navigation while devtools active\n useEffect(() => {\n if (state === \"hidden\") return;\n\n const handleLinkClick = (e: MouseEvent) => {\n const target = e.target as HTMLElement;\n if (isDevToolsElement(target)) return;\n const anchor = target.closest(\"a\");\n if (anchor) {\n e.preventDefault();\n e.stopPropagation();\n }\n };\n\n document.addEventListener(\"click\", handleLinkClick, true);\n return () => document.removeEventListener(\"click\", handleLinkClick, true);\n }, [state]);\n\n const handleHide = useCallback(() => {\n feedbackResetRef.current();\n setSelectedElement(null);\n setEnabled(null);\n }, [setEnabled]);\n\n const handleStartInspecting = useCallback(() => {\n setState((s) => (s === \"inspecting\" ? \"idle\" : \"inspecting\"));\n setSelectedElement(null);\n setHighlightedRect(null);\n }, []);\n\n const handleBack = useCallback(() => {\n setSelectedElement(null);\n setState(\"inspecting\");\n }, []);\n\n const handleCopyFeedback = useCallback(async () => {\n const payload = feedback.getPayload();\n const success = await copyFeedbackToClipboard(payload);\n\n if (success) {\n setToast({\n message: \"Feedback copied!\",\n variant: \"success\",\n linkUrl: requestUrl,\n linkText: \"Submit here →\",\n });\n } else {\n setToast({ message: \"Failed to copy — try again\", variant: \"warning\" });\n }\n }, [feedback, requestUrl]);\n\n const handleReset = useCallback(() => {\n feedbackResetRef.current();\n setSelectedElement(null);\n setState(\"inspecting\");\n }, []);\n\n const handleView = useCallback(() => {\n setState((s) => (s === \"viewing\" ? \"inspecting\" : \"viewing\"));\n setSelectedElement(null);\n setHighlightedRect(null);\n }, []);\n\n const scrollRafRef = useRef(0);\n\n const handleViewHover = useCallback((change: Change | null) => {\n cancelAnimationFrame(scrollRafRef.current);\n\n if (!change) {\n setHighlightedRect(null);\n return;\n }\n const el = document.querySelector(change.selector);\n if (!el) {\n setHighlightedRect(null);\n return;\n }\n\n el.scrollIntoView({ behavior: \"smooth\", block: \"center\" });\n\n let frames = 0;\n const updateRect = () => {\n const r = el.getBoundingClientRect();\n setHighlightedRect({\n top: r.top,\n left: r.left,\n width: r.width,\n height: r.height,\n });\n frames++;\n if (frames < 60) {\n scrollRafRef.current = requestAnimationFrame(updateRect);\n }\n };\n updateRect();\n }, []);\n\n const handleDeleteChange = useCallback(\n (changeId: string) => {\n feedback.resetElement(changeId);\n },\n [feedback.resetElement]\n );\n\n const handleSaveNote = useCallback(\n (note: string) => {\n if (selectedElement) {\n const selector = getCssSelector(selectedElement);\n const change = feedback.changes.find((c) => c.selector === selector);\n if (change) {\n feedback.updateNote(change.id, note);\n }\n }\n setSelectedElement(null);\n setState(\"inspecting\");\n },\n [selectedElement, feedback.changes, feedback.updateNote]\n );\n\n const handleNoteClose = useCallback(() => {\n if (selectedElement) {\n const selector = getCssSelector(selectedElement);\n const change = feedback.changes.find((c) => c.selector === selector);\n if (change && !change.note && !change.modified) {\n feedback.resetElement(change.id);\n }\n }\n setSelectedElement(null);\n setState(\"inspecting\");\n }, [selectedElement, feedback.changes, feedback.resetElement]);\n\n const handleElementReset = useCallback(() => {\n if (selectedElement) {\n const selector = getCssSelector(selectedElement);\n const change = feedback.changes.find((c) => c.selector === selector);\n if (change) {\n feedback.resetElement(change.id);\n }\n }\n setSelectedElement(null);\n setState(\"inspecting\");\n }, [selectedElement, feedback.changes, feedback.resetElement]);\n\n if (!mounted || !enabled || typeof window === \"undefined\") return null;\n\n const showToolbar = state !== \"hidden\";\n const showInspector = state === \"inspecting\";\n\n return createPortal(\n <div data-devtools-ignore>\n {showToolbar && (\n <Toolbar\n state={state}\n changesCount={feedback.changes.length}\n onSelectElement={handleStartInspecting}\n onCopyFeedback={handleCopyFeedback}\n onView={handleView}\n onReset={handleReset}\n onHide={handleHide}\n onBack={handleBack}\n isViewing={state === \"viewing\"}\n requestUrl={requestUrl}\n zIndex={zIndex}\n position={position}\n />\n )}\n\n {showInspector && (\n <Inspector\n rect={inspector.rect}\n label={inspector.label}\n zIndex={zIndex}\n />\n )}\n\n {highlightedRect && state === \"viewing\" && (\n <Inspector rect={highlightedRect} label=\"\" zIndex={zIndex} />\n )}\n\n {selectedElement && state === \"editing\" && (\n <>\n <Editor\n element={selectedElement}\n onTrackOriginal={feedback.trackOriginal}\n onAddChange={feedback.addChange}\n />\n <NotePopup\n element={selectedElement}\n initialNote={\n feedback.changes.find(\n (c) => c.selector === getCssSelector(selectedElement)\n )?.note ?? \"\"\n }\n onSave={handleSaveNote}\n onClose={handleNoteClose}\n zIndex={zIndex}\n />\n <ElementResetButton\n element={selectedElement}\n onReset={handleElementReset}\n zIndex={zIndex}\n />\n </>\n )}\n\n {state === \"viewing\" && (\n <ViewPanel\n changes={feedback.changes}\n onDelete={handleDeleteChange}\n onHover={handleViewHover}\n zIndex={zIndex}\n position={position}\n />\n )}\n\n {toast && (\n <Toast\n message={toast.message}\n variant={toast.variant}\n duration={toast.linkUrl ? 6000 : toast.variant === \"warning\" ? 5000 : 3000}\n linkUrl={toast.linkUrl}\n linkText={toast.linkText}\n onDone={() => setToast(null)}\n zIndex={zIndex}\n position={position}\n />\n )}\n </div>,\n document.body\n );\n}\n"]}
package/package.json ADDED
@@ -0,0 +1,57 @@
1
+ {
2
+ "name": "@alisamadiillc/devtools",
3
+ "version": "0.0.1",
4
+ "description": "Visual feedback devtools for client websites — select elements, edit live, capture screenshots, copy structured feedback",
5
+ "private": false,
6
+ "type": "module",
7
+ "main": "./dist/index.cjs",
8
+ "module": "./dist/index.js",
9
+ "types": "./dist/index.d.ts",
10
+ "exports": {
11
+ ".": {
12
+ "import": {
13
+ "types": "./dist/index.d.ts",
14
+ "default": "./dist/index.js"
15
+ },
16
+ "require": {
17
+ "types": "./dist/index.d.cts",
18
+ "default": "./dist/index.cjs"
19
+ }
20
+ }
21
+ },
22
+ "files": [
23
+ "dist"
24
+ ],
25
+ "sideEffects": false,
26
+ "publishConfig": {
27
+ "access": "public"
28
+ },
29
+ "scripts": {
30
+ "build": "tsup",
31
+ "dev": "tsup --watch",
32
+ "lint": "eslint . --max-warnings 0",
33
+ "prepublishOnly": "pnpm build"
34
+ },
35
+ "peerDependencies": {
36
+ "react": ">=18",
37
+ "react-dom": ">=18"
38
+ },
39
+ "dependencies": {},
40
+ "devDependencies": {
41
+ "@types/react": "^19.0.0",
42
+ "@types/react-dom": "^19.0.0",
43
+ "@workspace/typescript-config": "workspace:*",
44
+ "react": "^19.0.0",
45
+ "react-dom": "^19.0.0",
46
+ "tsup": "^8.0.0",
47
+ "typescript": "^5.9.0"
48
+ },
49
+ "keywords": [
50
+ "devtools",
51
+ "feedback",
52
+ "element-inspector",
53
+ "screenshot",
54
+ "client-feedback"
55
+ ],
56
+ "license": "MIT"
57
+ }