glitchgrab 1.29.1 → 1.30.0
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.
- package/dist/index.js +155 -23
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +155 -23
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/provider.tsx","../src/error-boundary.tsx","../src/breadcrumbs.ts","../src/utils.ts","../src/dedup.ts","../src/report-dialog.tsx","../src/annotation-canvas.tsx","../src/shortcut.ts","../src/report-button.tsx","../src/use-reports.ts"],"sourcesContent":["\"use client\";\n\n// ─── Core (required) ─────────────────────────────────────\nexport { GlitchgrabProvider, useGlitchgrab } from \"./provider\";\n\n// ─── Optional Components ─────────────────────────────────\nexport { ReportButton } from \"./report-button\";\nexport { GlitchgrabErrorBoundary } from \"./error-boundary\";\n\n// ─── Hooks ──────────────────────────────────────────────\nexport { useGlitchgrabReports, fetchGlitchgrabReports, useGlitchgrabActions } from \"./use-reports\";\nexport type { GlitchgrabReport } from \"./use-reports\";\n\n// ─── Breadcrumbs ─────────────────────────────────────────\nexport {\n addBreadcrumb,\n getBreadcrumbs,\n clearBreadcrumbs,\n initBreadcrumbs,\n} from \"./breadcrumbs\";\n\n// ─── Keyboard shortcut ───────────────────────────────────\nexport {\n GLITCHGRAB_SHORTCUT,\n GLITCHGRAB_SHORTCUT_MAC,\n getShortcutLabel,\n matchesShortcut,\n} from \"./shortcut\";\n\n// ─── Utilities ───────────────────────────────────────────\nexport { sanitizeUrl, captureContext, captureDeviceInfo, sendReport, enhanceText } from \"./utils\";\nexport { computeSignature, shouldSkipDuplicate, clearDedupCache } from \"./dedup\";\n\n// ─── Types ───────────────────────────────────────────────\nexport type {\n GlitchgrabConfig,\n GlitchgrabProviderProps,\n ReportPayload,\n ReportResult,\n ReportType,\n ReportSeverity,\n CapturedContext,\n DeviceInfo,\n Breadcrumb,\n BreadcrumbType,\n UseGlitchgrabReturn,\n ReportButtonProps,\n GlitchgrabSession,\n} from \"./types\";\n","\"use client\";\n\nimport {\n createContext,\n useContext,\n useRef,\n useEffect,\n useCallback,\n useState,\n} from \"react\";\nimport type {\n GlitchgrabProviderProps,\n UseGlitchgrabReturn,\n ReportPayload,\n ReportResult,\n ReportType,\n} from \"./types\";\nimport { GlitchgrabErrorBoundary } from \"./error-boundary\";\nimport { ReportDialog } from \"./report-dialog\";\nimport { sanitizeUrl, captureContext, sendReport, captureDeviceInfo, enhanceText, transcribeAudio, type EnhanceContext } from \"./utils\";\nimport { computeSignature, shouldSkipDuplicate } from \"./dedup\";\nimport { GLITCHGRAB_SHORTCUT, getShortcutLabel, matchesShortcut } from \"./shortcut\";\nimport {\n initBreadcrumbs,\n addBreadcrumb as addBreadcrumbInternal,\n getBreadcrumbs,\n} from \"./breadcrumbs\";\n\nconst DEFAULT_BASE_URL = \"https://glitchgrab.dev\";\n\nconst GlitchgrabContext = createContext<UseGlitchgrabReturn | null>(null);\n\n/**\n * Hook to access Glitchgrab in your components.\n *\n * @example\n * ```tsx\n * const { reportBug, report, addBreadcrumb } = useGlitchgrab();\n *\n * // Report a bug\n * reportBug(\"Login button crashes on mobile\");\n *\n * // Report a feature request\n * report(\"FEATURE_REQUEST\", \"Add dark mode\");\n *\n * // Add a custom breadcrumb\n * addBreadcrumb(\"User clicked checkout\", { cartItems: \"3\" });\n * ```\n */\nexport function useGlitchgrab(): UseGlitchgrabReturn {\n const ctx = useContext(GlitchgrabContext);\n if (!ctx) {\n throw new Error(\"useGlitchgrab must be used within a GlitchgrabProvider\");\n }\n return ctx;\n}\n\nfunction GlitchgrabProviderInner({\n token,\n session,\n baseUrl,\n onError,\n onReportSent,\n breadcrumbs: enableBreadcrumbs = true,\n maxBreadcrumbs = 50,\n children,\n fallback,\n types,\n showSeverity,\n ignoreErrors,\n}: GlitchgrabProviderProps) {\n const visitedPagesRef = useRef<string[]>([]);\n\n // Initialize breadcrumbs\n useEffect(() => {\n if (enableBreadcrumbs) {\n initBreadcrumbs(maxBreadcrumbs);\n }\n }, [enableBreadcrumbs, maxBreadcrumbs]);\n\n // Track page visits\n useEffect(() => {\n try {\n if (typeof window === \"undefined\") return;\n\n const trackPage = () => {\n try {\n const sanitized = sanitizeUrl(window.location.href);\n const pages = visitedPagesRef.current;\n if (pages[pages.length - 1] !== sanitized) {\n pages.push(sanitized);\n if (pages.length > 20) {\n pages.splice(0, pages.length - 20);\n }\n }\n } catch {\n // Silently fail\n }\n };\n\n trackPage();\n const handlePopState = () => trackPage();\n window.addEventListener(\"popstate\", handlePopState);\n\n const origPushState = history.pushState.bind(history);\n const origReplaceState = history.replaceState.bind(history);\n\n history.pushState = function (...args) {\n origPushState(...args);\n trackPage();\n };\n history.replaceState = function (...args) {\n origReplaceState(...args);\n trackPage();\n };\n\n return () => {\n window.removeEventListener(\"popstate\", handlePopState);\n history.pushState = origPushState;\n history.replaceState = origReplaceState;\n };\n } catch {\n // Never crash\n }\n }, []);\n\n // Unhandled errors and rejections — skip in development\n useEffect(() => {\n try {\n if (typeof window === \"undefined\") return;\n if (process.env.NODE_ENV === \"development\") return;\n\n // Matches chrome-extension://, safari-extension://, moz-extension://\n const EXTENSION_ORIGIN_RE = /\\b(?:chrome|safari|moz)-extension:\\/\\//;\n\n // Well-known extension-injected noise that carries no extension origin in\n // filename/stack, so EXTENSION_ORIGIN_RE can't catch it. Not app bugs.\n const KNOWN_NOISE_RE = [\n /Object Not Found Matching Id:\\d+, MethodName:update, ParamCount:\\d+/,\n ];\n\n const matchesIgnore = (message: string): boolean => {\n if (KNOWN_NOISE_RE.some((pattern) => pattern.test(message))) return true;\n if (!ignoreErrors || ignoreErrors.length === 0) return false;\n return ignoreErrors.some((pattern) =>\n pattern instanceof RegExp ? pattern.test(message) : message.includes(pattern)\n );\n };\n\n const handleError = (event: ErrorEvent) => {\n try {\n // Ignore opaque cross-origin script errors — the browser masks these with no\n // stack, no filename, and no error object, so there is nothing actionable to report.\n const isOpaqueCrossOrigin =\n event.message === \"Script error.\" ||\n event.message === \"Script error\" ||\n (!event.error && !event.filename);\n if (isOpaqueCrossOrigin) {\n return;\n }\n\n // Caller-supplied ignore patterns — known-noisy signatures (e.g. browser\n // extension bridge errors) that aren't app bugs.\n if (matchesIgnore(event.message)) {\n return;\n }\n\n // Ignore benign ResizeObserver warnings — these are triggered by UI libraries\n // (Radix, cmdk, etc.) and are not actionable bugs.\n if (\n event.message === \"ResizeObserver loop completed with undelivered notifications.\" ||\n event.message === \"ResizeObserver loop limit exceeded\"\n ) {\n return;\n }\n\n // Ignore errors thrown by browser extensions — crypto wallets, ad blockers,\n // and other extensions run in the page's JS context but are not part of the app.\n if (\n (event.filename && EXTENSION_ORIGIN_RE.test(event.filename)) ||\n (event.error?.stack && EXTENSION_ORIGIN_RE.test(event.error.stack))\n ) {\n return;\n }\n const context = captureContext(visitedPagesRef.current);\n const sig = computeSignature({\n errorMessage: event.message,\n pageUrl: context.url,\n errorStack: event.error?.stack,\n });\n if (shouldSkipDuplicate(sig)) return;\n const payload: ReportPayload = {\n token,\n source: \"SDK_AUTO\",\n type: \"BUG\",\n errorMessage: event.message,\n errorStack: event.error?.stack,\n pageUrl: context.url,\n userAgent: context.userAgent,\n breadcrumbs: context.breadcrumbs,\n deviceInfo: context.deviceInfo ?? undefined,\n metadata: {\n timestamp: context.timestamp,\n visitedPages: JSON.stringify(context.visitedPages),\n filename: event.filename ?? \"\",\n lineno: String(event.lineno ?? \"\"),\n colno: String(event.colno ?? \"\"),\n ...(session?.userId ? { sessionUserId: session.userId } : {}),\n ...(session?.name ? { sessionUserName: String(session.name) } : {}),\n ...(session?.email ? { sessionUserEmail: String(session.email) } : {}),\n ...(session?.phone ? { sessionUserPhone: String(session.phone) } : {}),\n },\n };\n sendReport(payload, baseUrl).then((result) => {\n if (result && onReportSent) onReportSent(result);\n });\n if (onError && event.error) onError(event.error);\n } catch {\n // Silently fail\n }\n };\n\n const handleRejection = (event: PromiseRejectionEvent) => {\n try {\n const context = captureContext(visitedPagesRef.current);\n const reason = event.reason;\n const errMsg = reason instanceof Error ? reason.message : String(reason);\n // Ignore generic cross-origin script errors.\n if (errMsg === \"Script error.\" || errMsg === \"Script error\") {\n return;\n }\n\n // Caller-supplied ignore patterns — known-noisy signatures (e.g. browser\n // extension bridge errors) that aren't app bugs.\n if (matchesIgnore(errMsg)) {\n return;\n }\n const errStack = reason instanceof Error ? reason.stack : undefined;\n\n // Ignore unhandled rejections where the call chain passes through a browser\n // extension — these are the extension's own failures, not the app's.\n if (errStack && EXTENSION_ORIGIN_RE.test(errStack)) return;\n\n const sig = computeSignature({\n errorMessage: errMsg,\n pageUrl: context.url,\n errorStack: errStack,\n });\n if (shouldSkipDuplicate(sig)) return;\n const payload: ReportPayload = {\n token,\n source: \"SDK_AUTO\",\n type: \"BUG\",\n errorMessage: errMsg,\n errorStack: errStack,\n pageUrl: context.url,\n userAgent: context.userAgent,\n breadcrumbs: context.breadcrumbs,\n deviceInfo: context.deviceInfo ?? undefined,\n metadata: {\n timestamp: context.timestamp,\n visitedPages: JSON.stringify(context.visitedPages),\n type: \"unhandledrejection\",\n ...(session?.userId ? { sessionUserId: session.userId } : {}),\n ...(session?.name ? { sessionUserName: String(session.name) } : {}),\n ...(session?.email ? { sessionUserEmail: String(session.email) } : {}),\n ...(session?.phone ? { sessionUserPhone: String(session.phone) } : {}),\n },\n };\n sendReport(payload, baseUrl).then((result) => {\n if (result && onReportSent) onReportSent(result);\n });\n if (onError && reason instanceof Error) onError(reason);\n } catch {\n // Silently fail\n }\n };\n\n window.addEventListener(\"error\", handleError);\n window.addEventListener(\"unhandledrejection\", handleRejection);\n\n return () => {\n window.removeEventListener(\"error\", handleError);\n window.removeEventListener(\"unhandledrejection\", handleRejection);\n };\n } catch {\n // Never crash\n }\n }, [token, baseUrl, onError, onReportSent, session, ignoreErrors]);\n\n const report = useCallback(\n async (\n type: ReportType,\n description: string,\n metadata?: Record<string, string>\n ): Promise<ReportResult | null> => {\n try {\n const context = captureContext(visitedPagesRef.current);\n const payload: ReportPayload = {\n token,\n source: \"SDK_USER_REPORT\",\n type,\n description,\n pageUrl: context.url,\n userAgent: context.userAgent,\n breadcrumbs: context.breadcrumbs,\n deviceInfo: context.deviceInfo ?? undefined,\n metadata: {\n timestamp: context.timestamp,\n visitedPages: JSON.stringify(context.visitedPages),\n ...(session?.userId ? { sessionUserId: session.userId } : {}),\n ...(session?.name ? { sessionUserName: String(session.name) } : {}),\n ...(session?.email ? { sessionUserEmail: String(session.email) } : {}),\n ...(session?.phone ? { sessionUserPhone: String(session.phone) } : {}),\n ...metadata,\n },\n };\n const result = await sendReport(payload, baseUrl);\n if (result && onReportSent) onReportSent(result);\n return result;\n } catch {\n return null;\n }\n },\n [token, baseUrl, onReportSent, session]\n );\n\n const reportBug = useCallback(\n (description: string, metadata?: Record<string, string>) =>\n report(\"BUG\", description, metadata),\n [report]\n );\n\n const addBreadcrumb = useCallback(\n (message: string, data?: Record<string, string>) => {\n addBreadcrumbInternal(\"custom\", message, data);\n },\n []\n );\n\n const enhance = useCallback(\n async (text: string, screenshot?: string | null): Promise<string> => {\n try {\n const ctx = captureContext(visitedPagesRef.current);\n const context: EnhanceContext = {\n url: ctx.url,\n visitedPages: ctx.visitedPages.slice(-5),\n breadcrumbs: ctx.breadcrumbs.slice(-10).map((b) => ({ type: b.type, message: b.message })),\n };\n return await enhanceText(text, token, baseUrl, screenshot, context);\n } catch {\n return text;\n }\n },\n [token, baseUrl]\n );\n\n const transcribe = useCallback(\n async (blob: Blob): Promise<string> => {\n try {\n return await transcribeAudio(blob, token, baseUrl);\n } catch {\n return \"\";\n }\n },\n [token, baseUrl]\n );\n\n const openReportDialog = useCallback((options?: { description?: string; type?: ReportType }) => {\n if (typeof window !== \"undefined\") {\n window.dispatchEvent(new CustomEvent(\"glitchgrab:open-report\", { detail: options }));\n }\n }, []);\n\n // Global keyboard shortcut: Cmd+Shift+G (Mac) / Ctrl+Shift+G (Windows/Linux)\n useEffect(() => {\n try {\n if (typeof window === \"undefined\") return;\n const handleKeyDown = (e: KeyboardEvent) => {\n if (matchesShortcut(e)) {\n e.preventDefault();\n openReportDialog();\n }\n };\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => window.removeEventListener(\"keydown\", handleKeyDown);\n } catch {\n // Never crash\n }\n }, [openReportDialog]);\n\n // Starts as the non-Mac label so SSR and the first client render agree,\n // then resolves to the real platform label after mount.\n const [shortcutLabel, setShortcutLabel] = useState(GLITCHGRAB_SHORTCUT);\n useEffect(() => {\n setShortcutLabel(getShortcutLabel());\n }, []);\n\n return (\n <GlitchgrabContext.Provider\n value={{\n token,\n baseUrl: baseUrl ?? DEFAULT_BASE_URL,\n reportBug,\n report,\n addBreadcrumb,\n openReportDialog,\n enhanceText: enhance,\n shortcutLabel,\n }}\n >\n <GlitchgrabErrorBoundary\n token={token}\n baseUrl={baseUrl}\n session={session}\n onError={onError}\n fallback={fallback}\n visitedPages={visitedPagesRef.current}\n >\n {children}\n </GlitchgrabErrorBoundary>\n <ReportDialog report={report} enhanceText={enhance} transcribeAudio={transcribe} types={types} showSeverity={showSeverity} />\n </GlitchgrabContext.Provider>\n );\n}\n\nexport function GlitchgrabProvider(props: GlitchgrabProviderProps) {\n // No token = passthrough (SDK disabled)\n if (!props.token) return <>{props.children}</>;\n\n const resolvedProps = {\n ...props,\n baseUrl: props.baseUrl || DEFAULT_BASE_URL,\n };\n\n try {\n return <GlitchgrabProviderInner {...resolvedProps} />;\n } catch {\n return <>{props.children}</>;\n }\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport type { GlitchgrabSession, ReportPayload } from \"./types\";\nimport { captureContext, sendReport } from \"./utils\";\nimport { computeSignature, shouldSkipDuplicate } from \"./dedup\";\n\ninterface ErrorBoundaryProps {\n token: string;\n baseUrl?: string;\n session?: GlitchgrabSession | null;\n onError?: (error: Error) => void;\n fallback?: React.ReactNode;\n visitedPages: string[];\n children: React.ReactNode;\n}\n\ninterface ErrorBoundaryState {\n hasError: boolean;\n}\n\nexport class GlitchgrabErrorBoundary extends React.Component<\n ErrorBoundaryProps,\n ErrorBoundaryState\n> {\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = { hasError: false };\n }\n\n static getDerivedStateFromError(): ErrorBoundaryState {\n return { hasError: true };\n }\n\n componentDidCatch(error: Error, errorInfo: React.ErrorInfo): void {\n try {\n const context = captureContext(this.props.visitedPages);\n\n const sig = computeSignature({\n errorMessage: error.message,\n pageUrl: context.url,\n errorStack: error.stack,\n });\n if (shouldSkipDuplicate(sig)) {\n if (this.props.onError) this.props.onError(error);\n return;\n }\n\n const session = this.props.session;\n const payload: ReportPayload = {\n token: this.props.token,\n source: \"SDK_AUTO\",\n type: \"BUG\",\n errorMessage: error.message,\n errorStack: error.stack,\n componentStack: errorInfo.componentStack ?? undefined,\n pageUrl: context.url,\n userAgent: context.userAgent,\n breadcrumbs: context.breadcrumbs,\n deviceInfo: context.deviceInfo ?? undefined,\n metadata: {\n timestamp: context.timestamp,\n visitedPages: JSON.stringify(context.visitedPages),\n ...(session?.userId ? { sessionUserId: session.userId } : {}),\n ...(session?.name ? { sessionUserName: String(session.name) } : {}),\n ...(session?.email ? { sessionUserEmail: String(session.email) } : {}),\n ...(session?.phone ? { sessionUserPhone: String(session.phone) } : {}),\n },\n };\n\n sendReport(payload, this.props.baseUrl);\n\n if (this.props.onError) {\n this.props.onError(error);\n }\n } catch {\n // Never crash the host app\n }\n }\n\n render(): React.ReactNode {\n if (this.state.hasError) {\n if (this.props.fallback) {\n return this.props.fallback;\n }\n\n // Re-render children — allows recovery from transient errors\n return this.props.children;\n }\n\n return this.props.children;\n }\n}\n","import type { Breadcrumb, BreadcrumbType } from \"./types\";\n\nconst MAX_DEFAULT = 50;\n\nlet breadcrumbs: Breadcrumb[] = [];\nlet maxBreadcrumbs = MAX_DEFAULT;\nlet initialized = false;\n\nexport function initBreadcrumbs(max?: number) {\n if (initialized) return;\n maxBreadcrumbs = max ?? MAX_DEFAULT;\n\n try {\n if (typeof window === \"undefined\") return;\n interceptConsole();\n interceptFetch();\n interceptNavigation();\n interceptClicks();\n initialized = true;\n } catch {\n // Never crash\n }\n}\n\nexport function addBreadcrumb(\n type: BreadcrumbType,\n message: string,\n data?: Record<string, string>\n) {\n try {\n breadcrumbs.push({\n type,\n message: message.slice(0, 200),\n timestamp: new Date().toISOString(),\n data,\n });\n if (breadcrumbs.length > maxBreadcrumbs) {\n breadcrumbs = breadcrumbs.slice(-maxBreadcrumbs);\n }\n } catch {\n // Never crash\n }\n}\n\nexport function getBreadcrumbs(): Breadcrumb[] {\n return [...breadcrumbs];\n}\n\nexport function clearBreadcrumbs() {\n breadcrumbs = [];\n}\n\n// ─── Console Interception ────────────────────────────────\n\nfunction interceptConsole() {\n const origLog = console.log;\n const origWarn = console.warn;\n const origError = console.error;\n\n console.log = function (...args: unknown[]) {\n addBreadcrumb(\"console\", `[log] ${argsToString(args)}`);\n origLog.apply(console, args);\n };\n\n console.warn = function (...args: unknown[]) {\n addBreadcrumb(\"console\", `[warn] ${argsToString(args)}`);\n origWarn.apply(console, args);\n };\n\n console.error = function (...args: unknown[]) {\n addBreadcrumb(\"console\", `[error] ${argsToString(args)}`);\n origError.apply(console, args);\n };\n}\n\nfunction argsToString(args: unknown[]): string {\n try {\n return args\n .map((a) => {\n if (typeof a === \"string\") return a;\n if (a instanceof Error) return a.message;\n try {\n return JSON.stringify(a);\n } catch {\n return String(a);\n }\n })\n .join(\" \")\n .slice(0, 200);\n } catch {\n return \"[unknown]\";\n }\n}\n\n// ─── Fetch Interception ──────────────────────────────────\n\nfunction interceptFetch() {\n const origFetch = window.fetch;\n\n (window.fetch as (input: RequestInfo | URL, init?: RequestInit) => Promise<Response>) = async function (input, init) {\n const url =\n typeof input === \"string\"\n ? input\n : input instanceof URL\n ? input.toString()\n : input instanceof Request\n ? input.url\n : String(input);\n const method = init?.method ?? \"GET\";\n const start = Date.now();\n\n try {\n const response = await origFetch(\n input as Parameters<typeof origFetch>[0],\n init,\n );\n addBreadcrumb(\"api\", `${method} ${url.slice(0, 100)} → ${response.status}`, {\n method,\n status: String(response.status),\n duration: `${Date.now() - start}ms`,\n });\n return response;\n } catch (err) {\n addBreadcrumb(\"api\", `${method} ${url.slice(0, 100)} → FAILED`, {\n method,\n error: err instanceof Error ? err.message : \"unknown\",\n duration: `${Date.now() - start}ms`,\n });\n throw err;\n }\n };\n}\n\n// ─── Navigation Interception ─────────────────────────────\n\nfunction interceptNavigation() {\n const origPush = history.pushState.bind(history);\n const origReplace = history.replaceState.bind(history);\n\n history.pushState = function (...args) {\n origPush(...args);\n addBreadcrumb(\"navigation\", `Navigate to ${window.location.pathname}`);\n };\n\n history.replaceState = function (...args) {\n origReplace(...args);\n addBreadcrumb(\"navigation\", `Replace to ${window.location.pathname}`);\n };\n\n window.addEventListener(\"popstate\", () => {\n addBreadcrumb(\"navigation\", `Back/Forward to ${window.location.pathname}`);\n });\n}\n\n// ─── Click Interception ──────────────────────────────────\n\nfunction interceptClicks() {\n document.addEventListener(\n \"click\",\n (e) => {\n try {\n const target = e.target as HTMLElement;\n const tag = target.tagName?.toLowerCase();\n const text = target.textContent?.trim().slice(0, 50) ?? \"\";\n const id = target.id ? `#${target.id}` : \"\";\n const cls = target.className && typeof target.className === \"string\"\n ? `.${target.className.split(\" \")[0]}`\n : \"\";\n\n addBreadcrumb(\"click\", `Click ${tag}${id}${cls} \"${text}\"`);\n } catch {\n // Never crash\n }\n },\n { capture: true }\n );\n}\n","import type { ReportPayload, ReportResult, CapturedContext, DeviceInfo } from \"./types\";\nimport { getBreadcrumbs } from \"./breadcrumbs\";\n\nconst SENSITIVE_PARAMS = [\n \"token\", \"key\", \"secret\", \"password\", \"passwd\", \"auth\", \"authorization\",\n \"session\", \"sessionid\", \"session_id\", \"api_key\", \"apikey\", \"access_token\",\n \"refresh_token\", \"client_secret\", \"code\", \"state\", \"nonce\", \"credential\", \"private\",\n];\n\nexport function sanitizeUrl(url: string): string {\n try {\n const parsed = new URL(url);\n const params = new URLSearchParams(parsed.search);\n let modified = false;\n for (const key of Array.from(params.keys())) {\n if (SENSITIVE_PARAMS.some((s) => key.toLowerCase().includes(s))) {\n params.set(key, \"[REDACTED]\");\n modified = true;\n }\n }\n if (modified) parsed.search = params.toString();\n return parsed.toString();\n } catch {\n return url.split(\"?\")[0] ?? url;\n }\n}\n\nexport function captureDeviceInfo(): DeviceInfo | null {\n try {\n if (typeof window === \"undefined\") return null;\n return {\n screenWidth: screen.width,\n screenHeight: screen.height,\n viewportWidth: window.innerWidth,\n viewportHeight: window.innerHeight,\n platform: navigator.platform ?? \"unknown\",\n language: navigator.language ?? \"unknown\",\n online: navigator.onLine,\n colorScheme: window.matchMedia(\"(prefers-color-scheme: dark)\").matches ? \"dark\" : \"light\",\n devicePixelRatio: window.devicePixelRatio ?? 1,\n };\n } catch {\n return null;\n }\n}\n\nexport function captureContext(visitedPages: string[]): CapturedContext {\n try {\n return {\n url: sanitizeUrl(typeof window !== \"undefined\" ? window.location.href : \"\"),\n userAgent: typeof navigator !== \"undefined\" ? navigator.userAgent : \"\",\n timestamp: new Date().toISOString(),\n visitedPages: visitedPages.map(sanitizeUrl),\n breadcrumbs: getBreadcrumbs(),\n deviceInfo: captureDeviceInfo(),\n };\n } catch {\n return {\n url: \"\",\n userAgent: \"\",\n timestamp: new Date().toISOString(),\n visitedPages: [],\n breadcrumbs: [],\n deviceInfo: null,\n };\n }\n}\n\nconst DEFAULT_BASE_URL = \"https://glitchgrab.dev\";\nconst MAX_RETRIES = 3;\nconst RETRY_BASE_MS = 500;\n\n/**\n * Send a report and return the result.\n * Never throws — returns null on failure.\n */\nexport async function sendReport(\n payload: ReportPayload,\n baseUrl?: string\n): Promise<ReportResult | null> {\n try {\n const url = `${baseUrl ?? DEFAULT_BASE_URL}/api/v1/sdk/report`;\n const body = JSON.stringify(payload);\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${payload.token}`,\n };\n\n // keepalive has a 64KB body limit in browsers — skip it for large payloads (e.g., screenshots)\n const useKeepalive = body.length < 60_000;\n\n for (let attempt = 0; attempt < MAX_RETRIES; attempt++) {\n try {\n const response = await fetch(url, {\n method: \"POST\",\n headers,\n body,\n ...(useKeepalive ? { keepalive: true } : {}),\n });\n\n if (response.ok) {\n const envelope = (await response.json()) as {\n success: boolean;\n data?: Omit<ReportResult, \"success\">;\n };\n return { success: envelope.success, ...(envelope.data ?? {}) };\n }\n\n if (response.status >= 400 && response.status < 500 && response.status !== 429) {\n return null;\n }\n } catch {\n // Will retry\n }\n\n if (attempt < MAX_RETRIES - 1) {\n await new Promise((resolve) =>\n setTimeout(resolve, RETRY_BASE_MS * Math.pow(2, attempt))\n );\n }\n }\n\n // Fallback: sendBeacon (fire-and-forget, no result)\n if (typeof navigator !== \"undefined\" && navigator.sendBeacon) {\n try {\n navigator.sendBeacon(url, new Blob([body], { type: \"application/json\" }));\n } catch {\n // Silently fail\n }\n }\n\n return null;\n } catch {\n return null;\n }\n}\n\nexport interface EnhanceContext {\n url?: string;\n visitedPages?: string[];\n breadcrumbs?: Array<{ type: string; message: string }>;\n}\n\n/**\n * Polish raw description text via the Glitchgrab AI enhance endpoint.\n * Returns the polished text on success, or the original text on any failure.\n * Never throws.\n */\nexport async function enhanceText(\n text: string,\n token: string,\n baseUrl?: string,\n screenshot?: string | null,\n context?: EnhanceContext | null\n): Promise<string> {\n try {\n const trimmed = text.trim();\n if (!trimmed) return text;\n const url = `${baseUrl ?? DEFAULT_BASE_URL}/api/v1/ai/enhance-text`;\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${token}`,\n },\n body: JSON.stringify({\n text: trimmed,\n ...(screenshot ? { screenshot } : {}),\n ...(context ? { context } : {}),\n }),\n });\n if (!response.ok) return text;\n const envelope = (await response.json()) as {\n success: boolean;\n data?: { text?: string };\n };\n if (envelope?.success && typeof envelope.data?.text === \"string\") {\n return envelope.data.text;\n }\n return text;\n } catch {\n return text;\n }\n}\n\n/**\n * Send an audio Blob to the Glitchgrab STT proxy (which calls Sarvam).\n * Returns the transcript string, or \"\" on any failure. Never throws.\n */\nexport async function transcribeAudio(\n blob: Blob,\n token: string,\n baseUrl?: string\n): Promise<string> {\n try {\n if (blob.size === 0) return \"\";\n const url = `${baseUrl ?? DEFAULT_BASE_URL}/api/v1/sdk/stt`;\n const form = new FormData();\n form.append(\"file\", blob, \"audio.webm\");\n const response = await fetch(url, {\n method: \"POST\",\n headers: { Authorization: `Bearer ${token}` },\n body: form,\n });\n if (!response.ok) return \"\";\n const envelope = (await response.json()) as {\n success: boolean;\n data?: { transcript?: string };\n };\n if (envelope?.success && typeof envelope.data?.transcript === \"string\") {\n return envelope.data.transcript;\n }\n return \"\";\n } catch {\n return \"\";\n }\n}\n","const DEFAULT_WINDOW_MS = 5 * 60 * 1000;\nconst MAX_ENTRIES = 100;\n\nconst seen = new Map<string, number>();\n\nfunction hashString(input: string): string {\n let h1 = 0xdeadbeef ^ 0;\n let h2 = 0x41c6ce57 ^ 0;\n for (let i = 0; i < input.length; i++) {\n const ch = input.charCodeAt(i);\n h1 = Math.imul(h1 ^ ch, 2654435761);\n h2 = Math.imul(h2 ^ ch, 1597334677);\n }\n h1 = Math.imul(h1 ^ (h1 >>> 16), 2246822507) ^ Math.imul(h2 ^ (h2 >>> 13), 3266489909);\n h2 = Math.imul(h2 ^ (h2 >>> 16), 2246822507) ^ Math.imul(h1 ^ (h1 >>> 13), 3266489909);\n return (4294967296 * (2097151 & h2) + (h1 >>> 0)).toString(36);\n}\n\nfunction topStackFrame(stack: string | undefined): string {\n if (!stack) return \"\";\n const lines = stack.split(\"\\n\");\n for (const line of lines) {\n const t = line.trim();\n if (t.startsWith(\"at \") || t.includes(\"@\")) {\n return t;\n }\n }\n return \"\";\n}\n\nfunction stripUrlQuery(url: string | undefined): string {\n if (!url) return \"\";\n try {\n const u = new URL(url);\n return `${u.origin}${u.pathname}`;\n } catch {\n const q = url.indexOf(\"?\");\n return q === -1 ? url : url.slice(0, q);\n }\n}\n\nexport function computeSignature(params: {\n errorMessage: string | undefined;\n pageUrl: string | undefined;\n errorStack?: string | undefined;\n}): string {\n const msg = params.errorMessage?.trim() ?? \"\";\n const page = stripUrlQuery(params.pageUrl);\n const frame = topStackFrame(params.errorStack);\n return hashString(`${msg}|${page}|${frame}`);\n}\n\nexport function shouldSkipDuplicate(\n signature: string,\n windowMs: number = DEFAULT_WINDOW_MS,\n now: number = Date.now()\n): boolean {\n const last = seen.get(signature);\n if (last !== undefined && now - last < windowMs) {\n return true;\n }\n seen.set(signature, now);\n\n if (seen.size > MAX_ENTRIES) {\n const cutoff = now - windowMs;\n for (const [sig, ts] of seen) {\n if (ts < cutoff) seen.delete(sig);\n }\n if (seen.size > MAX_ENTRIES) {\n const excess = seen.size - MAX_ENTRIES;\n const keys = Array.from(seen.keys()).slice(0, excess);\n for (const k of keys) seen.delete(k);\n }\n }\n return false;\n}\n\nexport function clearDedupCache(): void {\n seen.clear();\n}\n","\"use client\";\n\nimport {\n useState,\n useRef,\n useEffect,\n type CSSProperties,\n type ReactNode,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { AnnotationCanvas } from \"./annotation-canvas\";\nimport { getShortcutLabel } from \"./shortcut\";\nimport type { ReportType, ReportSeverity, UseGlitchgrabReturn } from \"./types\";\n\n/** Detect if the host page uses a dark or light theme */\nfunction useIsDark(): boolean {\n if (typeof window === \"undefined\") return true;\n try {\n // Check body then html — most sites set background on html, not body\n for (const el of [document.body, document.documentElement]) {\n const bg = getComputedStyle(el).backgroundColor;\n const match = bg.match(\n /rgba?\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)(?:\\s*,\\s*([\\d.]+))?\\s*\\)/,\n );\n if (match) {\n const alpha = match[4] !== undefined ? parseFloat(match[4]) : 1;\n if (alpha < 0.05) continue; // transparent — skip to next element\n const [r, g, b] = [\n Number(match[1]),\n Number(match[2]),\n Number(match[3]),\n ];\n return (r * 299 + g * 587 + b * 114) / 1000 < 128;\n }\n }\n return window.matchMedia(\"(prefers-color-scheme: dark)\").matches;\n } catch {\n return true;\n }\n}\n\n/** Convert HSL values to a hex color string */\nfunction hslToHex(h: number, s: number, l: number): string {\n s /= 100;\n l /= 100;\n const a = s * Math.min(l, 1 - l);\n const f = (n: number) => {\n const k = (n + h / 30) % 12;\n const color = l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);\n return Math.round(255 * color)\n .toString(16)\n .padStart(2, \"0\");\n };\n return `#${f(0)}${f(8)}${f(4)}`;\n}\n\n/** Parse a CSS color value into [r, g, b] or null */\nfunction parseColorToRgb(value: string): [number, number, number] | null {\n try {\n const trimmed = value.trim();\n\n // hex (#fff, #ffffff)\n const hexMatch = trimmed.match(/^#([0-9a-f]{3,8})$/i);\n if (hexMatch) {\n let hex = hexMatch[1];\n if (hex.length === 3)\n hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2];\n return [\n parseInt(hex.slice(0, 2), 16),\n parseInt(hex.slice(2, 4), 16),\n parseInt(hex.slice(4, 6), 16),\n ];\n }\n\n // rgb(r, g, b) or rgba(r, g, b, a)\n const rgbMatch = trimmed.match(/rgba?\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)/);\n if (rgbMatch)\n return [Number(rgbMatch[1]), Number(rgbMatch[2]), Number(rgbMatch[3])];\n\n // hsl(h, s%, l%) or hsla(h, s%, l%, a)\n const hslMatch = trimmed.match(\n /hsla?\\(\\s*([\\d.]+)\\s*,\\s*([\\d.]+)%\\s*,\\s*([\\d.]+)%/,\n );\n if (hslMatch) {\n const hex = hslToHex(\n Number(hslMatch[1]),\n Number(hslMatch[2]),\n Number(hslMatch[3]),\n );\n return parseColorToRgb(hex);\n }\n\n return null;\n } catch {\n return null;\n }\n}\n\n/** Compute relative luminance and return ideal contrast text color */\nfunction getContrastText(r: number, g: number, b: number): string {\n const luminance = (r * 299 + g * 587 + b * 114) / 1000;\n return luminance > 150 ? \"#09090b\" : \"#ffffff\";\n}\n\n/**\n * Auto-detect the host app's primary/accent color from CSS custom properties.\n * Checks common variable names used by shadcn/ui, Radix, Tailwind, MUI, etc.\n * Returns { accent, accentText } or null if no theme detected.\n */\nfunction detectHostAccent(): { accent: string; accentText: string } | null {\n if (typeof window === \"undefined\") return null;\n try {\n const root = getComputedStyle(document.documentElement);\n\n // Common CSS variable names for primary/accent color\n const varNames = [\n \"--primary\",\n \"--accent\",\n \"--brand\",\n \"--color-primary\",\n \"--theme-primary\",\n \"--chakra-colors-primary-500\",\n \"--mui-palette-primary-main\",\n ];\n\n for (const name of varNames) {\n const raw = root.getPropertyValue(name).trim();\n if (!raw) continue;\n\n // shadcn/ui style: space-separated HSL values like \"243 75% 59%\"\n const hslSpaceMatch = raw.match(/^([\\d.]+)\\s+([\\d.]+)%\\s+([\\d.]+)%$/);\n if (hslSpaceMatch) {\n const hex = hslToHex(\n Number(hslSpaceMatch[1]),\n Number(hslSpaceMatch[2]),\n Number(hslSpaceMatch[3]),\n );\n const rgb = parseColorToRgb(hex);\n return {\n accent: hex,\n accentText: rgb ? getContrastText(...rgb) : \"#ffffff\",\n };\n }\n\n // Standard color values (hex, rgb, hsl)\n const rgb = parseColorToRgb(raw);\n if (rgb) {\n const hex = `#${rgb.map((c) => c.toString(16).padStart(2, \"0\")).join(\"\")}`;\n return { accent: hex, accentText: getContrastText(...rgb) };\n }\n }\n\n return null;\n } catch {\n return null;\n }\n}\n\nfunction getTheme(dark: boolean) {\n const hostAccent = detectHostAccent();\n const defaults = dark\n ? {\n bg: \"#1c1c1e\",\n bgSecondary: \"#27272a\",\n border: \"#2c2c2e\",\n text: \"#fafafa\",\n textMuted: \"#a1a1aa\",\n accent: \"#22d3ee\",\n accentText: \"#09090b\",\n inputBg: \"#27272a\",\n inputBorder: \"#3f3f46\",\n }\n : {\n bg: \"#ffffff\",\n bgSecondary: \"#f4f4f5\",\n border: \"#e4e4e7\",\n text: \"#18181b\",\n textMuted: \"#71717a\",\n accent: \"#0891b2\",\n accentText: \"#ffffff\",\n inputBg: \"#fafafa\",\n inputBorder: \"#d4d4d8\",\n };\n\n if (hostAccent) {\n defaults.accent = hostAccent.accent;\n defaults.accentText = hostAccent.accentText;\n }\n\n return defaults;\n}\n\n/** Validate that report text is meaningful — rejects gibberish, throwaway words, random chars */\nfunction isLowQualityText(text: string): string | null {\n const trimmed = text.trim();\n if (!trimmed) return null;\n\n // Exact throwaway words\n const throwaway =\n /^(done|ok|yes|no|hi|hello|hey|test|testing|asdf|qwerty|abc|xyz|foo|bar|baz|lol|lmao|idk|bruh|nice|cool|wow|sup|yo|nah|yep|nope|thanks|thx|ty|k|kk|hmm|hm|na|mm|mhm|aight|bet|gg|wp|rip|omg|pls|plz)$/i;\n if (throwaway.test(trimmed)) {\n return \"Please describe the actual issue you're experiencing\";\n }\n\n // Repeated characters (aaaaaaa, !!!!!!!)\n if (/(.)\\1{4,}/.test(trimmed)) {\n return \"Please provide a meaningful description\";\n }\n\n const letters = trimmed.replace(/[^a-zA-Z]/g, \"\");\n if (letters.length >= 4) {\n // Very low vowel ratio (bkdfghjklmn...)\n const vowels = letters.replace(/[^aeiouAEIOU]/g, \"\").length;\n const vowelRatio = vowels / letters.length;\n if (vowelRatio < 0.08) {\n return \"That doesn't look like a valid description\";\n }\n\n // Keyboard mashing: single word with no real English pattern\n // Detects strings like \"asdfasfsdad\", \"jkljklfsdf\", \"qwertyuio\"\n // Real words have max 3-4 consecutive consonants; gibberish has long runs\n if (/[^aeiou\\s]{5,}/i.test(letters)) {\n const words = trimmed.split(/\\s+/);\n // Only flag if it's a single \"word\" — multi-word text is likely real\n if (words.length <= 2) {\n return \"That doesn't look like a valid description\";\n }\n }\n\n // Check if it looks like a random permutation of a few chars (asdfasfsdad)\n if (letters.length >= 6) {\n const uniqueChars = new Set(letters.toLowerCase()).size;\n const uniqueRatio = uniqueChars / letters.length;\n // Real English has ~0.6-0.9 unique ratio for short text; gibberish reuses few chars\n if (uniqueRatio < 0.4 && trimmed.split(/\\s+/).length <= 2) {\n return \"That doesn't look like a valid description\";\n }\n }\n }\n\n // Single short word that isn't a known tech term\n const words = trimmed.split(/\\s+/).filter((w) => w.length > 0);\n if (words.length === 1 && trimmed.length < 10) {\n const techTerms =\n /^(crash|error|bug|fail|broken|slow|freeze|lag|404|500|null|undefined|nan|timeout|overflow|leak|cors|oom)$/i;\n if (!techTerms.test(trimmed)) {\n return \"Please provide more detail about the issue\";\n }\n }\n\n return null;\n}\n\ninterface ReportDialogProps {\n report: UseGlitchgrabReturn[\"report\"];\n enhanceText?: UseGlitchgrabReturn[\"enhanceText\"];\n transcribeAudio?: (blob: Blob) => Promise<string>;\n types?: ReportType[];\n showSeverity?: boolean;\n}\n\n/**\n * The report dialog — rendered inside GlitchgrabProvider automatically.\n * Opens via the `glitchgrab:open-report` custom event (triggered by `openReportDialog()`).\n */\nexport function ReportDialog({\n report,\n enhanceText,\n transcribeAudio,\n types,\n showSeverity = true,\n}: ReportDialogProps) {\n const [isEnhancing, setIsEnhancing] = useState(false);\n const [isEnhanced, setIsEnhanced] = useState(false);\n const [originalDescription, setOriginalDescription] = useState<string | null>(\n null,\n );\n const [isListening, setIsListening] = useState(false);\n const [isTranscribing, setIsTranscribing] = useState(false);\n const [voiceError, setVoiceError] = useState<string | null>(null);\n const [screenshotDragOver, setScreenshotDragOver] = useState(false);\n // Prevent hydration mismatch — render nothing until after hydration\n const [mounted, setMounted] = useState(false);\n useEffect(() => {\n setMounted(true);\n }, []);\n\n const [isOpen, setIsOpen] = useState(false);\n const [description, setDescription] = useState(\"\");\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [submitted, setSubmitted] = useState(false);\n const [screenshots, setScreenshots] = useState<string[]>([]);\n const [previewIndex, setPreviewIndex] = useState<number | null>(null);\n const [annotatingIndex, setAnnotatingIndex] = useState<number | null>(null);\n const fileInputRef = useRef<HTMLInputElement>(null);\n const modalRef = useRef<HTMLDivElement>(null);\n const previewImgRef = useRef<HTMLDivElement>(null);\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const recognitionRef = useRef<any>(null);\n const voiceBaseRef = useRef(\"\");\n const usingWebSpeechRef = useRef(false);\n const textBeforeVoiceRef = useRef(\"\");\n const mediaRecorderRef = useRef<MediaRecorder | null>(null);\n const streamRef = useRef<MediaStream | null>(null);\n const sarvamChunksRef = useRef<Blob[]>([]);\n const spaceTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const isPushToTalkRef = useRef(false);\n\n // When open, set inert on any host Radix/shadcn dialogs so their FocusScope\n // doesn't steal focus back from GlitchGrab's textarea via focusout interception.\n useEffect(() => {\n if (!isOpen) return;\n const dialogs = Array.from(\n document.querySelectorAll<HTMLElement>(\n '[role=\"dialog\"][data-state=\"open\"]',\n ),\n );\n dialogs.forEach((d) => d.setAttribute(\"inert\", \"\"));\n return () => dialogs.forEach((d) => d.removeAttribute(\"inert\"));\n }, [isOpen]);\n\n // Stepper state\n const [step, setStep] = useState<1 | 2>(1);\n const [reportType, setReportType] = useState<ReportType>(\"BUG\");\n const [severity, setSeverity] = useState<ReportSeverity>(\"medium\");\n const [validationError, setValidationError] = useState<string | null>(null);\n const [placeholderIdx, setPlaceholderIdx] = useState(0);\n\n const availableTypes: ReportType[] = types ?? [\n \"BUG\",\n \"FEATURE_REQUEST\",\n \"UI_IMPROVEMENT\",\n \"PERFORMANCE\",\n \"SECURITY\",\n \"QUESTION\",\n \"OTHER\",\n ];\n\n const isDark = useIsDark();\n const t = getTheme(isDark);\n\n const handleFileUpload = (e: React.ChangeEvent<HTMLInputElement>) => {\n const files = e.target.files;\n if (!files || files.length === 0) return;\n Array.from(files).forEach((file) => {\n const reader = new FileReader();\n reader.onload = () => {\n setScreenshots((prev) => [...prev, reader.result as string]);\n };\n reader.readAsDataURL(file);\n });\n e.target.value = \"\";\n };\n\n const retakeScreenshot = async () => {\n setPreviewIndex(null);\n setIsOpen(false);\n setScreenshots([]);\n await new Promise((r) => setTimeout(r, 300));\n try {\n const { default: html2canvas } = await import(\"html2canvas-pro\");\n const canvas = await html2canvas(document.body, {\n scale: 0.5,\n logging: false,\n useCORS: true,\n allowTaint: true,\n x: window.scrollX,\n y: window.scrollY,\n width: window.innerWidth,\n height: window.innerHeight,\n windowWidth: window.innerWidth,\n windowHeight: window.innerHeight,\n });\n setScreenshots([canvas.toDataURL(\"image/jpeg\", 0.6)]);\n } catch {\n // silently fail\n }\n setIsOpen(true);\n };\n\n const handleOpen = async () => {\n setSubmitted(false);\n if (availableTypes.length === 1) {\n setReportType(availableTypes[0]);\n setStep(2);\n }\n try {\n const { default: html2canvas } = await import(\"html2canvas-pro\");\n const canvas = await html2canvas(document.body, {\n scale: 0.5,\n logging: false,\n useCORS: true,\n allowTaint: true,\n x: window.scrollX,\n y: window.scrollY,\n width: window.innerWidth,\n height: window.innerHeight,\n windowWidth: window.innerWidth,\n windowHeight: window.innerHeight,\n });\n setScreenshots([canvas.toDataURL(\"image/jpeg\", 0.6)]);\n } catch {\n // screenshot failed — open without it\n }\n setIsOpen(true);\n };\n\n // Listen for programmatic open via openReportDialog()\n useEffect(() => {\n const handler = (e: Event) => {\n if (isOpen) return;\n const detail = (e as CustomEvent).detail;\n if (detail?.description) setDescription(detail.description);\n if (detail?.type) {\n setReportType(detail.type);\n setStep(2);\n }\n handleOpen();\n };\n window.addEventListener(\"glitchgrab:open-report\", handler);\n return () => window.removeEventListener(\"glitchgrab:open-report\", handler);\n }, [isOpen, handleOpen]);\n\n // Close on Escape\n useEffect(() => {\n if (!isOpen) return;\n const handleEsc = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n if (previewIndex !== null) setPreviewIndex(null);\n else handleClose();\n }\n };\n document.addEventListener(\"keydown\", handleEsc);\n return () => document.removeEventListener(\"keydown\", handleEsc);\n }, [isOpen, previewIndex]);\n\n // Close screenshot preview on outside click. Registered in the CAPTURE phase\n // so it fires before the host page's own outside-click handlers (e.g. Radix\n // DismissableLayer) can stop the event from ever bubbling to our onClick.\n useEffect(() => {\n if (previewIndex === null || annotatingIndex !== null) return;\n const handlePointerDown = (e: PointerEvent) => {\n if (!previewImgRef.current?.contains(e.target as Node)) {\n setPreviewIndex(null);\n }\n };\n document.addEventListener(\"pointerdown\", handlePointerDown, true);\n return () =>\n document.removeEventListener(\"pointerdown\", handlePointerDown, true);\n }, [previewIndex, annotatingIndex]);\n\n // Paste image from clipboard (Cmd+V / Ctrl+V) when dialog is open\n useEffect(() => {\n if (!isOpen) return;\n const handlePaste = (e: ClipboardEvent) => {\n try {\n const items = e.clipboardData?.items;\n if (!items) return;\n let matched = false;\n for (let i = 0; i < items.length; i++) {\n if (items[i].type.startsWith(\"image/\")) {\n const file = items[i].getAsFile();\n if (!file) continue;\n matched = true;\n const reader = new FileReader();\n reader.onload = () =>\n setScreenshots((prev) => [...prev, reader.result as string]);\n reader.readAsDataURL(file);\n }\n }\n if (matched) e.preventDefault();\n } catch {\n // silently fail\n }\n };\n window.addEventListener(\"paste\", handlePaste);\n return () => window.removeEventListener(\"paste\", handlePaste);\n }, [isOpen]);\n\n useEffect(() => {\n if (!isOpen || !transcribeAudio) return;\n const id = setInterval(() => {\n setPlaceholderIdx((i) => (i + 1) % 2);\n }, 3000);\n return () => clearInterval(id);\n }, [isOpen, transcribeAudio]);\n\n const stopVoice = () => {\n usingWebSpeechRef.current = false;\n recognitionRef.current?.stop();\n recognitionRef.current = null;\n sarvamChunksRef.current = [];\n const stream = streamRef.current;\n streamRef.current = null;\n stream?.getTracks().forEach((t) => t.stop());\n try { mediaRecorderRef.current?.stop(); } catch { /* ignore */ }\n mediaRecorderRef.current = null;\n setIsListening(false);\n setIsTranscribing(false);\n };\n\n const stopListeningAndTranscribe = () => {\n usingWebSpeechRef.current = false;\n recognitionRef.current?.stop();\n recognitionRef.current = null;\n setIsListening(false);\n try { mediaRecorderRef.current?.stop(); } catch { /* ignore */ }\n };\n\n const handleClose = () => {\n stopVoice();\n setIsOpen(false);\n setStep(1);\n setReportType(\"BUG\");\n setSeverity(\"medium\");\n setValidationError(null);\n setVoiceError(null);\n setIsEnhanced(false);\n setOriginalDescription(null);\n };\n\n const toggleVoice = async () => {\n if (isListening) {\n stopListeningAndTranscribe();\n return;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const SpeechRec: (new () => any) | undefined = (typeof window !== \"undefined\")\n ? ((window as any).SpeechRecognition || (window as any).webkitSpeechRecognition)\n : undefined;\n\n // Get mic stream for MediaRecorder (Sarvam final accurate result)\n let stream: MediaStream | null = null;\n try {\n stream = await navigator.mediaDevices.getUserMedia({ audio: true });\n } catch (err) {\n const isDenied = err instanceof DOMException && (err.name === \"NotAllowedError\" || err.name === \"PermissionDeniedError\");\n if (!SpeechRec || isDenied) { setVoiceError(\"Microphone access denied\"); return; }\n }\n\n if (stream && transcribeAudio) {\n streamRef.current = stream;\n sarvamChunksRef.current = [];\n textBeforeVoiceRef.current = description;\n\n const rec = new MediaRecorder(stream);\n mediaRecorderRef.current = rec;\n rec.ondataavailable = (e) => { if (e.data.size > 0) sarvamChunksRef.current.push(e.data); };\n rec.onstop = async () => {\n stream!.getTracks().forEach((t) => t.stop());\n if (streamRef.current === stream) streamRef.current = null;\n mediaRecorderRef.current = null;\n const chunks = sarvamChunksRef.current;\n sarvamChunksRef.current = [];\n if (!chunks.length || !transcribeAudio) return;\n setIsTranscribing(true);\n try {\n const blob = new Blob(chunks, { type: rec.mimeType || \"audio/webm\" });\n const text = await transcribeAudio(blob);\n if (text.trim()) {\n const sep = textBeforeVoiceRef.current.trim() ? \" \" : \"\";\n // Replace live Web Speech preview with accurate Sarvam result\n setDescription(textBeforeVoiceRef.current + sep + text.trim());\n setValidationError(null);\n setIsEnhanced(false);\n setOriginalDescription(null);\n }\n } catch { /* keep Web Speech result on failure */ }\n setIsTranscribing(false);\n };\n rec.start();\n }\n\n if (SpeechRec) {\n setVoiceError(null);\n usingWebSpeechRef.current = true;\n voiceBaseRef.current = description;\n textBeforeVoiceRef.current = description;\n const recognition = new SpeechRec();\n recognition.lang = \"en-IN\";\n recognition.interimResults = true;\n recognition.continuous = true;\n recognitionRef.current = recognition;\n\n recognition.onstart = () => setIsListening(true);\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n recognition.onresult = (event: any) => {\n let finalText = \"\";\n let interimText = \"\";\n for (let i = event.resultIndex; i < event.results.length; i++) {\n const text = event.results[i][0].transcript;\n if (event.results[i].isFinal) finalText += text;\n else interimText += text;\n }\n if (finalText) {\n const sep = voiceBaseRef.current.trim() ? \" \" : \"\";\n voiceBaseRef.current += sep + finalText.trim();\n }\n const liveText = interimText\n ? voiceBaseRef.current + (voiceBaseRef.current.trim() ? \" \" : \"\") + interimText\n : voiceBaseRef.current;\n setDescription(liveText);\n setValidationError(null);\n };\n\n recognition.onend = () => {\n if (usingWebSpeechRef.current && recognitionRef.current === recognition) {\n try { recognition.start(); } catch { /* ignore */ }\n } else {\n setIsListening(false);\n }\n };\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n recognition.onerror = (event: any) => {\n if (event.error === \"aborted\" || event.error === \"no-speech\") return;\n const isDenied = event.error === \"not-allowed\" || event.error === \"audio-capture\";\n setVoiceError(isDenied ? \"Microphone access denied\" : \"Speech recognition not available — try Chrome\");\n usingWebSpeechRef.current = false;\n recognitionRef.current = null;\n setIsListening(false);\n };\n\n recognition.start();\n } else if (stream) {\n // Firefox: Sarvam-only, no live preview\n setVoiceError(null);\n setIsListening(true);\n }\n };\n\n const handleSpaceDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.code !== \"Space\") return;\n // Recording or already-committed to push-to-talk — swallow the space\n if (isListening || isPushToTalkRef.current) {\n e.preventDefault();\n return;\n }\n // Auto-repeat from a held key, or a timer already pending — let the browser\n // type normally; we only care about the first keydown of a hold.\n if (e.repeat || !transcribeAudio || isTranscribing || spaceTimerRef.current)\n return;\n\n // Don't preventDefault: let the browser insert the space natively so the\n // cursor stays exactly where the user typed it. If the hold matures into\n // push-to-talk, strip that space back out below.\n const pos = e.currentTarget.selectionStart ?? description.length;\n spaceTimerRef.current = setTimeout(() => {\n spaceTimerRef.current = null;\n isPushToTalkRef.current = true;\n setDescription((prev) =>\n prev[pos] === \" \" ? prev.slice(0, pos) + prev.slice(pos + 1) : prev,\n );\n requestAnimationFrame(() => {\n if (textareaRef.current) {\n textareaRef.current.selectionStart = pos;\n textareaRef.current.selectionEnd = pos;\n }\n });\n void toggleVoice();\n }, 400);\n };\n\n const handleSpaceUp = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.code !== \"Space\") return;\n if (spaceTimerRef.current) {\n // Quick tap — space was already typed natively, nothing to do.\n clearTimeout(spaceTimerRef.current);\n spaceTimerRef.current = null;\n }\n if (isPushToTalkRef.current) {\n isPushToTalkRef.current = false;\n stopListeningAndTranscribe();\n }\n };\n\n const handleSubmit = async () => {\n try {\n if (!description.trim() || isSubmitting) return;\n\n const qualityError = isLowQualityText(description);\n if (qualityError) {\n setValidationError(qualityError);\n setStep(2);\n return;\n }\n\n setIsSubmitting(true);\n const metadata: Record<string, string> = {};\n if (screenshots.length > 0) metadata.screenshots = JSON.stringify(screenshots);\n if (showSeverity && reportType === \"BUG\") {\n metadata.severity = severity;\n }\n\n const result = await report(\n reportType,\n description.trim(),\n Object.keys(metadata).length > 0 ? metadata : undefined,\n );\n\n if (result) {\n setSubmitted(true);\n setDescription(\"\");\n setScreenshots([]);\n\n setTimeout(() => {\n setSubmitted(false);\n handleClose();\n }, 2000);\n }\n setIsSubmitting(false);\n } catch {\n setIsSubmitting(false);\n }\n };\n\n if (!mounted) return null;\n\n return (\n <>\n {/* Keyframes for REC pulse — injected once when open */}\n {isOpen &&\n createPortal(\n <style>{`\n @keyframes gg-pulse{0%,100%{opacity:1}50%{opacity:0.35}}\n @keyframes gg-b1{0%,100%{height:3px}40%{height:13px}}\n @keyframes gg-b2{0%,100%{height:8px}50%{height:3px}}\n @keyframes gg-b3{0%,100%{height:4px}30%{height:14px}70%{height:5px}}\n @keyframes gg-b4{0%,100%{height:6px}60%{height:13px}}\n @keyframes gg-bug-crawl{0%,100%{transform:translateX(0) rotate(0deg)}20%{transform:translateX(-1.5px) rotate(-6deg)}40%{transform:translateX(1.5px) rotate(5deg)}60%{transform:translateX(-1px) rotate(-4deg)}80%{transform:translateX(1px) rotate(3deg)}}\n @keyframes gg-star-spin{0%,100%{transform:scale(1) rotate(0deg)}50%{transform:scale(1.15) rotate(15deg)}}\n @keyframes gg-ui-grow{0%,100%{transform:scaleY(1)}50%{transform:scaleY(1.12)}}\n @keyframes gg-perf-sweep{0%,100%{transform:rotate(0deg)}30%{transform:rotate(-12deg)}70%{transform:rotate(10deg)}}\n @keyframes gg-shield-pulse{0%,100%{transform:scale(1);opacity:1}50%{transform:scale(1.08);opacity:.75}}\n @keyframes gg-question-shake{0%,100%{transform:rotate(0deg)}25%{transform:rotate(-7deg)}75%{transform:rotate(7deg)}}\n @keyframes gg-chat-tilt{0%,100%{transform:rotate(0deg) translateY(0)}50%{transform:rotate(-6deg) translateY(-2px)}}\n button[data-gg-type] > svg{transform-origin:center}\n button[data-gg-type=\"BUG\"] > svg{animation:gg-bug-crawl 2.2s ease-in-out infinite}\n button[data-gg-type=\"FEATURE_REQUEST\"] > svg{animation:gg-star-spin 2.6s ease-in-out infinite}\n button[data-gg-type=\"UI_IMPROVEMENT\"] > svg{animation:gg-ui-grow 1.8s ease-in-out infinite;transform-origin:bottom}\n button[data-gg-type=\"PERFORMANCE\"] > svg{animation:gg-perf-sweep 2.4s ease-in-out infinite}\n button[data-gg-type=\"SECURITY\"] > svg{animation:gg-shield-pulse 2.2s ease-in-out infinite;transform-origin:top}\n button[data-gg-type=\"QUESTION\"] > svg{animation:gg-question-shake 2s ease-in-out infinite}\n button[data-gg-type=\"OTHER\"] > svg{animation:gg-chat-tilt 2.2s ease-in-out infinite}\n `}</style>,\n document.body,\n )}\n {/* Report modal */}\n {isOpen &&\n createPortal(\n <div\n style={{\n position: \"fixed\",\n inset: 0,\n zIndex: 2147483647,\n pointerEvents: \"auto\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n backgroundColor: \"rgba(0,0,0,0.5)\",\n fontFamily:\n '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n }}\n onClick={() => {\n if (previewIndex === null) handleClose();\n }}\n onPointerDown={(e) => e.stopPropagation()}\n onFocus={(e) => e.stopPropagation()}\n >\n <div\n ref={modalRef}\n onClick={(e) => e.stopPropagation()}\n style={{\n position: \"relative\",\n zIndex: 2147483647,\n width: \"340px\",\n maxWidth: \"calc(100% - 32px)\",\n maxHeight: \"calc(100dvh - 32px)\",\n display: \"flex\",\n flexDirection: \"column\",\n backgroundColor: t.bg,\n borderRadius: \"12px\",\n boxShadow:\n \"0 20px 60px rgba(0, 0, 0, 0.2), 0 4px 16px rgba(0, 0, 0, 0.1)\",\n fontFamily:\n '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n overflow: \"hidden\",\n color: t.text,\n isolation: \"isolate\",\n }}\n >\n {/* Header */}\n <div\n style={{\n flexShrink: 0,\n padding: \"16px 16px 12px\",\n borderBottom: `1px solid ${t.border}`,\n }}\n >\n <div\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"8px\",\n }}\n >\n {step > 1 && (\n <button\n type=\"button\"\n onClick={() => setStep((s) => (s - 1) as 1 | 2)}\n style={{\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n padding: \"2px\",\n display: \"flex\",\n alignItems: \"center\",\n }}\n aria-label=\"Back\"\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n >\n <path\n d=\"M10 3L5 8L10 13\"\n stroke={t.textMuted}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n )}\n <span\n style={{\n fontSize: \"15px\",\n fontWeight: 600,\n color: t.text,\n }}\n >\n {step === 1 ? \"What's on your mind?\" : \"Tell us more\"}\n </span>\n </div>\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"8px\",\n }}\n >\n {step === 1 && (\n <span\n title=\"Press this anywhere to open Glitchgrab\"\n style={{\n fontSize: \"10px\",\n fontWeight: 600,\n lineHeight: 1,\n padding: \"3px 6px\",\n borderRadius: \"4px\",\n border: `1px solid ${t.inputBorder}`,\n background: t.inputBg,\n color: t.textMuted,\n whiteSpace: \"nowrap\",\n }}\n >\n {getShortcutLabel()}\n </span>\n )}\n <button\n type=\"button\"\n onClick={handleClose}\n style={{\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n padding: \"4px\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n aria-label=\"Close\"\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n style={{ display: \"block\" }}\n >\n <path\n d=\"M4 4L12 12M12 4L4 12\"\n stroke={t.textMuted}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n </svg>\n </button>\n </div>\n </div>\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: \"0\",\n marginTop: \"12px\",\n }}\n >\n {[1, 2].map((s, i) => (\n <div\n key={s}\n style={{ display: \"flex\", alignItems: \"center\" }}\n >\n <div\n style={{\n width: \"8px\",\n height: \"8px\",\n borderRadius: \"50%\",\n backgroundColor: s <= step ? t.accent : t.inputBorder,\n transition: \"background-color 0.2s ease\",\n }}\n />\n {i < 1 && (\n <div\n style={{\n width: \"40px\",\n height: \"2px\",\n backgroundColor:\n s < step ? t.accent : t.inputBorder,\n transition: \"background-color 0.2s ease\",\n }}\n />\n )}\n </div>\n ))}\n </div>\n </div>\n\n {/* Body */}\n <div\n style={{\n padding: \"16px\",\n overflowY: \"auto\",\n flex: \"1 1 auto\",\n minHeight: 0,\n }}\n >\n {submitted ? (\n <div\n style={{\n textAlign: \"center\",\n padding: \"20px 0\",\n color: t.accent,\n fontSize: \"14px\",\n fontWeight: 500,\n }}\n >\n {getTypeLabel(reportType)} sent. Thank you!\n </div>\n ) : (\n <>\n {/* Step 1: Category */}\n {step === 1 && (\n <div\n style={{\n display: \"grid\",\n gridTemplateColumns: \"1fr 1fr\",\n gap: \"8px\",\n }}\n >\n {availableTypes.map((type) => (\n <button\n key={type}\n type=\"button\"\n data-gg-type={type}\n onClick={() => {\n setReportType(type);\n setStep(2);\n }}\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n gap: \"8px\",\n padding: \"16px 8px\",\n borderRadius: \"8px\",\n border: `1px solid ${t.inputBorder}`,\n background: t.inputBg,\n cursor: \"pointer\",\n color: t.text,\n fontFamily: \"inherit\",\n transition: \"border-color 0.15s ease\",\n }}\n onMouseEnter={(e) => {\n (\n e.currentTarget as HTMLElement\n ).style.borderColor = t.accent;\n }}\n onMouseLeave={(e) => {\n (\n e.currentTarget as HTMLElement\n ).style.borderColor = t.inputBorder;\n }}\n >\n {getTypeIcon(type, t.accent)}\n <span style={{ fontSize: \"13px\", fontWeight: 600 }}>\n {getTypeLabel(type)}\n </span>\n <span\n style={{\n fontSize: \"11px\",\n color: t.textMuted,\n lineHeight: \"1.3\",\n }}\n >\n {getTypeSubtitle(type)}\n </span>\n </button>\n ))}\n </div>\n )}\n\n {/* Step 2: Details */}\n {step === 2 && (\n <>\n <div style={{ position: \"relative\" }}>\n <textarea\n ref={textareaRef}\n value={description}\n onChange={(e) => {\n setDescription(e.target.value);\n if (validationError) setValidationError(null);\n if (isEnhanced) {\n setIsEnhanced(false);\n setOriginalDescription(null);\n }\n }}\n placeholder={\n isTranscribing\n ? \"Transcribing your speech…\"\n : isListening\n ? \"Listening… speak now\"\n : getPlaceholder(reportType, placeholderIdx, !!transcribeAudio)\n }\n style={{\n width: \"100%\",\n minHeight: \"100px\",\n padding: enhanceText\n ? \"28px 12px 36px\"\n : transcribeAudio\n ? \"10px 12px 36px\"\n : \"10px 12px\",\n borderRadius: \"8px\",\n border: `1px solid ${isTranscribing ? \"#f59e0b\" : isListening ? t.accent : t.inputBorder}`,\n fontSize: \"14px\",\n fontFamily: \"inherit\",\n resize: \"none\",\n outline: \"none\",\n boxSizing: \"border-box\",\n color: t.text,\n backgroundColor: t.inputBg,\n transition: \"border-color 0.2s ease\",\n }}\n onKeyDown={handleSpaceDown}\n onKeyUp={handleSpaceUp}\n onFocus={(e) => {\n (\n e.target as HTMLTextAreaElement\n ).style.borderColor = t.accent;\n }}\n onBlur={(e) => {\n if (!isListening && !isTranscribing)\n (\n e.target as HTMLTextAreaElement\n ).style.borderColor = t.inputBorder;\n }}\n autoFocus\n />\n {/* Bottom-left: REC / Transcribing badge (same row as mic button) */}\n {(isListening || isTranscribing) && (\n <span\n style={{\n position: \"absolute\",\n bottom: \"10px\",\n left: \"10px\",\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"4px\",\n fontSize: \"10px\",\n fontWeight: 700,\n letterSpacing: \"0.04em\",\n color: isTranscribing ? \"#f59e0b\" : \"#ef4444\",\n pointerEvents: \"none\",\n zIndex: 1,\n }}\n >\n <span\n style={{\n width: \"6px\",\n height: \"6px\",\n borderRadius: \"50%\",\n backgroundColor: \"currentColor\",\n animation:\n \"gg-pulse 1.2s ease-in-out infinite\",\n display: \"inline-block\",\n flexShrink: 0,\n }}\n />\n {isTranscribing ? \"Transcribing…\" : \"REC\"}\n {isListening && !isTranscribing && (\n <span\n style={{\n display: \"inline-flex\",\n alignItems: \"flex-end\",\n gap: \"2px\",\n height: \"14px\",\n marginLeft: \"3px\",\n }}\n >\n {[\n { anim: \"gg-b1\", dur: \"0.6s\", delay: \"0s\" },\n {\n anim: \"gg-b2\",\n dur: \"0.5s\",\n delay: \"0.1s\",\n },\n {\n anim: \"gg-b3\",\n dur: \"0.7s\",\n delay: \"0.05s\",\n },\n {\n anim: \"gg-b4\",\n dur: \"0.55s\",\n delay: \"0.15s\",\n },\n ].map((b, i) => (\n <span\n key={i}\n style={{\n width: \"2.5px\",\n height: \"4px\",\n borderRadius: \"1px\",\n backgroundColor: \"#ef4444\",\n animation: `${b.anim} ${b.dur} ease-in-out ${b.delay} infinite`,\n display: \"inline-block\",\n alignSelf: \"center\",\n }}\n />\n ))}\n </span>\n )}\n </span>\n )}\n {/* Top-right: AI enhance */}\n {enhanceText && (\n <button\n type=\"button\"\n onClick={async () => {\n if (!description.trim() || isEnhancing) return;\n setIsEnhancing(true);\n try {\n const polished = await enhanceText(\n description,\n screenshots[0] ?? null,\n );\n if (polished && polished !== description) {\n setOriginalDescription(description);\n setDescription(polished);\n setIsEnhanced(true);\n if (validationError)\n setValidationError(null);\n }\n } finally {\n setIsEnhancing(false);\n }\n }}\n disabled={\n !description.trim() || isEnhancing || isEnhanced\n }\n style={{\n position: \"absolute\",\n top: \"6px\",\n right: \"6px\",\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"4px\",\n background: t.inputBg,\n border: \"none\",\n padding: \"2px 6px\",\n borderRadius: \"4px\",\n fontFamily: \"inherit\",\n fontSize: \"11px\",\n color: t.textMuted,\n cursor:\n !description.trim() || isEnhancing\n ? \"default\"\n : \"pointer\",\n opacity: !description.trim() ? 0.5 : 1,\n zIndex: 1,\n }}\n title=\"Polish grammar — preserves your meaning\"\n >\n <svg\n width=\"11\"\n height=\"11\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M12 3l1.5 4.5L18 9l-4.5 1.5L12 15l-1.5-4.5L6 9l4.5-1.5L12 3zM19 15l.75 2.25L22 18l-2.25.75L19 21l-.75-2.25L16 18l2.25-.75L19 15z\"\n stroke={t.textMuted}\n strokeWidth=\"1.5\"\n strokeLinejoin=\"round\"\n />\n </svg>\n {isEnhancing ? \"Enhancing...\" : \"AI enhance\"}\n </button>\n )}\n {/* Bottom-right: mic icon only, outlined */}\n {transcribeAudio && (\n <button\n type=\"button\"\n onClick={() => {\n void toggleVoice();\n }}\n title={\n isListening\n ? \"Stop recording\"\n : \"Speak your report\"\n }\n style={{\n position: \"absolute\",\n bottom: \"14px\",\n right: \"7px\",\n width: \"26px\",\n height: \"26px\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n background: \"transparent\",\n border: `1.5px solid ${isListening ? \"#ef4444\" : t.inputBorder}`,\n borderRadius: \"6px\",\n color: isListening ? \"#ef4444\" : t.textMuted,\n cursor: \"pointer\",\n zIndex: 1,\n padding: 0,\n transition:\n \"border-color 0.2s ease, color 0.2s ease\",\n }}\n >\n {isListening ? (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <rect\n x=\"6\"\n y=\"6\"\n width=\"12\"\n height=\"12\"\n rx=\"2\"\n />\n </svg>\n ) : (\n <svg\n width=\"13\"\n height=\"13\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <rect\n x=\"9\"\n y=\"2\"\n width=\"6\"\n height=\"12\"\n rx=\"3\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n />\n <path\n d=\"M5 10a7 7 0 0014 0M12 19v3M9 22h6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n />\n </svg>\n )}\n </button>\n )}\n </div>\n {transcribeAudio && !isListening && !isTranscribing && (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"5px\",\n marginTop: \"5px\",\n fontSize: \"11px\",\n color: t.text,\n opacity: 0.55,\n userSelect: \"none\",\n }}\n >\n <svg width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M12 2a3 3 0 0 0-3 3v7a3 3 0 0 0 6 0V5a3 3 0 0 0-3-3Z\"/>\n <path d=\"M19 10v2a7 7 0 0 1-14 0v-2\"/>\n <line x1=\"12\" x2=\"12\" y1=\"19\" y2=\"22\"/>\n </svg>\n Hold Space to speak — we'll transcribe it\n </div>\n )}\n {isEnhanced && originalDescription !== null && (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"6px\",\n marginTop: \"6px\",\n padding: \"6px 8px\",\n borderRadius: \"6px\",\n background: isDark\n ? \"rgba(34,211,238,0.06)\"\n : \"rgba(8,145,178,0.05)\",\n border: `1px solid ${t.accent}40`,\n }}\n >\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n style={{ flexShrink: 0 }}\n >\n <path\n d=\"M12 3l1.5 4.5L18 9l-4.5 1.5L12 15l-1.5-4.5L6 9l4.5-1.5L12 3z\"\n stroke={t.accent}\n strokeWidth=\"1.5\"\n strokeLinejoin=\"round\"\n />\n </svg>\n <span\n style={{\n fontSize: \"11px\",\n color: t.textMuted,\n flex: 1,\n }}\n >\n AI enhanced\n </span>\n <button\n type=\"button\"\n onClick={() => {\n setIsEnhanced(false);\n setOriginalDescription(null);\n }}\n style={{\n padding: \"2px 8px\",\n borderRadius: \"4px\",\n border: `1px solid ${t.accent}`,\n background: t.accent,\n color: t.accentText,\n fontSize: \"11px\",\n fontWeight: 600,\n cursor: \"pointer\",\n fontFamily: \"inherit\",\n }}\n >\n Keep\n </button>\n <button\n type=\"button\"\n onClick={() => {\n setDescription(originalDescription);\n setIsEnhanced(false);\n setOriginalDescription(null);\n }}\n style={{\n padding: \"2px 8px\",\n borderRadius: \"4px\",\n border: `1px solid ${t.inputBorder}`,\n background: \"transparent\",\n color: t.textMuted,\n fontSize: \"11px\",\n fontWeight: 600,\n cursor: \"pointer\",\n fontFamily: \"inherit\",\n }}\n >\n Restore\n </button>\n </div>\n )}\n {voiceError && (\n <p\n style={{\n color: \"#ef4444\",\n fontSize: \"11px\",\n marginTop: \"4px\",\n marginBottom: 0,\n }}\n >\n {voiceError}\n </p>\n )}\n\n {/* Screenshot section */}\n <div style={{ marginTop: \"10px\" }}>\n <span\n style={{\n fontSize: \"12px\",\n color: t.textMuted,\n marginBottom: \"6px\",\n display: \"block\",\n fontWeight: 500,\n }}\n >\n Screenshots\n {screenshots.length > 0\n ? ` (${screenshots.length})`\n : \"\"}\n </span>\n {screenshots.length > 0 && (\n <div\n style={{\n display: \"flex\",\n flexWrap: \"wrap\",\n gap: \"8px\",\n marginBottom: \"8px\",\n }}\n >\n {screenshots.map((src, i) => (\n <div\n key={i}\n style={{\n position: \"relative\",\n width: \"56px\",\n height: \"56px\",\n }}\n >\n <img\n src={src}\n alt={`Screenshot ${i + 1}`}\n onClick={() => setPreviewIndex(i)}\n style={{\n width: \"100%\",\n height: \"100%\",\n borderRadius: \"6px\",\n border: `1px solid ${t.border}`,\n objectFit: \"cover\",\n objectPosition: \"top\",\n cursor: \"zoom-in\",\n display: \"block\",\n }}\n />\n <button\n type=\"button\"\n onClick={() =>\n setScreenshots((prev) =>\n prev.filter((_, idx) => idx !== i),\n )\n }\n aria-label={`Remove screenshot ${i + 1}`}\n style={{\n position: \"absolute\",\n top: \"-6px\",\n right: \"-6px\",\n width: \"17px\",\n height: \"17px\",\n borderRadius: \"50%\",\n border: \"none\",\n background: \"#ef4444\",\n color: \"#fff\",\n fontSize: \"11px\",\n lineHeight: 1,\n padding: 0,\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n <svg\n width=\"8\"\n height=\"8\"\n viewBox=\"0 0 10 10\"\n fill=\"none\"\n >\n <path\n d=\"M1 1L9 9M9 1L1 9\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n </button>\n <button\n type=\"button\"\n onClick={() => setAnnotatingIndex(i)}\n aria-label={`Annotate screenshot ${i + 1}`}\n title=\"Annotate\"\n style={{\n position: \"absolute\",\n top: \"50%\",\n left: \"50%\",\n transform: \"translate(-50%, -50%)\",\n width: \"24px\",\n height: \"24px\",\n borderRadius: \"50%\",\n border: \"none\",\n background: t.accent,\n color: t.accentText,\n padding: 0,\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n boxShadow: \"0 2px 8px rgba(0,0,0,0.45)\",\n }}\n >\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n >\n <path\n d=\"M12 20h9M16.5 3.5a2.12 2.12 0 013 3L7 19l-4 1 1-4L16.5 3.5z\"\n stroke=\"currentColor\"\n strokeWidth=\"2.2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n </div>\n ))}\n </div>\n )}\n {/* Drop zone — always available to add more */}\n <div\n onClick={() => fileInputRef.current?.click()}\n onDrop={(e) => {\n e.preventDefault();\n setScreenshotDragOver(false);\n const files = Array.from(\n e.dataTransfer.files,\n ).filter((f) => f.type.startsWith(\"image/\"));\n files.forEach((file) => {\n const reader = new FileReader();\n reader.onload = () =>\n setScreenshots((prev) => [\n ...prev,\n reader.result as string,\n ]);\n reader.readAsDataURL(file);\n });\n }}\n onDragOver={(e) => {\n e.preventDefault();\n setScreenshotDragOver(true);\n }}\n onDragLeave={() => setScreenshotDragOver(false)}\n style={{\n border: `1.5px dashed ${screenshotDragOver ? t.accent : t.inputBorder}`,\n borderRadius: \"8px\",\n padding:\n screenshots.length > 0\n ? \"8px 12px\"\n : \"18px 12px\",\n textAlign: \"center\",\n cursor: \"pointer\",\n background: screenshotDragOver\n ? isDark\n ? \"rgba(34,211,238,0.06)\"\n : \"rgba(8,145,178,0.04)\"\n : \"transparent\",\n transition:\n \"border-color 0.15s ease, background 0.15s ease\",\n }}\n >\n {screenshots.length > 0 ? (\n <p\n style={{\n margin: 0,\n fontSize: \"11px\",\n fontWeight: 500,\n color: t.textMuted,\n }}\n >\n {screenshotDragOver\n ? \"Drop to attach\"\n : \"+ Add more · Drag & drop · Paste\"}\n </p>\n ) : (\n <>\n <svg\n width=\"22\"\n height=\"22\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n style={{\n margin: \"0 auto 6px\",\n display: \"block\",\n opacity: 0.45,\n }}\n >\n <rect\n x=\"3\"\n y=\"3\"\n width=\"18\"\n height=\"18\"\n rx=\"2\"\n stroke={t.textMuted}\n strokeWidth=\"1.5\"\n />\n <circle\n cx=\"8.5\"\n cy=\"8.5\"\n r=\"1.5\"\n stroke={t.textMuted}\n strokeWidth=\"1.5\"\n />\n <path\n d=\"M21 15l-5-5L5 21\"\n stroke={t.textMuted}\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n <p\n style={{\n margin: 0,\n fontSize: \"12px\",\n fontWeight: 600,\n color: t.text,\n }}\n >\n {screenshotDragOver\n ? \"Drop to attach\"\n : \"Add screenshots\"}\n </p>\n <p\n style={{\n margin: \"3px 0 0\",\n fontSize: \"11px\",\n color: t.textMuted,\n }}\n >\n Drag & drop · Paste ⌘V / Ctrl+V · Click to\n browse\n </p>\n </>\n )}\n </div>\n </div>\n\n {showSeverity && reportType === \"BUG\" && (\n <div style={{ marginTop: \"10px\" }}>\n <span\n style={{\n fontSize: \"12px\",\n color: t.textMuted,\n marginBottom: \"6px\",\n display: \"block\",\n }}\n >\n Severity\n </span>\n <div style={{ display: \"flex\", gap: \"6px\" }}>\n {(\n [\"low\", \"medium\", \"high\"] as ReportSeverity[]\n ).map((s) => (\n <button\n key={s}\n type=\"button\"\n onClick={() => setSeverity(s)}\n style={{\n flex: 1,\n padding: \"6px 0\",\n borderRadius: \"6px\",\n border: `1px solid ${severity === s ? t.accent : t.inputBorder}`,\n background:\n severity === s ? t.accent : \"transparent\",\n color:\n severity === s ? t.accentText : t.text,\n fontSize: \"12px\",\n fontWeight: 600,\n cursor: \"pointer\",\n fontFamily: \"inherit\",\n textTransform: \"capitalize\",\n transition: \"all 0.15s ease\",\n }}\n >\n {s}\n </button>\n ))}\n </div>\n </div>\n )}\n {validationError && (\n <p\n style={{\n color: \"#ef4444\",\n fontSize: \"12px\",\n marginTop: \"6px\",\n }}\n >\n {validationError}\n </p>\n )}\n <button\n type=\"button\"\n onClick={handleSubmit}\n disabled={!description.trim() || isSubmitting}\n style={{\n marginTop: \"12px\",\n width: \"100%\",\n padding: \"10px\",\n borderRadius: \"8px\",\n border: \"none\",\n backgroundColor:\n !description.trim() || isSubmitting\n ? t.bgSecondary\n : t.accent,\n color:\n !description.trim() || isSubmitting\n ? t.textMuted\n : t.accentText,\n fontSize: \"14px\",\n fontWeight: 600,\n cursor:\n !description.trim() || isSubmitting\n ? \"not-allowed\"\n : \"pointer\",\n fontFamily: \"inherit\",\n transition: \"background-color 0.15s ease\",\n }}\n >\n {isSubmitting ? \"Sending...\" : \"Send Report\"}\n </button>\n </>\n )}\n </>\n )}\n </div>\n\n {/* Footer */}\n <div\n style={{\n padding: \"8px 16px 10px\",\n borderTop: `1px solid ${t.border}`,\n textAlign: \"center\",\n }}\n >\n <span style={{ fontSize: \"11px\", color: t.textMuted }}>\n Powered by Glitchgrab\n </span>\n </div>\n </div>\n </div>,\n document.body,\n )}\n\n {/* Hidden file input */}\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\"image/*\"\n multiple\n onChange={handleFileUpload}\n style={{ display: \"none\" }}\n />\n\n {/* Full-screen screenshot preview */}\n {previewIndex !== null &&\n screenshots[previewIndex] &&\n createPortal(\n <div\n style={{\n position: \"fixed\",\n inset: 0,\n zIndex: 2147483647,\n backgroundColor: \"rgba(0,0,0,0.85)\",\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: \"16px\",\n cursor: \"pointer\",\n }}\n onClick={(e) => {\n e.stopPropagation();\n setPreviewIndex(null);\n }}\n onMouseDown={(e) => e.stopPropagation()}\n >\n <div\n ref={previewImgRef}\n style={{ position: \"relative\", maxWidth: \"100%\" }}\n onClick={(e) => e.stopPropagation()}\n >\n <img\n src={screenshots[previewIndex]}\n alt=\"Screenshot preview\"\n style={{\n maxWidth: \"100%\",\n maxHeight: \"calc(100vh - 80px)\",\n borderRadius: \"8px\",\n objectFit: \"contain\",\n cursor: \"default\",\n display: \"block\",\n }}\n />\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n setAnnotatingIndex(previewIndex);\n }}\n style={{\n position: \"absolute\",\n top: \"12px\",\n right: \"12px\",\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"6px\",\n padding: \"8px 14px\",\n borderRadius: \"999px\",\n border: \"none\",\n background: t.accent,\n color: t.accentText,\n fontSize: \"13px\",\n fontWeight: 700,\n cursor: \"pointer\",\n fontFamily: \"inherit\",\n boxShadow: \"0 4px 14px rgba(0,0,0,0.35)\",\n animation: \"gg-pulse 2s ease-in-out infinite\",\n }}\n >\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n d=\"M12 20h9M16.5 3.5a2.12 2.12 0 013 3L7 19l-4 1 1-4L16.5 3.5z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n Annotate\n </button>\n </div>\n <div\n style={{\n marginTop: \"12px\",\n display: \"flex\",\n alignItems: \"center\",\n gap: \"12px\",\n }}\n >\n <span\n style={{\n color: t.textMuted,\n fontSize: \"12px\",\n }}\n >\n {screenshots.length > 1\n ? `${previewIndex + 1} / ${screenshots.length} · Click outside to close`\n : \"Click outside to close\"}\n </span>\n </div>\n </div>,\n document.body,\n )}\n\n {/* Annotation overlay */}\n {annotatingIndex !== null &&\n screenshots[annotatingIndex] &&\n createPortal(\n <AnnotationCanvas\n imageSrc={screenshots[annotatingIndex]}\n onCancel={() => setAnnotatingIndex(null)}\n onSave={(dataUrl) => {\n setScreenshots((prev) =>\n prev.map((s, i) => (i === annotatingIndex ? dataUrl : s)),\n );\n setAnnotatingIndex(null);\n }}\n />,\n document.body,\n )}\n </>\n );\n}\n\n/* ─── Helpers ─── */\n\nfunction getTypeLabel(type: ReportType): string {\n switch (type) {\n case \"BUG\":\n return \"Bug Report\";\n case \"FEATURE_REQUEST\":\n return \"Feature Request\";\n case \"UI_IMPROVEMENT\":\n return \"UI Improvement\";\n case \"PERFORMANCE\":\n return \"Performance\";\n case \"SECURITY\":\n return \"Security\";\n case \"QUESTION\":\n return \"Question\";\n case \"OTHER\":\n return \"Other\";\n }\n}\n\nfunction getTypeSubtitle(type: ReportType): string {\n switch (type) {\n case \"BUG\":\n return \"Something isn't working\";\n case \"FEATURE_REQUEST\":\n return \"Suggest an improvement\";\n case \"UI_IMPROVEMENT\":\n return \"Something looks off\";\n case \"PERFORMANCE\":\n return \"Something is slow\";\n case \"SECURITY\":\n return \"Report a security concern\";\n case \"QUESTION\":\n return \"Ask a question\";\n case \"OTHER\":\n return \"General feedback\";\n }\n}\n\nfunction getPlaceholder(type: ReportType, idx = 0, hasVoice = false): string {\n if (hasVoice && idx === 1) return \"Hold Space to speak — we'll transcribe it\";\n switch (type) {\n case \"BUG\":\n return \"What went wrong? Describe it or paste an error...\";\n case \"FEATURE_REQUEST\":\n return \"Describe the feature you'd like...\";\n case \"UI_IMPROVEMENT\":\n return \"What looks off? Describe the visual issue...\";\n case \"PERFORMANCE\":\n return \"What's slow? Describe when it happens...\";\n case \"SECURITY\":\n return \"Describe the security concern...\";\n case \"QUESTION\":\n return \"What would you like to know?\";\n case \"OTHER\":\n return \"Tell us what's on your mind...\";\n }\n}\n\nfunction getTypeIcon(type: ReportType, color: string, size = 24): ReactNode {\n const props = {\n width: size,\n height: size,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n style: { flexShrink: 0 } as CSSProperties,\n };\n switch (type) {\n case \"BUG\":\n return (\n <svg {...props}>\n <path\n d=\"M8 2L6.5 3.5M16 2L17.5 3.5M3 9H7M17 9H21M12 2a5 5 0 015 5v4a5 5 0 01-10 0V7a5 5 0 015-5zM7 16l-2 3M17 16l2 3\"\n stroke={color}\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n case \"FEATURE_REQUEST\":\n return (\n <svg {...props}>\n <path\n d=\"M12 2L15.09 8.26L22 9.27L17 14.14L18.18 21.02L12 17.77L5.82 21.02L7 14.14L2 9.27L8.91 8.26L12 2z\"\n stroke={color}\n strokeWidth=\"1.5\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n case \"UI_IMPROVEMENT\":\n return (\n <svg {...props}>\n <rect\n x=\"3\"\n y=\"3\"\n width=\"18\"\n height=\"18\"\n rx=\"2\"\n stroke={color}\n strokeWidth=\"1.5\"\n />\n <path\n d=\"M3 9h18M9 21V9\"\n stroke={color}\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n case \"PERFORMANCE\":\n return (\n <svg {...props}>\n <path\n d=\"M12 21a9 9 0 100-18 9 9 0 000 18zM12 12l4-4M12 7v.01\"\n stroke={color}\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n case \"SECURITY\":\n return (\n <svg {...props}>\n <path\n d=\"M12 3l7 3v5c0 4.5-3 8.5-7 10-4-1.5-7-5.5-7-10V6l7-3z\"\n stroke={color}\n strokeWidth=\"1.5\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n case \"QUESTION\":\n return (\n <svg {...props}>\n <circle cx=\"12\" cy=\"12\" r=\"10\" stroke={color} strokeWidth=\"1.5\" />\n <path\n d=\"M9.09 9a3 3 0 015.83 1c0 2-3 3-3 3M12 17h.01\"\n stroke={color}\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n case \"OTHER\":\n return (\n <svg {...props}>\n <path\n d=\"M21 15a2 2 0 01-2 2H7l-4 4V5a2 2 0 012-2h14a2 2 0 012 2v10z\"\n stroke={color}\n strokeWidth=\"1.5\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n }\n}\n","\"use client\";\n\nimport { useEffect, useRef, useState } from \"react\";\n\ntype Point = { x: number; y: number };\n\ntype Stroke =\n | { type: \"freehand\"; color: string; width: number; points: Point[] }\n | { type: \"circle\"; color: string; width: number; cx: number; cy: number; r: number };\n\nconst PALETTE = [\"#ef4444\", \"#f59e0b\", \"#22c55e\", \"#3b82f6\", \"#a855f7\", \"#ffffff\"];\n\nfunction drawStroke(ctx: CanvasRenderingContext2D, s: Stroke) {\n ctx.strokeStyle = s.color;\n ctx.lineWidth = s.width;\n ctx.lineCap = \"round\";\n ctx.lineJoin = \"round\";\n if (s.type === \"freehand\") {\n if (s.points.length < 2) return;\n ctx.beginPath();\n ctx.moveTo(s.points[0].x, s.points[0].y);\n for (let i = 1; i < s.points.length; i++) ctx.lineTo(s.points[i].x, s.points[i].y);\n ctx.stroke();\n } else {\n ctx.beginPath();\n ctx.arc(s.cx, s.cy, s.r, 0, Math.PI * 2);\n ctx.stroke();\n }\n}\n\ninterface AnnotationCanvasProps {\n imageSrc: string;\n onSave: (dataUrl: string) => void;\n onCancel: () => void;\n}\n\n/** Freehand + circle annotation overlay for a screenshot preview — draws directly on a canvas sized to the image's natural resolution, composited on save. */\nexport function AnnotationCanvas({ imageSrc, onSave, onCancel }: AnnotationCanvasProps) {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const imgRef = useRef<HTMLImageElement | null>(null);\n const [ready, setReady] = useState(false);\n const [tool, setTool] = useState<\"pen\" | \"circle\">(\"pen\");\n const [color, setColor] = useState(PALETTE[0]);\n const [strokeWidth, setStrokeWidth] = useState(4);\n const [strokes, setStrokes] = useState<Stroke[]>([]);\n const [currentStroke, setCurrentStroke] = useState<Stroke | null>(null);\n\n useEffect(() => {\n const img = new Image();\n img.onload = () => {\n imgRef.current = img;\n const canvas = canvasRef.current;\n if (canvas) {\n canvas.width = img.naturalWidth;\n canvas.height = img.naturalHeight;\n }\n setReady(true);\n };\n img.src = imageSrc;\n }, [imageSrc]);\n\n useEffect(() => {\n if (!ready) return;\n const canvas = canvasRef.current;\n const img = imgRef.current;\n if (!canvas || !img) return;\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return;\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n ctx.drawImage(img, 0, 0, canvas.width, canvas.height);\n for (const s of strokes) drawStroke(ctx, s);\n if (currentStroke) drawStroke(ctx, currentStroke);\n }, [ready, strokes, currentStroke]);\n\n const getPos = (e: React.PointerEvent<HTMLCanvasElement>): Point => {\n const canvas = e.currentTarget;\n const rect = canvas.getBoundingClientRect();\n return {\n x: ((e.clientX - rect.left) * canvas.width) / rect.width,\n y: ((e.clientY - rect.top) * canvas.height) / rect.height,\n };\n };\n\n const handlePointerDown = (e: React.PointerEvent<HTMLCanvasElement>) => {\n e.currentTarget.setPointerCapture(e.pointerId);\n const { x, y } = getPos(e);\n setCurrentStroke(\n tool === \"pen\"\n ? { type: \"freehand\", color, width: strokeWidth, points: [{ x, y }] }\n : { type: \"circle\", color, width: strokeWidth, cx: x, cy: y, r: 0 },\n );\n };\n\n const handlePointerMove = (e: React.PointerEvent<HTMLCanvasElement>) => {\n if (!currentStroke) return;\n const { x, y } = getPos(e);\n setCurrentStroke((prev) => {\n if (!prev) return prev;\n if (prev.type === \"freehand\") return { ...prev, points: [...prev.points, { x, y }] };\n return { ...prev, r: Math.hypot(x - prev.cx, y - prev.cy) };\n });\n };\n\n const handlePointerUp = () => {\n setCurrentStroke((prev) => {\n if (prev) setStrokes((s) => [...s, prev]);\n return null;\n });\n };\n\n const handleSave = () => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n onSave(canvas.toDataURL(\"image/jpeg\", 0.85));\n };\n\n const iconBtn = (active = false): React.CSSProperties => ({\n width: \"30px\",\n height: \"30px\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n borderRadius: \"6px\",\n border: `1.5px solid ${active ? \"#22d3ee\" : \"rgba(255,255,255,0.15)\"}`,\n background: active ? \"rgba(34,211,238,0.15)\" : \"transparent\",\n color: \"#fff\",\n cursor: \"pointer\",\n padding: 0,\n });\n\n return (\n <div\n style={{\n position: \"fixed\",\n inset: 0,\n zIndex: 2147483647,\n backgroundColor: \"rgba(0,0,0,0.9)\",\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: \"16px\",\n }}\n onClick={(e) => {\n e.stopPropagation();\n if (e.target === e.currentTarget) onCancel();\n }}\n onPointerDown={(e) => e.stopPropagation()}\n >\n <canvas\n ref={canvasRef}\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerUp}\n style={{\n maxWidth: \"100%\",\n maxHeight: \"calc(100vh - 140px)\",\n borderRadius: \"8px\",\n touchAction: \"none\",\n cursor: \"crosshair\",\n display: \"block\",\n }}\n />\n\n <div\n style={{\n marginTop: \"14px\",\n display: \"flex\",\n alignItems: \"center\",\n gap: \"8px\",\n flexWrap: \"wrap\",\n justifyContent: \"center\",\n maxWidth: \"100%\",\n }}\n >\n <button type=\"button\" onClick={() => setTool(\"pen\")} style={iconBtn(tool === \"pen\")} title=\"Freehand\" aria-label=\"Freehand tool\">\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path d=\"M12 20h9M16.5 3.5a2.12 2.12 0 013 3L7 19l-4 1 1-4L16.5 3.5z\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </button>\n <button type=\"button\" onClick={() => setTool(\"circle\")} style={iconBtn(tool === \"circle\")} title=\"Circle\" aria-label=\"Circle tool\">\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\">\n <circle cx=\"12\" cy=\"12\" r=\"8\" stroke=\"currentColor\" strokeWidth=\"1.8\" />\n </svg>\n </button>\n\n <div style={{ width: \"1px\", height: \"20px\", background: \"rgba(255,255,255,0.15)\" }} />\n\n {PALETTE.map((c) => (\n <button\n key={c}\n type=\"button\"\n onClick={() => setColor(c)}\n aria-label={`Color ${c}`}\n style={{\n width: \"22px\",\n height: \"22px\",\n borderRadius: \"50%\",\n background: c,\n border: color === c ? \"2px solid #22d3ee\" : \"2px solid rgba(255,255,255,0.3)\",\n cursor: \"pointer\",\n padding: 0,\n }}\n />\n ))}\n <input\n type=\"color\"\n value={color}\n onChange={(e) => setColor(e.target.value)}\n title=\"Custom color\"\n aria-label=\"Custom color\"\n style={{\n width: \"22px\",\n height: \"22px\",\n padding: 0,\n border: \"none\",\n background: \"none\",\n cursor: \"pointer\",\n }}\n />\n\n <div style={{ width: \"1px\", height: \"20px\", background: \"rgba(255,255,255,0.15)\" }} />\n\n <input\n type=\"range\"\n min={2}\n max={12}\n value={strokeWidth}\n onChange={(e) => setStrokeWidth(Number(e.target.value))}\n title=\"Stroke width\"\n aria-label=\"Stroke width\"\n style={{ width: \"70px\" }}\n />\n\n <div style={{ width: \"1px\", height: \"20px\", background: \"rgba(255,255,255,0.15)\" }} />\n\n <button\n type=\"button\"\n onClick={() => setStrokes((s) => s.slice(0, -1))}\n disabled={strokes.length === 0}\n style={{ ...iconBtn(), opacity: strokes.length === 0 ? 0.35 : 1 }}\n title=\"Undo\"\n aria-label=\"Undo\"\n >\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path d=\"M9 14L4 9l5-5M4 9h10a6 6 0 010 12h-2\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </button>\n <button\n type=\"button\"\n onClick={() => setStrokes([])}\n disabled={strokes.length === 0}\n style={{ ...iconBtn(), opacity: strokes.length === 0 ? 0.35 : 1 }}\n title=\"Clear all\"\n aria-label=\"Clear all\"\n >\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path d=\"M3 6h18M8 6V4a1 1 0 011-1h6a1 1 0 011 1v2m2 0v14a1 1 0 01-1 1H7a1 1 0 01-1-1V6h12z\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </button>\n </div>\n\n <div style={{ marginTop: \"12px\", display: \"flex\", gap: \"8px\" }}>\n <button\n type=\"button\"\n onClick={onCancel}\n style={{\n padding: \"8px 16px\",\n borderRadius: \"8px\",\n border: \"1.5px solid rgba(255,255,255,0.2)\",\n background: \"transparent\",\n color: \"#fff\",\n fontSize: \"13px\",\n fontWeight: 600,\n cursor: \"pointer\",\n fontFamily: \"inherit\",\n }}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={handleSave}\n style={{\n padding: \"8px 16px\",\n borderRadius: \"8px\",\n border: \"none\",\n background: \"#22d3ee\",\n color: \"#09090b\",\n fontSize: \"13px\",\n fontWeight: 600,\n cursor: \"pointer\",\n fontFamily: \"inherit\",\n }}\n >\n Save annotation\n </button>\n </div>\n </div>\n );\n}\n","/**\n * The global keyboard shortcut that opens the Glitchgrab report dialog.\n * Single source of truth — the provider's keydown handler and every label\n * rendered anywhere (SDK dialog, host app UI) derive from this.\n */\n\n/** Server-safe label. Used during SSR and as the non-Mac label. */\nexport const GLITCHGRAB_SHORTCUT = \"Ctrl+Shift+G\";\n\n/** Mac label, using the platform's modifier glyphs. */\nexport const GLITCHGRAB_SHORTCUT_MAC = \"⌘⇧G\";\n\n/** True when running on a Mac-like platform. Always false on the server. */\nfunction isMac(): boolean {\n try {\n if (typeof navigator === \"undefined\") return false;\n return /Mac|iPhone|iPad|iPod/i.test(navigator.platform || navigator.userAgent);\n } catch {\n return false;\n }\n}\n\n/**\n * OS-aware label for the report-dialog shortcut — `⌘⇧G` on Mac,\n * `Ctrl+Shift+G` elsewhere. Returns the non-Mac label on the server, so\n * render it client-side (or after mount) to avoid a hydration mismatch.\n */\nexport function getShortcutLabel(): string {\n return isMac() ? GLITCHGRAB_SHORTCUT_MAC : GLITCHGRAB_SHORTCUT;\n}\n\n/** True when the keyboard event matches the report-dialog shortcut. */\nexport function matchesShortcut(e: KeyboardEvent): boolean {\n return (\n (e.metaKey || e.ctrlKey) && e.shiftKey && e.key.toLowerCase() === \"g\"\n );\n}\n","\"use client\";\n\nimport { useState, type CSSProperties, type ReactNode } from \"react\";\nimport type { ReportButtonProps } from \"./types\";\nimport { useGlitchgrab } from \"./provider\";\n\n/** Safe version of useGlitchgrab that returns null when outside provider */\nfunction useGlitchgrabSafe() {\n try {\n return useGlitchgrab();\n } catch {\n return null;\n }\n}\n\n/**\n * Optional trigger button for opening the report dialog.\n *\n * The dialog itself lives inside `GlitchgrabProvider` — you don't need this component\n * unless you want a visible trigger button. You can also open the dialog programmatically\n * via `useGlitchgrab().openReportDialog()`.\n *\n * @example\n * ```tsx\n * // Use the default floating button\n * <ReportButton />\n *\n * // Use your own trigger\n * <ReportButton>\n * {({ onClick }) => <button onClick={onClick}>Report</button>}\n * </ReportButton>\n *\n * // Or skip ReportButton entirely and use the hook\n * const { openReportDialog } = useGlitchgrab();\n * <button onClick={() => openReportDialog()}>Report</button>\n * ```\n */\nexport function ReportButton({\n position = \"bottom-right\",\n label = \"Report Bug\",\n className,\n children,\n}: ReportButtonProps & {\n children?: (props: { onClick: () => void; capturing: boolean }) => ReactNode;\n}) {\n const [capturing, setCapturing] = useState(false);\n const glitchgrab = useGlitchgrabSafe();\n\n if (!glitchgrab) return null;\n\n const handleClick = async () => {\n setCapturing(true);\n glitchgrab.openReportDialog();\n setCapturing(false);\n };\n\n // Custom trigger via render prop\n if (children) {\n return <>{children({ onClick: handleClick, capturing })}</>;\n }\n\n // Default floating button\n const isTop = position?.startsWith(\"top\") ?? false;\n const isLeft = position?.endsWith(\"left\") ?? false;\n\n const positionStyles: CSSProperties = {\n ...(isLeft ? { left: \"16px\" } : { right: \"16px\" }),\n ...(isTop ? { top: \"16px\" } : { bottom: \"16px\" }),\n };\n\n return (\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={capturing}\n className={className}\n style={{\n position: \"fixed\",\n ...positionStyles,\n zIndex: 99999,\n padding: \"10px 18px\",\n borderRadius: \"24px\",\n border: \"none\",\n backgroundColor: \"#18181b\",\n color: \"#fafafa\",\n fontSize: \"14px\",\n fontWeight: 500,\n fontFamily:\n '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n cursor: capturing ? \"wait\" : \"pointer\",\n boxShadow:\n \"0 4px 12px rgba(0, 0, 0, 0.15), 0 1px 3px rgba(0, 0, 0, 0.1)\",\n transition: \"transform 0.15s ease, box-shadow 0.15s ease\",\n display: \"flex\",\n alignItems: \"center\",\n gap: \"6px\",\n opacity: capturing ? 0.7 : 1,\n }}\n onMouseEnter={(e) => {\n (e.target as HTMLElement).style.transform = \"scale(1.05)\";\n }}\n onMouseLeave={(e) => {\n (e.target as HTMLElement).style.transform = \"scale(1)\";\n }}\n aria-label={label}\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n style={{ flexShrink: 0 }}\n >\n <path\n d=\"M8 1C4.134 1 1 4.134 1 8s3.134 7 7 7 7-3.134 7-7-3.134-7-7-7zm0 12.5a.75.75 0 110-1.5.75.75 0 010 1.5zm.75-3.5a.75.75 0 01-1.5 0V5a.75.75 0 011.5 0v5z\"\n fill=\"currentColor\"\n />\n </svg>\n {capturing ? \"Capturing...\" : label}\n </button>\n );\n}\n","\"use client\";\n\nimport { useState, useEffect, useCallback } from \"react\";\n\nexport interface GlitchgrabReport {\n id: string;\n source: string;\n status: string;\n rawInput: string | null;\n reporterPrimaryKey: string;\n reporterName: string;\n reporterEmail: string | null;\n reporterPhone: string | null;\n pageUrl: string | null;\n createdAt: string;\n /** Number of comments on the linked GitHub issue (0 if no issue) */\n commentCount: number;\n issue: {\n githubNumber: number;\n githubUrl: string;\n title: string;\n labels: string[];\n severity: string | null;\n githubState: string | null;\n } | null;\n}\n\nconst BASE_URL = \"https://glitchgrab.dev\";\n\n/**\n * Hook to fetch bug reports for a specific user.\n *\n * ```tsx\n * const { reports, isLoading, error, refetch } = useGlitchgrabReports({\n * token: process.env.NEXT_PUBLIC_GLITCHGRAB_TOKEN!,\n * userId: session.user.id,\n * });\n * ```\n */\nexport function useGlitchgrabReports({\n token,\n userId,\n limit = 100,\n}: {\n token: string;\n userId: string;\n /** Max results (default 100, max 100) */\n limit?: number;\n}): {\n reports: GlitchgrabReport[];\n isLoading: boolean;\n isFetching: boolean;\n error: string | null;\n refetch: () => Promise<void>;\n} {\n const [reports, setReports] = useState<GlitchgrabReport[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n const [isFetching, setIsFetching] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const fetchReports = useCallback(async () => {\n if (!token || !userId) {\n setIsLoading(false);\n return;\n }\n\n setIsFetching(true);\n setError(null);\n\n try {\n const res = await fetch(\n `${BASE_URL}/api/v1/sdk/reports?reporterPrimaryKey=${encodeURIComponent(userId)}&limit=${limit}`,\n { headers: { Authorization: `Bearer ${token}` } }\n );\n const data = await res.json();\n\n if (data.success) {\n setReports(data.data ?? []);\n } else {\n setError(data.error ?? \"Failed to fetch reports\");\n }\n } catch {\n setError(\"Network error\");\n } finally {\n setIsLoading(false);\n setIsFetching(false);\n }\n }, [token, userId, limit]);\n\n useEffect(() => {\n fetchReports();\n }, [fetchReports]);\n\n return { reports, isLoading, isFetching, error, refetch: fetchReports };\n}\n\n/**\n * Standalone fetcher — use with TanStack Query or any data fetching library.\n *\n * ```tsx\n * const { data } = useQuery({\n * queryKey: [\"glitchgrab-reports\", userId],\n * queryFn: () => fetchGlitchgrabReports({\n * token: process.env.NEXT_PUBLIC_GLITCHGRAB_TOKEN!,\n * userId: session.user.id,\n * }),\n * });\n * ```\n */\nexport async function fetchGlitchgrabReports({\n token,\n userId,\n limit = 100,\n}: {\n token: string;\n userId: string;\n limit?: number;\n}): Promise<GlitchgrabReport[]> {\n const res = await fetch(\n `${BASE_URL}/api/v1/sdk/reports?reporterPrimaryKey=${encodeURIComponent(userId)}&limit=${limit}`,\n { headers: { Authorization: `Bearer ${token}` } }\n );\n const data = await res.json();\n if (!data.success) throw new Error(data.error ?? \"Failed to fetch reports\");\n return data.data ?? [];\n}\n\n// ─── Report Actions ─────────────────────────────────────\n\nasync function reportAction(\n token: string,\n reportId: string,\n body: Record<string, string>\n): Promise<void> {\n const res = await fetch(`${BASE_URL}/api/v1/reports/${reportId}/actions`, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(body),\n });\n const data = await res.json().catch(() => ({}));\n if (!res.ok || !data.success) throw new Error(data.error ?? \"Action failed\");\n}\n\n/**\n * Hook to manage report actions with loading/error states.\n *\n * ```tsx\n * const { approve, reject, close, isPending, error } = useGlitchgrabActions({\n * token: process.env.NEXT_PUBLIC_GLITCHGRAB_TOKEN!,\n * onSuccess: () => refetch(),\n * onError: (err) => toast.error(err.message),\n * });\n *\n * <button onClick={() => approve(reportId)} disabled={isPending}>\n * {isPending ? \"...\" : \"Approve\"}\n * </button>\n * ```\n */\nexport function useGlitchgrabActions({\n token,\n onSuccess,\n onError,\n}: {\n token: string;\n onSuccess?: () => void;\n onError?: (error: Error) => void;\n}) {\n const [isPending, setIsPending] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const run = useCallback(\n async (reportId: string, body: Record<string, string>) => {\n setIsPending(true);\n setError(null);\n try {\n await reportAction(token, reportId, body);\n onSuccess?.();\n } catch (e) {\n const err = e instanceof Error ? e : new Error(\"Action failed\");\n setError(err.message);\n onError?.(err);\n } finally {\n setIsPending(false);\n }\n },\n [token, onSuccess, onError]\n );\n\n return {\n approve: (reportId: string) => run(reportId, { action: \"label\", label: \"approved\" }),\n reject: (reportId: string) => run(reportId, { action: \"label\", label: \"rejected\" }),\n close: (reportId: string) => run(reportId, { action: \"close\" }),\n reopen: (reportId: string) => run(reportId, { action: \"reopen\" }),\n label: (reportId: string, label: string) => run(reportId, { action: \"label\", label }),\n unlabel: (reportId: string, label: string) => run(reportId, { action: \"unlabel\", label }),\n isPending,\n error,\n };\n}\n"],"mappings":"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","names":["import_react","e","import_react","import_jsx_runtime","rgb","words","enhanceText","transcribeAudio","e","t","import_jsx_runtime","DEFAULT_BASE_URL","maxBreadcrumbs","addBreadcrumb","import_react","import_jsx_runtime","import_react"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/provider.tsx","../src/error-boundary.tsx","../src/breadcrumbs.ts","../src/utils.ts","../src/dedup.ts","../src/report-dialog.tsx","../src/annotation-canvas.tsx","../src/shortcut.ts","../src/report-button.tsx","../src/use-reports.ts"],"sourcesContent":["\"use client\";\n\n// ─── Core (required) ─────────────────────────────────────\nexport { GlitchgrabProvider, useGlitchgrab } from \"./provider\";\n\n// ─── Optional Components ─────────────────────────────────\nexport { ReportButton } from \"./report-button\";\nexport { GlitchgrabErrorBoundary } from \"./error-boundary\";\n\n// ─── Hooks ──────────────────────────────────────────────\nexport { useGlitchgrabReports, fetchGlitchgrabReports, useGlitchgrabActions } from \"./use-reports\";\nexport type { GlitchgrabReport } from \"./use-reports\";\n\n// ─── Breadcrumbs ─────────────────────────────────────────\nexport {\n addBreadcrumb,\n getBreadcrumbs,\n clearBreadcrumbs,\n initBreadcrumbs,\n} from \"./breadcrumbs\";\n\n// ─── Keyboard shortcut ───────────────────────────────────\nexport {\n GLITCHGRAB_SHORTCUT,\n GLITCHGRAB_SHORTCUT_MAC,\n getShortcutLabel,\n matchesShortcut,\n} from \"./shortcut\";\n\n// ─── Utilities ───────────────────────────────────────────\nexport { sanitizeUrl, captureContext, captureDeviceInfo, sendReport, enhanceText } from \"./utils\";\nexport { computeSignature, shouldSkipDuplicate, clearDedupCache } from \"./dedup\";\n\n// ─── Types ───────────────────────────────────────────────\nexport type {\n GlitchgrabConfig,\n GlitchgrabProviderProps,\n ReportPayload,\n ReportResult,\n ReportType,\n ReportSeverity,\n CapturedContext,\n DeviceInfo,\n Breadcrumb,\n BreadcrumbType,\n UseGlitchgrabReturn,\n ReportButtonProps,\n GlitchgrabSession,\n} from \"./types\";\n","\"use client\";\n\nimport {\n createContext,\n useContext,\n useRef,\n useEffect,\n useCallback,\n useState,\n} from \"react\";\nimport type {\n GlitchgrabProviderProps,\n UseGlitchgrabReturn,\n ReportPayload,\n ReportResult,\n ReportType,\n} from \"./types\";\nimport { GlitchgrabErrorBoundary } from \"./error-boundary\";\nimport { ReportDialog } from \"./report-dialog\";\nimport { sanitizeUrl, captureContext, sendReport, captureDeviceInfo, enhanceText, transcribeAudio, type EnhanceContext } from \"./utils\";\nimport { computeSignature, shouldSkipDuplicate } from \"./dedup\";\nimport { GLITCHGRAB_SHORTCUT, getShortcutLabel, matchesShortcut } from \"./shortcut\";\nimport {\n initBreadcrumbs,\n addBreadcrumb as addBreadcrumbInternal,\n getBreadcrumbs,\n} from \"./breadcrumbs\";\n\nconst DEFAULT_BASE_URL = \"https://glitchgrab.dev\";\n\nconst GlitchgrabContext = createContext<UseGlitchgrabReturn | null>(null);\n\n/**\n * Hook to access Glitchgrab in your components.\n *\n * @example\n * ```tsx\n * const { reportBug, report, addBreadcrumb } = useGlitchgrab();\n *\n * // Report a bug\n * reportBug(\"Login button crashes on mobile\");\n *\n * // Report a feature request\n * report(\"FEATURE_REQUEST\", \"Add dark mode\");\n *\n * // Add a custom breadcrumb\n * addBreadcrumb(\"User clicked checkout\", { cartItems: \"3\" });\n * ```\n */\nexport function useGlitchgrab(): UseGlitchgrabReturn {\n const ctx = useContext(GlitchgrabContext);\n if (!ctx) {\n throw new Error(\"useGlitchgrab must be used within a GlitchgrabProvider\");\n }\n return ctx;\n}\n\nfunction GlitchgrabProviderInner({\n token,\n session,\n baseUrl,\n onError,\n onReportSent,\n breadcrumbs: enableBreadcrumbs = true,\n maxBreadcrumbs = 50,\n children,\n fallback,\n types,\n showSeverity,\n ignoreErrors,\n}: GlitchgrabProviderProps) {\n const visitedPagesRef = useRef<string[]>([]);\n\n // Initialize breadcrumbs\n useEffect(() => {\n if (enableBreadcrumbs) {\n initBreadcrumbs(maxBreadcrumbs);\n }\n }, [enableBreadcrumbs, maxBreadcrumbs]);\n\n // Track page visits\n useEffect(() => {\n try {\n if (typeof window === \"undefined\") return;\n\n const trackPage = () => {\n try {\n const sanitized = sanitizeUrl(window.location.href);\n const pages = visitedPagesRef.current;\n if (pages[pages.length - 1] !== sanitized) {\n pages.push(sanitized);\n if (pages.length > 20) {\n pages.splice(0, pages.length - 20);\n }\n }\n } catch {\n // Silently fail\n }\n };\n\n trackPage();\n const handlePopState = () => trackPage();\n window.addEventListener(\"popstate\", handlePopState);\n\n const origPushState = history.pushState.bind(history);\n const origReplaceState = history.replaceState.bind(history);\n\n history.pushState = function (...args) {\n origPushState(...args);\n trackPage();\n };\n history.replaceState = function (...args) {\n origReplaceState(...args);\n trackPage();\n };\n\n return () => {\n window.removeEventListener(\"popstate\", handlePopState);\n history.pushState = origPushState;\n history.replaceState = origReplaceState;\n };\n } catch {\n // Never crash\n }\n }, []);\n\n // Unhandled errors and rejections — skip in development\n useEffect(() => {\n try {\n if (typeof window === \"undefined\") return;\n if (process.env.NODE_ENV === \"development\") return;\n\n // Matches chrome-extension://, safari-extension://, moz-extension://\n const EXTENSION_ORIGIN_RE = /\\b(?:chrome|safari|moz)-extension:\\/\\//;\n\n // Well-known extension-injected noise that carries no extension origin in\n // filename/stack, so EXTENSION_ORIGIN_RE can't catch it. Not app bugs.\n const KNOWN_NOISE_RE = [\n /Object Not Found Matching Id:\\d+, MethodName:update, ParamCount:\\d+/,\n ];\n\n const matchesIgnore = (message: string): boolean => {\n if (KNOWN_NOISE_RE.some((pattern) => pattern.test(message))) return true;\n if (!ignoreErrors || ignoreErrors.length === 0) return false;\n return ignoreErrors.some((pattern) =>\n pattern instanceof RegExp ? pattern.test(message) : message.includes(pattern)\n );\n };\n\n const handleError = (event: ErrorEvent) => {\n try {\n // Ignore opaque cross-origin script errors — the browser masks these with no\n // stack, no filename, and no error object, so there is nothing actionable to report.\n const isOpaqueCrossOrigin =\n event.message === \"Script error.\" ||\n event.message === \"Script error\" ||\n (!event.error && !event.filename);\n if (isOpaqueCrossOrigin) {\n return;\n }\n\n // Caller-supplied ignore patterns — known-noisy signatures (e.g. browser\n // extension bridge errors) that aren't app bugs.\n if (matchesIgnore(event.message)) {\n return;\n }\n\n // Ignore benign ResizeObserver warnings — these are triggered by UI libraries\n // (Radix, cmdk, etc.) and are not actionable bugs.\n if (\n event.message === \"ResizeObserver loop completed with undelivered notifications.\" ||\n event.message === \"ResizeObserver loop limit exceeded\"\n ) {\n return;\n }\n\n // Ignore errors thrown by browser extensions — crypto wallets, ad blockers,\n // and other extensions run in the page's JS context but are not part of the app.\n if (\n (event.filename && EXTENSION_ORIGIN_RE.test(event.filename)) ||\n (event.error?.stack && EXTENSION_ORIGIN_RE.test(event.error.stack))\n ) {\n return;\n }\n const context = captureContext(visitedPagesRef.current);\n const sig = computeSignature({\n errorMessage: event.message,\n pageUrl: context.url,\n errorStack: event.error?.stack,\n });\n if (shouldSkipDuplicate(sig)) return;\n const payload: ReportPayload = {\n token,\n source: \"SDK_AUTO\",\n type: \"BUG\",\n errorMessage: event.message,\n errorStack: event.error?.stack,\n pageUrl: context.url,\n userAgent: context.userAgent,\n breadcrumbs: context.breadcrumbs,\n deviceInfo: context.deviceInfo ?? undefined,\n metadata: {\n timestamp: context.timestamp,\n visitedPages: JSON.stringify(context.visitedPages),\n filename: event.filename ?? \"\",\n lineno: String(event.lineno ?? \"\"),\n colno: String(event.colno ?? \"\"),\n ...(session?.userId ? { sessionUserId: session.userId } : {}),\n ...(session?.name ? { sessionUserName: String(session.name) } : {}),\n ...(session?.email ? { sessionUserEmail: String(session.email) } : {}),\n ...(session?.phone ? { sessionUserPhone: String(session.phone) } : {}),\n },\n };\n sendReport(payload, baseUrl).then((result) => {\n if (result && onReportSent) onReportSent(result);\n });\n if (onError && event.error) onError(event.error);\n } catch {\n // Silently fail\n }\n };\n\n const handleRejection = (event: PromiseRejectionEvent) => {\n try {\n const context = captureContext(visitedPagesRef.current);\n const reason = event.reason;\n const errMsg = reason instanceof Error ? reason.message : String(reason);\n // Ignore generic cross-origin script errors.\n if (errMsg === \"Script error.\" || errMsg === \"Script error\") {\n return;\n }\n\n // Caller-supplied ignore patterns — known-noisy signatures (e.g. browser\n // extension bridge errors) that aren't app bugs.\n if (matchesIgnore(errMsg)) {\n return;\n }\n const errStack = reason instanceof Error ? reason.stack : undefined;\n\n // Ignore unhandled rejections where the call chain passes through a browser\n // extension — these are the extension's own failures, not the app's.\n if (errStack && EXTENSION_ORIGIN_RE.test(errStack)) return;\n\n const sig = computeSignature({\n errorMessage: errMsg,\n pageUrl: context.url,\n errorStack: errStack,\n });\n if (shouldSkipDuplicate(sig)) return;\n const payload: ReportPayload = {\n token,\n source: \"SDK_AUTO\",\n type: \"BUG\",\n errorMessage: errMsg,\n errorStack: errStack,\n pageUrl: context.url,\n userAgent: context.userAgent,\n breadcrumbs: context.breadcrumbs,\n deviceInfo: context.deviceInfo ?? undefined,\n metadata: {\n timestamp: context.timestamp,\n visitedPages: JSON.stringify(context.visitedPages),\n type: \"unhandledrejection\",\n ...(session?.userId ? { sessionUserId: session.userId } : {}),\n ...(session?.name ? { sessionUserName: String(session.name) } : {}),\n ...(session?.email ? { sessionUserEmail: String(session.email) } : {}),\n ...(session?.phone ? { sessionUserPhone: String(session.phone) } : {}),\n },\n };\n sendReport(payload, baseUrl).then((result) => {\n if (result && onReportSent) onReportSent(result);\n });\n if (onError && reason instanceof Error) onError(reason);\n } catch {\n // Silently fail\n }\n };\n\n window.addEventListener(\"error\", handleError);\n window.addEventListener(\"unhandledrejection\", handleRejection);\n\n return () => {\n window.removeEventListener(\"error\", handleError);\n window.removeEventListener(\"unhandledrejection\", handleRejection);\n };\n } catch {\n // Never crash\n }\n }, [token, baseUrl, onError, onReportSent, session, ignoreErrors]);\n\n const report = useCallback(\n async (\n type: ReportType,\n description: string,\n metadata?: Record<string, string>\n ): Promise<ReportResult | null> => {\n try {\n const context = captureContext(visitedPagesRef.current);\n const payload: ReportPayload = {\n token,\n source: \"SDK_USER_REPORT\",\n type,\n description,\n pageUrl: context.url,\n userAgent: context.userAgent,\n breadcrumbs: context.breadcrumbs,\n deviceInfo: context.deviceInfo ?? undefined,\n metadata: {\n timestamp: context.timestamp,\n visitedPages: JSON.stringify(context.visitedPages),\n ...(session?.userId ? { sessionUserId: session.userId } : {}),\n ...(session?.name ? { sessionUserName: String(session.name) } : {}),\n ...(session?.email ? { sessionUserEmail: String(session.email) } : {}),\n ...(session?.phone ? { sessionUserPhone: String(session.phone) } : {}),\n ...metadata,\n },\n };\n const result = await sendReport(payload, baseUrl);\n if (result && onReportSent) onReportSent(result);\n return result;\n } catch {\n return null;\n }\n },\n [token, baseUrl, onReportSent, session]\n );\n\n const reportBug = useCallback(\n (description: string, metadata?: Record<string, string>) =>\n report(\"BUG\", description, metadata),\n [report]\n );\n\n const addBreadcrumb = useCallback(\n (message: string, data?: Record<string, string>) => {\n addBreadcrumbInternal(\"custom\", message, data);\n },\n []\n );\n\n const enhance = useCallback(\n async (text: string, screenshot?: string | null): Promise<string> => {\n try {\n const ctx = captureContext(visitedPagesRef.current);\n const context: EnhanceContext = {\n url: ctx.url,\n visitedPages: ctx.visitedPages.slice(-5),\n breadcrumbs: ctx.breadcrumbs.slice(-10).map((b) => ({ type: b.type, message: b.message })),\n };\n return await enhanceText(text, token, baseUrl, screenshot, context);\n } catch {\n return text;\n }\n },\n [token, baseUrl]\n );\n\n const transcribe = useCallback(\n async (blob: Blob): Promise<string> => {\n try {\n return await transcribeAudio(blob, token, baseUrl);\n } catch {\n return \"\";\n }\n },\n [token, baseUrl]\n );\n\n const openReportDialog = useCallback((options?: { description?: string; type?: ReportType }) => {\n if (typeof window !== \"undefined\") {\n window.dispatchEvent(new CustomEvent(\"glitchgrab:open-report\", { detail: options }));\n }\n }, []);\n\n // Global keyboard shortcut: Cmd+Shift+G (Mac) / Ctrl+Shift+G (Windows/Linux)\n useEffect(() => {\n try {\n if (typeof window === \"undefined\") return;\n const handleKeyDown = (e: KeyboardEvent) => {\n if (matchesShortcut(e)) {\n e.preventDefault();\n openReportDialog();\n }\n };\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => window.removeEventListener(\"keydown\", handleKeyDown);\n } catch {\n // Never crash\n }\n }, [openReportDialog]);\n\n // Starts as the non-Mac label so SSR and the first client render agree,\n // then resolves to the real platform label after mount.\n const [shortcutLabel, setShortcutLabel] = useState(GLITCHGRAB_SHORTCUT);\n useEffect(() => {\n setShortcutLabel(getShortcutLabel());\n }, []);\n\n return (\n <GlitchgrabContext.Provider\n value={{\n token,\n baseUrl: baseUrl ?? DEFAULT_BASE_URL,\n reportBug,\n report,\n addBreadcrumb,\n openReportDialog,\n enhanceText: enhance,\n shortcutLabel,\n }}\n >\n <GlitchgrabErrorBoundary\n token={token}\n baseUrl={baseUrl}\n session={session}\n onError={onError}\n fallback={fallback}\n visitedPages={visitedPagesRef.current}\n >\n {children}\n </GlitchgrabErrorBoundary>\n <ReportDialog report={report} enhanceText={enhance} transcribeAudio={transcribe} types={types} showSeverity={showSeverity} />\n </GlitchgrabContext.Provider>\n );\n}\n\nexport function GlitchgrabProvider(props: GlitchgrabProviderProps) {\n // No token = passthrough (SDK disabled)\n if (!props.token) return <>{props.children}</>;\n\n const resolvedProps = {\n ...props,\n baseUrl: props.baseUrl || DEFAULT_BASE_URL,\n };\n\n try {\n return <GlitchgrabProviderInner {...resolvedProps} />;\n } catch {\n return <>{props.children}</>;\n }\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport type { GlitchgrabSession, ReportPayload } from \"./types\";\nimport { captureContext, sendReport } from \"./utils\";\nimport { computeSignature, shouldSkipDuplicate } from \"./dedup\";\n\ninterface ErrorBoundaryProps {\n token: string;\n baseUrl?: string;\n session?: GlitchgrabSession | null;\n onError?: (error: Error) => void;\n fallback?: React.ReactNode;\n visitedPages: string[];\n children: React.ReactNode;\n}\n\ninterface ErrorBoundaryState {\n hasError: boolean;\n}\n\nexport class GlitchgrabErrorBoundary extends React.Component<\n ErrorBoundaryProps,\n ErrorBoundaryState\n> {\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = { hasError: false };\n }\n\n static getDerivedStateFromError(): ErrorBoundaryState {\n return { hasError: true };\n }\n\n componentDidCatch(error: Error, errorInfo: React.ErrorInfo): void {\n try {\n const context = captureContext(this.props.visitedPages);\n\n const sig = computeSignature({\n errorMessage: error.message,\n pageUrl: context.url,\n errorStack: error.stack,\n });\n if (shouldSkipDuplicate(sig)) {\n if (this.props.onError) this.props.onError(error);\n return;\n }\n\n const session = this.props.session;\n const payload: ReportPayload = {\n token: this.props.token,\n source: \"SDK_AUTO\",\n type: \"BUG\",\n errorMessage: error.message,\n errorStack: error.stack,\n componentStack: errorInfo.componentStack ?? undefined,\n pageUrl: context.url,\n userAgent: context.userAgent,\n breadcrumbs: context.breadcrumbs,\n deviceInfo: context.deviceInfo ?? undefined,\n metadata: {\n timestamp: context.timestamp,\n visitedPages: JSON.stringify(context.visitedPages),\n ...(session?.userId ? { sessionUserId: session.userId } : {}),\n ...(session?.name ? { sessionUserName: String(session.name) } : {}),\n ...(session?.email ? { sessionUserEmail: String(session.email) } : {}),\n ...(session?.phone ? { sessionUserPhone: String(session.phone) } : {}),\n },\n };\n\n sendReport(payload, this.props.baseUrl);\n\n if (this.props.onError) {\n this.props.onError(error);\n }\n } catch {\n // Never crash the host app\n }\n }\n\n render(): React.ReactNode {\n if (this.state.hasError) {\n if (this.props.fallback) {\n return this.props.fallback;\n }\n\n // Re-render children — allows recovery from transient errors\n return this.props.children;\n }\n\n return this.props.children;\n }\n}\n","import type { Breadcrumb, BreadcrumbType } from \"./types\";\n\nconst MAX_DEFAULT = 50;\n\nlet breadcrumbs: Breadcrumb[] = [];\nlet maxBreadcrumbs = MAX_DEFAULT;\nlet initialized = false;\n\nexport function initBreadcrumbs(max?: number) {\n if (initialized) return;\n maxBreadcrumbs = max ?? MAX_DEFAULT;\n\n try {\n if (typeof window === \"undefined\") return;\n interceptConsole();\n interceptFetch();\n interceptNavigation();\n interceptClicks();\n initialized = true;\n } catch {\n // Never crash\n }\n}\n\nexport function addBreadcrumb(\n type: BreadcrumbType,\n message: string,\n data?: Record<string, string>\n) {\n try {\n breadcrumbs.push({\n type,\n message: message.slice(0, 200),\n timestamp: new Date().toISOString(),\n data,\n });\n if (breadcrumbs.length > maxBreadcrumbs) {\n breadcrumbs = breadcrumbs.slice(-maxBreadcrumbs);\n }\n } catch {\n // Never crash\n }\n}\n\nexport function getBreadcrumbs(): Breadcrumb[] {\n return [...breadcrumbs];\n}\n\nexport function clearBreadcrumbs() {\n breadcrumbs = [];\n}\n\n// ─── Console Interception ────────────────────────────────\n\nfunction interceptConsole() {\n const origLog = console.log;\n const origWarn = console.warn;\n const origError = console.error;\n\n console.log = function (...args: unknown[]) {\n addBreadcrumb(\"console\", `[log] ${argsToString(args)}`);\n origLog.apply(console, args);\n };\n\n console.warn = function (...args: unknown[]) {\n addBreadcrumb(\"console\", `[warn] ${argsToString(args)}`);\n origWarn.apply(console, args);\n };\n\n console.error = function (...args: unknown[]) {\n addBreadcrumb(\"console\", `[error] ${argsToString(args)}`);\n origError.apply(console, args);\n };\n}\n\nfunction argsToString(args: unknown[]): string {\n try {\n return args\n .map((a) => {\n if (typeof a === \"string\") return a;\n if (a instanceof Error) return a.message;\n try {\n return JSON.stringify(a);\n } catch {\n return String(a);\n }\n })\n .join(\" \")\n .slice(0, 200);\n } catch {\n return \"[unknown]\";\n }\n}\n\n// ─── Fetch Interception ──────────────────────────────────\n\nfunction interceptFetch() {\n const origFetch = window.fetch;\n\n (window.fetch as (input: RequestInfo | URL, init?: RequestInit) => Promise<Response>) = async function (input, init) {\n const url =\n typeof input === \"string\"\n ? input\n : input instanceof URL\n ? input.toString()\n : input instanceof Request\n ? input.url\n : String(input);\n const method = init?.method ?? \"GET\";\n const start = Date.now();\n\n try {\n const response = await origFetch(\n input as Parameters<typeof origFetch>[0],\n init,\n );\n addBreadcrumb(\"api\", `${method} ${url.slice(0, 100)} → ${response.status}`, {\n method,\n status: String(response.status),\n duration: `${Date.now() - start}ms`,\n });\n return response;\n } catch (err) {\n addBreadcrumb(\"api\", `${method} ${url.slice(0, 100)} → FAILED`, {\n method,\n error: err instanceof Error ? err.message : \"unknown\",\n duration: `${Date.now() - start}ms`,\n });\n throw err;\n }\n };\n}\n\n// ─── Navigation Interception ─────────────────────────────\n\nfunction interceptNavigation() {\n const origPush = history.pushState.bind(history);\n const origReplace = history.replaceState.bind(history);\n\n history.pushState = function (...args) {\n origPush(...args);\n addBreadcrumb(\"navigation\", `Navigate to ${window.location.pathname}`);\n };\n\n history.replaceState = function (...args) {\n origReplace(...args);\n addBreadcrumb(\"navigation\", `Replace to ${window.location.pathname}`);\n };\n\n window.addEventListener(\"popstate\", () => {\n addBreadcrumb(\"navigation\", `Back/Forward to ${window.location.pathname}`);\n });\n}\n\n// ─── Click Interception ──────────────────────────────────\n\nfunction interceptClicks() {\n document.addEventListener(\n \"click\",\n (e) => {\n try {\n const target = e.target as HTMLElement;\n const tag = target.tagName?.toLowerCase();\n const text = target.textContent?.trim().slice(0, 50) ?? \"\";\n const id = target.id ? `#${target.id}` : \"\";\n const cls = target.className && typeof target.className === \"string\"\n ? `.${target.className.split(\" \")[0]}`\n : \"\";\n\n addBreadcrumb(\"click\", `Click ${tag}${id}${cls} \"${text}\"`);\n } catch {\n // Never crash\n }\n },\n { capture: true }\n );\n}\n","import type { ReportPayload, ReportResult, CapturedContext, DeviceInfo } from \"./types\";\nimport { getBreadcrumbs } from \"./breadcrumbs\";\n\nconst SENSITIVE_PARAMS = [\n \"token\", \"key\", \"secret\", \"password\", \"passwd\", \"auth\", \"authorization\",\n \"session\", \"sessionid\", \"session_id\", \"api_key\", \"apikey\", \"access_token\",\n \"refresh_token\", \"client_secret\", \"code\", \"state\", \"nonce\", \"credential\", \"private\",\n];\n\nexport function sanitizeUrl(url: string): string {\n try {\n const parsed = new URL(url);\n const params = new URLSearchParams(parsed.search);\n let modified = false;\n for (const key of Array.from(params.keys())) {\n if (SENSITIVE_PARAMS.some((s) => key.toLowerCase().includes(s))) {\n params.set(key, \"[REDACTED]\");\n modified = true;\n }\n }\n if (modified) parsed.search = params.toString();\n return parsed.toString();\n } catch {\n return url.split(\"?\")[0] ?? url;\n }\n}\n\nexport function captureDeviceInfo(): DeviceInfo | null {\n try {\n if (typeof window === \"undefined\") return null;\n return {\n screenWidth: screen.width,\n screenHeight: screen.height,\n viewportWidth: window.innerWidth,\n viewportHeight: window.innerHeight,\n platform: navigator.platform ?? \"unknown\",\n language: navigator.language ?? \"unknown\",\n online: navigator.onLine,\n colorScheme: window.matchMedia(\"(prefers-color-scheme: dark)\").matches ? \"dark\" : \"light\",\n devicePixelRatio: window.devicePixelRatio ?? 1,\n };\n } catch {\n return null;\n }\n}\n\nexport function captureContext(visitedPages: string[]): CapturedContext {\n try {\n return {\n url: sanitizeUrl(typeof window !== \"undefined\" ? window.location.href : \"\"),\n userAgent: typeof navigator !== \"undefined\" ? navigator.userAgent : \"\",\n timestamp: new Date().toISOString(),\n visitedPages: visitedPages.map(sanitizeUrl),\n breadcrumbs: getBreadcrumbs(),\n deviceInfo: captureDeviceInfo(),\n };\n } catch {\n return {\n url: \"\",\n userAgent: \"\",\n timestamp: new Date().toISOString(),\n visitedPages: [],\n breadcrumbs: [],\n deviceInfo: null,\n };\n }\n}\n\nconst DEFAULT_BASE_URL = \"https://glitchgrab.dev\";\nconst MAX_RETRIES = 3;\nconst RETRY_BASE_MS = 500;\n\n/**\n * Send a report and return the result.\n * Never throws — returns null on failure.\n */\nexport async function sendReport(\n payload: ReportPayload,\n baseUrl?: string\n): Promise<ReportResult | null> {\n try {\n const url = `${baseUrl ?? DEFAULT_BASE_URL}/api/v1/sdk/report`;\n const body = JSON.stringify(payload);\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${payload.token}`,\n };\n\n // keepalive has a 64KB body limit in browsers — skip it for large payloads (e.g., screenshots)\n const useKeepalive = body.length < 60_000;\n\n for (let attempt = 0; attempt < MAX_RETRIES; attempt++) {\n try {\n const response = await fetch(url, {\n method: \"POST\",\n headers,\n body,\n ...(useKeepalive ? { keepalive: true } : {}),\n });\n\n if (response.ok) {\n const envelope = (await response.json()) as {\n success: boolean;\n data?: Omit<ReportResult, \"success\">;\n };\n return { success: envelope.success, ...(envelope.data ?? {}) };\n }\n\n if (response.status >= 400 && response.status < 500 && response.status !== 429) {\n return null;\n }\n } catch {\n // Will retry\n }\n\n if (attempt < MAX_RETRIES - 1) {\n await new Promise((resolve) =>\n setTimeout(resolve, RETRY_BASE_MS * Math.pow(2, attempt))\n );\n }\n }\n\n // Fallback: sendBeacon (fire-and-forget, no result)\n if (typeof navigator !== \"undefined\" && navigator.sendBeacon) {\n try {\n navigator.sendBeacon(url, new Blob([body], { type: \"application/json\" }));\n } catch {\n // Silently fail\n }\n }\n\n return null;\n } catch {\n return null;\n }\n}\n\nexport interface EnhanceContext {\n url?: string;\n visitedPages?: string[];\n breadcrumbs?: Array<{ type: string; message: string }>;\n}\n\n/**\n * Polish raw description text via the Glitchgrab AI enhance endpoint.\n * Returns the polished text on success, or the original text on any failure.\n * Never throws.\n */\nexport async function enhanceText(\n text: string,\n token: string,\n baseUrl?: string,\n screenshot?: string | null,\n context?: EnhanceContext | null\n): Promise<string> {\n try {\n const trimmed = text.trim();\n if (!trimmed) return text;\n const url = `${baseUrl ?? DEFAULT_BASE_URL}/api/v1/ai/enhance-text`;\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${token}`,\n },\n body: JSON.stringify({\n text: trimmed,\n ...(screenshot ? { screenshot } : {}),\n ...(context ? { context } : {}),\n }),\n });\n if (!response.ok) return text;\n const envelope = (await response.json()) as {\n success: boolean;\n data?: { text?: string };\n };\n if (envelope?.success && typeof envelope.data?.text === \"string\") {\n return envelope.data.text;\n }\n return text;\n } catch {\n return text;\n }\n}\n\n/**\n * Send an audio Blob to the Glitchgrab STT proxy (which calls Sarvam).\n * Returns the transcript string, or \"\" on any failure. Never throws.\n */\nexport async function transcribeAudio(\n blob: Blob,\n token: string,\n baseUrl?: string\n): Promise<string> {\n try {\n if (blob.size === 0) return \"\";\n const url = `${baseUrl ?? DEFAULT_BASE_URL}/api/v1/sdk/stt`;\n const form = new FormData();\n form.append(\"file\", blob, \"audio.webm\");\n const response = await fetch(url, {\n method: \"POST\",\n headers: { Authorization: `Bearer ${token}` },\n body: form,\n });\n if (!response.ok) return \"\";\n const envelope = (await response.json()) as {\n success: boolean;\n data?: { transcript?: string };\n };\n if (envelope?.success && typeof envelope.data?.transcript === \"string\") {\n return envelope.data.transcript;\n }\n return \"\";\n } catch {\n return \"\";\n }\n}\n","const DEFAULT_WINDOW_MS = 5 * 60 * 1000;\nconst MAX_ENTRIES = 100;\n\nconst seen = new Map<string, number>();\n\nfunction hashString(input: string): string {\n let h1 = 0xdeadbeef ^ 0;\n let h2 = 0x41c6ce57 ^ 0;\n for (let i = 0; i < input.length; i++) {\n const ch = input.charCodeAt(i);\n h1 = Math.imul(h1 ^ ch, 2654435761);\n h2 = Math.imul(h2 ^ ch, 1597334677);\n }\n h1 = Math.imul(h1 ^ (h1 >>> 16), 2246822507) ^ Math.imul(h2 ^ (h2 >>> 13), 3266489909);\n h2 = Math.imul(h2 ^ (h2 >>> 16), 2246822507) ^ Math.imul(h1 ^ (h1 >>> 13), 3266489909);\n return (4294967296 * (2097151 & h2) + (h1 >>> 0)).toString(36);\n}\n\nfunction topStackFrame(stack: string | undefined): string {\n if (!stack) return \"\";\n const lines = stack.split(\"\\n\");\n for (const line of lines) {\n const t = line.trim();\n if (t.startsWith(\"at \") || t.includes(\"@\")) {\n return t;\n }\n }\n return \"\";\n}\n\nfunction stripUrlQuery(url: string | undefined): string {\n if (!url) return \"\";\n try {\n const u = new URL(url);\n return `${u.origin}${u.pathname}`;\n } catch {\n const q = url.indexOf(\"?\");\n return q === -1 ? url : url.slice(0, q);\n }\n}\n\nexport function computeSignature(params: {\n errorMessage: string | undefined;\n pageUrl: string | undefined;\n errorStack?: string | undefined;\n}): string {\n const msg = params.errorMessage?.trim() ?? \"\";\n const page = stripUrlQuery(params.pageUrl);\n const frame = topStackFrame(params.errorStack);\n return hashString(`${msg}|${page}|${frame}`);\n}\n\nexport function shouldSkipDuplicate(\n signature: string,\n windowMs: number = DEFAULT_WINDOW_MS,\n now: number = Date.now()\n): boolean {\n const last = seen.get(signature);\n if (last !== undefined && now - last < windowMs) {\n return true;\n }\n seen.set(signature, now);\n\n if (seen.size > MAX_ENTRIES) {\n const cutoff = now - windowMs;\n for (const [sig, ts] of seen) {\n if (ts < cutoff) seen.delete(sig);\n }\n if (seen.size > MAX_ENTRIES) {\n const excess = seen.size - MAX_ENTRIES;\n const keys = Array.from(seen.keys()).slice(0, excess);\n for (const k of keys) seen.delete(k);\n }\n }\n return false;\n}\n\nexport function clearDedupCache(): void {\n seen.clear();\n}\n","\"use client\";\n\nimport {\n useState,\n useRef,\n useEffect,\n type CSSProperties,\n type ReactNode,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { AnnotationCanvas } from \"./annotation-canvas\";\nimport { getShortcutLabel } from \"./shortcut\";\nimport type { ReportType, ReportSeverity, UseGlitchgrabReturn } from \"./types\";\n\n/** Detect if the host page uses a dark or light theme */\nfunction useIsDark(): boolean {\n if (typeof window === \"undefined\") return true;\n try {\n // Check body then html — most sites set background on html, not body\n for (const el of [document.body, document.documentElement]) {\n const bg = getComputedStyle(el).backgroundColor;\n const match = bg.match(\n /rgba?\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)(?:\\s*,\\s*([\\d.]+))?\\s*\\)/,\n );\n if (match) {\n const alpha = match[4] !== undefined ? parseFloat(match[4]) : 1;\n if (alpha < 0.05) continue; // transparent — skip to next element\n const [r, g, b] = [\n Number(match[1]),\n Number(match[2]),\n Number(match[3]),\n ];\n return (r * 299 + g * 587 + b * 114) / 1000 < 128;\n }\n }\n return window.matchMedia(\"(prefers-color-scheme: dark)\").matches;\n } catch {\n return true;\n }\n}\n\n/** Convert HSL values to a hex color string */\nfunction hslToHex(h: number, s: number, l: number): string {\n s /= 100;\n l /= 100;\n const a = s * Math.min(l, 1 - l);\n const f = (n: number) => {\n const k = (n + h / 30) % 12;\n const color = l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);\n return Math.round(255 * color)\n .toString(16)\n .padStart(2, \"0\");\n };\n return `#${f(0)}${f(8)}${f(4)}`;\n}\n\n/** Parse a CSS color value into [r, g, b] or null */\nfunction parseColorToRgb(value: string): [number, number, number] | null {\n try {\n const trimmed = value.trim();\n\n // hex (#fff, #ffffff)\n const hexMatch = trimmed.match(/^#([0-9a-f]{3,8})$/i);\n if (hexMatch) {\n let hex = hexMatch[1];\n if (hex.length === 3)\n hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2];\n return [\n parseInt(hex.slice(0, 2), 16),\n parseInt(hex.slice(2, 4), 16),\n parseInt(hex.slice(4, 6), 16),\n ];\n }\n\n // rgb(r, g, b) or rgba(r, g, b, a)\n const rgbMatch = trimmed.match(/rgba?\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)/);\n if (rgbMatch)\n return [Number(rgbMatch[1]), Number(rgbMatch[2]), Number(rgbMatch[3])];\n\n // hsl(h, s%, l%) or hsla(h, s%, l%, a)\n const hslMatch = trimmed.match(\n /hsla?\\(\\s*([\\d.]+)\\s*,\\s*([\\d.]+)%\\s*,\\s*([\\d.]+)%/,\n );\n if (hslMatch) {\n const hex = hslToHex(\n Number(hslMatch[1]),\n Number(hslMatch[2]),\n Number(hslMatch[3]),\n );\n return parseColorToRgb(hex);\n }\n\n return null;\n } catch {\n return null;\n }\n}\n\n/** Compute relative luminance and return ideal contrast text color */\nfunction getContrastText(r: number, g: number, b: number): string {\n const luminance = (r * 299 + g * 587 + b * 114) / 1000;\n return luminance > 150 ? \"#09090b\" : \"#ffffff\";\n}\n\n/**\n * Auto-detect the host app's primary/accent color from CSS custom properties.\n * Checks common variable names used by shadcn/ui, Radix, Tailwind, MUI, etc.\n * Returns { accent, accentText } or null if no theme detected.\n */\nfunction detectHostAccent(): { accent: string; accentText: string } | null {\n if (typeof window === \"undefined\") return null;\n try {\n const root = getComputedStyle(document.documentElement);\n\n // Common CSS variable names for primary/accent color\n const varNames = [\n \"--primary\",\n \"--accent\",\n \"--brand\",\n \"--color-primary\",\n \"--theme-primary\",\n \"--chakra-colors-primary-500\",\n \"--mui-palette-primary-main\",\n ];\n\n for (const name of varNames) {\n const raw = root.getPropertyValue(name).trim();\n if (!raw) continue;\n\n // shadcn/ui style: space-separated HSL values like \"243 75% 59%\"\n const hslSpaceMatch = raw.match(/^([\\d.]+)\\s+([\\d.]+)%\\s+([\\d.]+)%$/);\n if (hslSpaceMatch) {\n const hex = hslToHex(\n Number(hslSpaceMatch[1]),\n Number(hslSpaceMatch[2]),\n Number(hslSpaceMatch[3]),\n );\n const rgb = parseColorToRgb(hex);\n return {\n accent: hex,\n accentText: rgb ? getContrastText(...rgb) : \"#ffffff\",\n };\n }\n\n // Standard color values (hex, rgb, hsl)\n const rgb = parseColorToRgb(raw);\n if (rgb) {\n const hex = `#${rgb.map((c) => c.toString(16).padStart(2, \"0\")).join(\"\")}`;\n return { accent: hex, accentText: getContrastText(...rgb) };\n }\n }\n\n return null;\n } catch {\n return null;\n }\n}\n\nfunction getTheme(dark: boolean) {\n const hostAccent = detectHostAccent();\n const defaults = dark\n ? {\n bg: \"#1c1c1e\",\n bgSecondary: \"#27272a\",\n border: \"#2c2c2e\",\n text: \"#fafafa\",\n textMuted: \"#a1a1aa\",\n accent: \"#22d3ee\",\n accentText: \"#09090b\",\n inputBg: \"#27272a\",\n inputBorder: \"#3f3f46\",\n }\n : {\n bg: \"#ffffff\",\n bgSecondary: \"#f4f4f5\",\n border: \"#e4e4e7\",\n text: \"#18181b\",\n textMuted: \"#71717a\",\n accent: \"#0891b2\",\n accentText: \"#ffffff\",\n inputBg: \"#fafafa\",\n inputBorder: \"#d4d4d8\",\n };\n\n if (hostAccent) {\n defaults.accent = hostAccent.accent;\n defaults.accentText = hostAccent.accentText;\n }\n\n return defaults;\n}\n\n/** Validate that report text is meaningful — rejects gibberish, throwaway words, random chars */\nfunction isLowQualityText(text: string): string | null {\n const trimmed = text.trim();\n if (!trimmed) return null;\n\n // Exact throwaway words\n const throwaway =\n /^(done|ok|yes|no|hi|hello|hey|test|testing|asdf|qwerty|abc|xyz|foo|bar|baz|lol|lmao|idk|bruh|nice|cool|wow|sup|yo|nah|yep|nope|thanks|thx|ty|k|kk|hmm|hm|na|mm|mhm|aight|bet|gg|wp|rip|omg|pls|plz)$/i;\n if (throwaway.test(trimmed)) {\n return \"Please describe the actual issue you're experiencing\";\n }\n\n // Repeated characters (aaaaaaa, !!!!!!!)\n if (/(.)\\1{4,}/.test(trimmed)) {\n return \"Please provide a meaningful description\";\n }\n\n const letters = trimmed.replace(/[^a-zA-Z]/g, \"\");\n if (letters.length >= 4) {\n // Very low vowel ratio (bkdfghjklmn...)\n const vowels = letters.replace(/[^aeiouAEIOU]/g, \"\").length;\n const vowelRatio = vowels / letters.length;\n if (vowelRatio < 0.08) {\n return \"That doesn't look like a valid description\";\n }\n\n // Keyboard mashing: single word with no real English pattern\n // Detects strings like \"asdfasfsdad\", \"jkljklfsdf\", \"qwertyuio\"\n // Real words have max 3-4 consecutive consonants; gibberish has long runs\n if (/[^aeiou\\s]{5,}/i.test(letters)) {\n const words = trimmed.split(/\\s+/);\n // Only flag if it's a single \"word\" — multi-word text is likely real\n if (words.length <= 2) {\n return \"That doesn't look like a valid description\";\n }\n }\n\n // Check if it looks like a random permutation of a few chars (asdfasfsdad)\n if (letters.length >= 6) {\n const uniqueChars = new Set(letters.toLowerCase()).size;\n const uniqueRatio = uniqueChars / letters.length;\n // Real English has ~0.6-0.9 unique ratio for short text; gibberish reuses few chars\n if (uniqueRatio < 0.4 && trimmed.split(/\\s+/).length <= 2) {\n return \"That doesn't look like a valid description\";\n }\n }\n }\n\n // Single short word that isn't a known tech term\n const words = trimmed.split(/\\s+/).filter((w) => w.length > 0);\n if (words.length === 1 && trimmed.length < 10) {\n const techTerms =\n /^(crash|error|bug|fail|broken|slow|freeze|lag|404|500|null|undefined|nan|timeout|overflow|leak|cors|oom)$/i;\n if (!techTerms.test(trimmed)) {\n return \"Please provide more detail about the issue\";\n }\n }\n\n return null;\n}\n\ninterface ReportDialogProps {\n report: UseGlitchgrabReturn[\"report\"];\n enhanceText?: UseGlitchgrabReturn[\"enhanceText\"];\n transcribeAudio?: (blob: Blob) => Promise<string>;\n types?: ReportType[];\n showSeverity?: boolean;\n}\n\n/**\n * The report dialog — rendered inside GlitchgrabProvider automatically.\n * Opens via the `glitchgrab:open-report` custom event (triggered by `openReportDialog()`).\n */\nexport function ReportDialog({\n report,\n enhanceText,\n transcribeAudio,\n types,\n showSeverity = true,\n}: ReportDialogProps) {\n const [isEnhancing, setIsEnhancing] = useState(false);\n const [isEnhanced, setIsEnhanced] = useState(false);\n const [originalDescription, setOriginalDescription] = useState<string | null>(\n null,\n );\n const [isListening, setIsListening] = useState(false);\n const [isTranscribing, setIsTranscribing] = useState(false);\n const [voiceError, setVoiceError] = useState<string | null>(null);\n const [screenshotDragOver, setScreenshotDragOver] = useState(false);\n // Prevent hydration mismatch — render nothing until after hydration\n const [mounted, setMounted] = useState(false);\n useEffect(() => {\n setMounted(true);\n }, []);\n\n const [isOpen, setIsOpen] = useState(false);\n const [description, setDescription] = useState(\"\");\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [submitted, setSubmitted] = useState(false);\n const [screenshots, setScreenshots] = useState<string[]>([]);\n const [attachments, setAttachments] = useState<\n { name: string; size: number; dataUrl: string }[]\n >([]);\n const [previewIndex, setPreviewIndex] = useState<number | null>(null);\n const [annotatingIndex, setAnnotatingIndex] = useState<number | null>(null);\n const fileInputRef = useRef<HTMLInputElement>(null);\n const modalRef = useRef<HTMLDivElement>(null);\n const previewImgRef = useRef<HTMLDivElement>(null);\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const recognitionRef = useRef<any>(null);\n const voiceBaseRef = useRef(\"\");\n const usingWebSpeechRef = useRef(false);\n const textBeforeVoiceRef = useRef(\"\");\n const mediaRecorderRef = useRef<MediaRecorder | null>(null);\n const streamRef = useRef<MediaStream | null>(null);\n const sarvamChunksRef = useRef<Blob[]>([]);\n const spaceTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const isPushToTalkRef = useRef(false);\n\n // When open, set inert on any host Radix/shadcn dialogs so their FocusScope\n // doesn't steal focus back from GlitchGrab's textarea via focusout interception.\n useEffect(() => {\n if (!isOpen) return;\n const dialogs = Array.from(\n document.querySelectorAll<HTMLElement>(\n '[role=\"dialog\"][data-state=\"open\"]',\n ),\n );\n dialogs.forEach((d) => d.setAttribute(\"inert\", \"\"));\n return () => dialogs.forEach((d) => d.removeAttribute(\"inert\"));\n }, [isOpen]);\n\n // Stepper state\n const [step, setStep] = useState<1 | 2>(1);\n const [reportType, setReportType] = useState<ReportType>(\"BUG\");\n const [severity, setSeverity] = useState<ReportSeverity>(\"medium\");\n const [validationError, setValidationError] = useState<string | null>(null);\n const [placeholderIdx, setPlaceholderIdx] = useState(0);\n\n const availableTypes: ReportType[] = types ?? [\n \"BUG\",\n \"FEATURE_REQUEST\",\n \"UI_IMPROVEMENT\",\n \"PERFORMANCE\",\n \"SECURITY\",\n \"QUESTION\",\n \"OTHER\",\n ];\n\n const isDark = useIsDark();\n const t = getTheme(isDark);\n\n const handleFileUpload = (e: React.ChangeEvent<HTMLInputElement>) => {\n const files = e.target.files;\n if (!files || files.length === 0) return;\n addFiles(Array.from(files));\n e.target.value = \"\";\n };\n\n const addFiles = (files: File[]) => {\n files.forEach((file) => {\n const reader = new FileReader();\n if (file.type.startsWith(\"image/\")) {\n reader.onload = () => {\n setScreenshots((prev) => [...prev, reader.result as string]);\n };\n } else {\n reader.onload = () => {\n setAttachments((prev) => [\n ...prev,\n { name: file.name, size: file.size, dataUrl: reader.result as string },\n ]);\n };\n }\n reader.readAsDataURL(file);\n });\n };\n\n const retakeScreenshot = async () => {\n setPreviewIndex(null);\n setIsOpen(false);\n setScreenshots([]);\n await new Promise((r) => setTimeout(r, 300));\n try {\n const { default: html2canvas } = await import(\"html2canvas-pro\");\n const canvas = await html2canvas(document.body, {\n scale: 0.5,\n logging: false,\n useCORS: true,\n allowTaint: true,\n x: window.scrollX,\n y: window.scrollY,\n width: window.innerWidth,\n height: window.innerHeight,\n windowWidth: window.innerWidth,\n windowHeight: window.innerHeight,\n });\n setScreenshots([canvas.toDataURL(\"image/jpeg\", 0.6)]);\n } catch {\n // silently fail\n }\n setIsOpen(true);\n };\n\n const handleOpen = async () => {\n setSubmitted(false);\n if (availableTypes.length === 1) {\n setReportType(availableTypes[0]);\n setStep(2);\n }\n try {\n const { default: html2canvas } = await import(\"html2canvas-pro\");\n const canvas = await html2canvas(document.body, {\n scale: 0.5,\n logging: false,\n useCORS: true,\n allowTaint: true,\n x: window.scrollX,\n y: window.scrollY,\n width: window.innerWidth,\n height: window.innerHeight,\n windowWidth: window.innerWidth,\n windowHeight: window.innerHeight,\n });\n setScreenshots([canvas.toDataURL(\"image/jpeg\", 0.6)]);\n } catch {\n // screenshot failed — open without it\n }\n setIsOpen(true);\n };\n\n // Listen for programmatic open via openReportDialog()\n useEffect(() => {\n const handler = (e: Event) => {\n if (isOpen) return;\n const detail = (e as CustomEvent).detail;\n if (detail?.description) setDescription(detail.description);\n if (detail?.type) {\n setReportType(detail.type);\n setStep(2);\n }\n handleOpen();\n };\n window.addEventListener(\"glitchgrab:open-report\", handler);\n return () => window.removeEventListener(\"glitchgrab:open-report\", handler);\n }, [isOpen, handleOpen]);\n\n // Close on Escape\n useEffect(() => {\n if (!isOpen) return;\n const handleEsc = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n if (previewIndex !== null) setPreviewIndex(null);\n else handleClose();\n }\n };\n document.addEventListener(\"keydown\", handleEsc);\n return () => document.removeEventListener(\"keydown\", handleEsc);\n }, [isOpen, previewIndex]);\n\n // Close screenshot preview on outside click. Registered in the CAPTURE phase\n // so it fires before the host page's own outside-click handlers (e.g. Radix\n // DismissableLayer) can stop the event from ever bubbling to our onClick.\n useEffect(() => {\n if (previewIndex === null || annotatingIndex !== null) return;\n const handlePointerDown = (e: PointerEvent) => {\n if (!previewImgRef.current?.contains(e.target as Node)) {\n setPreviewIndex(null);\n }\n };\n document.addEventListener(\"pointerdown\", handlePointerDown, true);\n return () =>\n document.removeEventListener(\"pointerdown\", handlePointerDown, true);\n }, [previewIndex, annotatingIndex]);\n\n // Paste image from clipboard (Cmd+V / Ctrl+V) when dialog is open\n useEffect(() => {\n if (!isOpen) return;\n const handlePaste = (e: ClipboardEvent) => {\n try {\n const items = e.clipboardData?.items;\n if (!items) return;\n let matched = false;\n for (let i = 0; i < items.length; i++) {\n if (items[i].type.startsWith(\"image/\")) {\n const file = items[i].getAsFile();\n if (!file) continue;\n matched = true;\n const reader = new FileReader();\n reader.onload = () =>\n setScreenshots((prev) => [...prev, reader.result as string]);\n reader.readAsDataURL(file);\n }\n }\n if (matched) e.preventDefault();\n } catch {\n // silently fail\n }\n };\n window.addEventListener(\"paste\", handlePaste);\n return () => window.removeEventListener(\"paste\", handlePaste);\n }, [isOpen]);\n\n useEffect(() => {\n if (!isOpen || !transcribeAudio) return;\n const id = setInterval(() => {\n setPlaceholderIdx((i) => (i + 1) % 2);\n }, 3000);\n return () => clearInterval(id);\n }, [isOpen, transcribeAudio]);\n\n const stopVoice = () => {\n usingWebSpeechRef.current = false;\n recognitionRef.current?.stop();\n recognitionRef.current = null;\n sarvamChunksRef.current = [];\n const stream = streamRef.current;\n streamRef.current = null;\n stream?.getTracks().forEach((t) => t.stop());\n try { mediaRecorderRef.current?.stop(); } catch { /* ignore */ }\n mediaRecorderRef.current = null;\n setIsListening(false);\n setIsTranscribing(false);\n };\n\n const stopListeningAndTranscribe = () => {\n usingWebSpeechRef.current = false;\n recognitionRef.current?.stop();\n recognitionRef.current = null;\n setIsListening(false);\n try { mediaRecorderRef.current?.stop(); } catch { /* ignore */ }\n };\n\n const handleClose = () => {\n stopVoice();\n setIsOpen(false);\n setStep(1);\n setReportType(\"BUG\");\n setSeverity(\"medium\");\n setValidationError(null);\n setVoiceError(null);\n setIsEnhanced(false);\n setOriginalDescription(null);\n };\n\n const toggleVoice = async () => {\n if (isListening) {\n stopListeningAndTranscribe();\n return;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const SpeechRec: (new () => any) | undefined = (typeof window !== \"undefined\")\n ? ((window as any).SpeechRecognition || (window as any).webkitSpeechRecognition)\n : undefined;\n\n // Get mic stream for MediaRecorder (Sarvam final accurate result)\n let stream: MediaStream | null = null;\n try {\n stream = await navigator.mediaDevices.getUserMedia({ audio: true });\n } catch (err) {\n const isDenied = err instanceof DOMException && (err.name === \"NotAllowedError\" || err.name === \"PermissionDeniedError\");\n if (!SpeechRec || isDenied) { setVoiceError(\"Microphone access denied\"); return; }\n }\n\n if (stream && transcribeAudio) {\n streamRef.current = stream;\n sarvamChunksRef.current = [];\n textBeforeVoiceRef.current = description;\n\n const rec = new MediaRecorder(stream);\n mediaRecorderRef.current = rec;\n rec.ondataavailable = (e) => { if (e.data.size > 0) sarvamChunksRef.current.push(e.data); };\n rec.onstop = async () => {\n stream!.getTracks().forEach((t) => t.stop());\n if (streamRef.current === stream) streamRef.current = null;\n mediaRecorderRef.current = null;\n const chunks = sarvamChunksRef.current;\n sarvamChunksRef.current = [];\n if (!chunks.length || !transcribeAudio) return;\n setIsTranscribing(true);\n try {\n const blob = new Blob(chunks, { type: rec.mimeType || \"audio/webm\" });\n const text = await transcribeAudio(blob);\n if (text.trim()) {\n const sep = textBeforeVoiceRef.current.trim() ? \" \" : \"\";\n // Replace live Web Speech preview with accurate Sarvam result\n setDescription(textBeforeVoiceRef.current + sep + text.trim());\n setValidationError(null);\n setIsEnhanced(false);\n setOriginalDescription(null);\n }\n } catch { /* keep Web Speech result on failure */ }\n setIsTranscribing(false);\n };\n rec.start();\n }\n\n if (SpeechRec) {\n setVoiceError(null);\n usingWebSpeechRef.current = true;\n voiceBaseRef.current = description;\n textBeforeVoiceRef.current = description;\n const recognition = new SpeechRec();\n recognition.lang = \"en-IN\";\n recognition.interimResults = true;\n recognition.continuous = true;\n recognitionRef.current = recognition;\n\n recognition.onstart = () => setIsListening(true);\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n recognition.onresult = (event: any) => {\n let finalText = \"\";\n let interimText = \"\";\n for (let i = event.resultIndex; i < event.results.length; i++) {\n const text = event.results[i][0].transcript;\n if (event.results[i].isFinal) finalText += text;\n else interimText += text;\n }\n if (finalText) {\n const sep = voiceBaseRef.current.trim() ? \" \" : \"\";\n voiceBaseRef.current += sep + finalText.trim();\n }\n const liveText = interimText\n ? voiceBaseRef.current + (voiceBaseRef.current.trim() ? \" \" : \"\") + interimText\n : voiceBaseRef.current;\n setDescription(liveText);\n setValidationError(null);\n };\n\n recognition.onend = () => {\n if (usingWebSpeechRef.current && recognitionRef.current === recognition) {\n try { recognition.start(); } catch { /* ignore */ }\n } else {\n setIsListening(false);\n }\n };\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n recognition.onerror = (event: any) => {\n if (event.error === \"aborted\" || event.error === \"no-speech\") return;\n const isDenied = event.error === \"not-allowed\" || event.error === \"audio-capture\";\n setVoiceError(isDenied ? \"Microphone access denied\" : \"Speech recognition not available — try Chrome\");\n usingWebSpeechRef.current = false;\n recognitionRef.current = null;\n setIsListening(false);\n };\n\n recognition.start();\n } else if (stream) {\n // Firefox: Sarvam-only, no live preview\n setVoiceError(null);\n setIsListening(true);\n }\n };\n\n const handleSpaceDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.code !== \"Space\") return;\n // Recording or already-committed to push-to-talk — swallow the space\n if (isListening || isPushToTalkRef.current) {\n e.preventDefault();\n return;\n }\n // Auto-repeat from a held key, or a timer already pending — let the browser\n // type normally; we only care about the first keydown of a hold.\n if (e.repeat || !transcribeAudio || isTranscribing || spaceTimerRef.current)\n return;\n\n // Don't preventDefault: let the browser insert the space natively so the\n // cursor stays exactly where the user typed it. If the hold matures into\n // push-to-talk, strip that space back out below.\n const pos = e.currentTarget.selectionStart ?? description.length;\n spaceTimerRef.current = setTimeout(() => {\n spaceTimerRef.current = null;\n isPushToTalkRef.current = true;\n setDescription((prev) =>\n prev[pos] === \" \" ? prev.slice(0, pos) + prev.slice(pos + 1) : prev,\n );\n requestAnimationFrame(() => {\n if (textareaRef.current) {\n textareaRef.current.selectionStart = pos;\n textareaRef.current.selectionEnd = pos;\n }\n });\n void toggleVoice();\n }, 400);\n };\n\n const handleSpaceUp = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.code !== \"Space\") return;\n if (spaceTimerRef.current) {\n // Quick tap — space was already typed natively, nothing to do.\n clearTimeout(spaceTimerRef.current);\n spaceTimerRef.current = null;\n }\n if (isPushToTalkRef.current) {\n isPushToTalkRef.current = false;\n stopListeningAndTranscribe();\n }\n };\n\n const handleSubmit = async () => {\n try {\n if (!description.trim() || isSubmitting) return;\n\n const qualityError = isLowQualityText(description);\n if (qualityError) {\n setValidationError(qualityError);\n setStep(2);\n return;\n }\n\n setIsSubmitting(true);\n const metadata: Record<string, string> = {};\n if (screenshots.length > 0) metadata.screenshots = JSON.stringify(screenshots);\n if (attachments.length > 0) metadata.attachments = JSON.stringify(attachments);\n if (showSeverity && reportType === \"BUG\") {\n metadata.severity = severity;\n }\n\n const result = await report(\n reportType,\n description.trim(),\n Object.keys(metadata).length > 0 ? metadata : undefined,\n );\n\n if (result) {\n setSubmitted(true);\n setDescription(\"\");\n setScreenshots([]);\n setAttachments([]);\n\n setTimeout(() => {\n setSubmitted(false);\n handleClose();\n }, 2000);\n }\n setIsSubmitting(false);\n } catch {\n setIsSubmitting(false);\n }\n };\n\n if (!mounted) return null;\n\n return (\n <>\n {/* Keyframes for REC pulse — injected once when open */}\n {isOpen &&\n createPortal(\n <style>{`\n @keyframes gg-pulse{0%,100%{opacity:1}50%{opacity:0.35}}\n @keyframes gg-b1{0%,100%{height:3px}40%{height:13px}}\n @keyframes gg-b2{0%,100%{height:8px}50%{height:3px}}\n @keyframes gg-b3{0%,100%{height:4px}30%{height:14px}70%{height:5px}}\n @keyframes gg-b4{0%,100%{height:6px}60%{height:13px}}\n @keyframes gg-bug-crawl{0%,100%{transform:translateX(0) rotate(0deg)}20%{transform:translateX(-1.5px) rotate(-6deg)}40%{transform:translateX(1.5px) rotate(5deg)}60%{transform:translateX(-1px) rotate(-4deg)}80%{transform:translateX(1px) rotate(3deg)}}\n @keyframes gg-star-spin{0%,100%{transform:scale(1) rotate(0deg)}50%{transform:scale(1.15) rotate(15deg)}}\n @keyframes gg-ui-grow{0%,100%{transform:scaleY(1)}50%{transform:scaleY(1.12)}}\n @keyframes gg-perf-sweep{0%,100%{transform:rotate(0deg)}30%{transform:rotate(-12deg)}70%{transform:rotate(10deg)}}\n @keyframes gg-shield-pulse{0%,100%{transform:scale(1);opacity:1}50%{transform:scale(1.08);opacity:.75}}\n @keyframes gg-question-shake{0%,100%{transform:rotate(0deg)}25%{transform:rotate(-7deg)}75%{transform:rotate(7deg)}}\n @keyframes gg-chat-tilt{0%,100%{transform:rotate(0deg) translateY(0)}50%{transform:rotate(-6deg) translateY(-2px)}}\n button[data-gg-type] > svg{transform-origin:center}\n button[data-gg-type=\"BUG\"] > svg{animation:gg-bug-crawl 2.2s ease-in-out infinite}\n button[data-gg-type=\"FEATURE_REQUEST\"] > svg{animation:gg-star-spin 2.6s ease-in-out infinite}\n button[data-gg-type=\"UI_IMPROVEMENT\"] > svg{animation:gg-ui-grow 1.8s ease-in-out infinite;transform-origin:bottom}\n button[data-gg-type=\"PERFORMANCE\"] > svg{animation:gg-perf-sweep 2.4s ease-in-out infinite}\n button[data-gg-type=\"SECURITY\"] > svg{animation:gg-shield-pulse 2.2s ease-in-out infinite;transform-origin:top}\n button[data-gg-type=\"QUESTION\"] > svg{animation:gg-question-shake 2s ease-in-out infinite}\n button[data-gg-type=\"OTHER\"] > svg{animation:gg-chat-tilt 2.2s ease-in-out infinite}\n `}</style>,\n document.body,\n )}\n {/* Report modal */}\n {isOpen &&\n createPortal(\n <div\n style={{\n position: \"fixed\",\n inset: 0,\n zIndex: 2147483647,\n pointerEvents: \"auto\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n backgroundColor: \"rgba(0,0,0,0.5)\",\n fontFamily:\n '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n }}\n onClick={() => {\n if (previewIndex === null) handleClose();\n }}\n onPointerDown={(e) => e.stopPropagation()}\n onFocus={(e) => e.stopPropagation()}\n >\n <div\n ref={modalRef}\n onClick={(e) => e.stopPropagation()}\n style={{\n position: \"relative\",\n zIndex: 2147483647,\n width: \"340px\",\n maxWidth: \"calc(100% - 32px)\",\n maxHeight: \"calc(100dvh - 32px)\",\n display: \"flex\",\n flexDirection: \"column\",\n backgroundColor: t.bg,\n borderRadius: \"12px\",\n boxShadow:\n \"0 20px 60px rgba(0, 0, 0, 0.2), 0 4px 16px rgba(0, 0, 0, 0.1)\",\n fontFamily:\n '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n overflow: \"hidden\",\n color: t.text,\n isolation: \"isolate\",\n }}\n >\n {/* Header */}\n <div\n style={{\n flexShrink: 0,\n padding: \"16px 16px 12px\",\n borderBottom: `1px solid ${t.border}`,\n }}\n >\n <div\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"8px\",\n }}\n >\n {step > 1 && (\n <button\n type=\"button\"\n onClick={() => setStep((s) => (s - 1) as 1 | 2)}\n style={{\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n padding: \"2px\",\n display: \"flex\",\n alignItems: \"center\",\n }}\n aria-label=\"Back\"\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n >\n <path\n d=\"M10 3L5 8L10 13\"\n stroke={t.textMuted}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n )}\n <span\n style={{\n fontSize: \"15px\",\n fontWeight: 600,\n color: t.text,\n }}\n >\n {step === 1 ? \"What's on your mind?\" : \"Tell us more\"}\n </span>\n </div>\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"8px\",\n }}\n >\n {step === 1 && (\n <span\n title=\"Press this anywhere to open Glitchgrab\"\n style={{\n fontSize: \"10px\",\n fontWeight: 600,\n lineHeight: 1,\n padding: \"3px 6px\",\n borderRadius: \"4px\",\n border: `1px solid ${t.inputBorder}`,\n background: t.inputBg,\n color: t.textMuted,\n whiteSpace: \"nowrap\",\n }}\n >\n {getShortcutLabel()}\n </span>\n )}\n <button\n type=\"button\"\n onClick={handleClose}\n style={{\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n padding: \"4px\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n aria-label=\"Close\"\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n style={{ display: \"block\" }}\n >\n <path\n d=\"M4 4L12 12M12 4L4 12\"\n stroke={t.textMuted}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n </svg>\n </button>\n </div>\n </div>\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: \"0\",\n marginTop: \"12px\",\n }}\n >\n {[1, 2].map((s, i) => (\n <div\n key={s}\n style={{ display: \"flex\", alignItems: \"center\" }}\n >\n <div\n style={{\n width: \"8px\",\n height: \"8px\",\n borderRadius: \"50%\",\n backgroundColor: s <= step ? t.accent : t.inputBorder,\n transition: \"background-color 0.2s ease\",\n }}\n />\n {i < 1 && (\n <div\n style={{\n width: \"40px\",\n height: \"2px\",\n backgroundColor:\n s < step ? t.accent : t.inputBorder,\n transition: \"background-color 0.2s ease\",\n }}\n />\n )}\n </div>\n ))}\n </div>\n </div>\n\n {/* Body */}\n <div\n style={{\n padding: \"16px\",\n overflowY: \"auto\",\n flex: \"1 1 auto\",\n minHeight: 0,\n }}\n >\n {submitted ? (\n <div\n style={{\n textAlign: \"center\",\n padding: \"20px 0\",\n color: t.accent,\n fontSize: \"14px\",\n fontWeight: 500,\n }}\n >\n {getTypeLabel(reportType)} sent. Thank you!\n </div>\n ) : (\n <>\n {/* Step 1: Category */}\n {step === 1 && (\n <div\n style={{\n display: \"grid\",\n gridTemplateColumns: \"1fr 1fr\",\n gap: \"8px\",\n }}\n >\n {availableTypes.map((type) => (\n <button\n key={type}\n type=\"button\"\n data-gg-type={type}\n onClick={() => {\n setReportType(type);\n setStep(2);\n }}\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n gap: \"8px\",\n padding: \"16px 8px\",\n borderRadius: \"8px\",\n border: `1px solid ${t.inputBorder}`,\n background: t.inputBg,\n cursor: \"pointer\",\n color: t.text,\n fontFamily: \"inherit\",\n transition: \"border-color 0.15s ease\",\n }}\n onMouseEnter={(e) => {\n (\n e.currentTarget as HTMLElement\n ).style.borderColor = t.accent;\n }}\n onMouseLeave={(e) => {\n (\n e.currentTarget as HTMLElement\n ).style.borderColor = t.inputBorder;\n }}\n >\n {getTypeIcon(type, t.accent)}\n <span style={{ fontSize: \"13px\", fontWeight: 600 }}>\n {getTypeLabel(type)}\n </span>\n <span\n style={{\n fontSize: \"11px\",\n color: t.textMuted,\n lineHeight: \"1.3\",\n }}\n >\n {getTypeSubtitle(type)}\n </span>\n </button>\n ))}\n </div>\n )}\n\n {/* Step 2: Details */}\n {step === 2 && (\n <>\n <div style={{ position: \"relative\" }}>\n <textarea\n ref={textareaRef}\n value={description}\n onChange={(e) => {\n setDescription(e.target.value);\n if (validationError) setValidationError(null);\n if (isEnhanced) {\n setIsEnhanced(false);\n setOriginalDescription(null);\n }\n }}\n placeholder={\n isTranscribing\n ? \"Transcribing your speech…\"\n : isListening\n ? \"Listening… speak now\"\n : getPlaceholder(reportType, placeholderIdx, !!transcribeAudio)\n }\n style={{\n width: \"100%\",\n minHeight: \"100px\",\n padding: enhanceText\n ? \"28px 12px 36px\"\n : transcribeAudio\n ? \"10px 12px 36px\"\n : \"10px 12px\",\n borderRadius: \"8px\",\n border: `1px solid ${isTranscribing ? \"#f59e0b\" : isListening ? t.accent : t.inputBorder}`,\n fontSize: \"14px\",\n fontFamily: \"inherit\",\n resize: \"none\",\n outline: \"none\",\n boxSizing: \"border-box\",\n color: t.text,\n backgroundColor: t.inputBg,\n transition: \"border-color 0.2s ease\",\n }}\n onKeyDown={handleSpaceDown}\n onKeyUp={handleSpaceUp}\n onFocus={(e) => {\n (\n e.target as HTMLTextAreaElement\n ).style.borderColor = t.accent;\n }}\n onBlur={(e) => {\n if (!isListening && !isTranscribing)\n (\n e.target as HTMLTextAreaElement\n ).style.borderColor = t.inputBorder;\n }}\n autoFocus\n />\n {/* Bottom-left: REC / Transcribing badge (same row as mic button) */}\n {(isListening || isTranscribing) && (\n <span\n style={{\n position: \"absolute\",\n bottom: \"10px\",\n left: \"10px\",\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"4px\",\n fontSize: \"10px\",\n fontWeight: 700,\n letterSpacing: \"0.04em\",\n color: isTranscribing ? \"#f59e0b\" : \"#ef4444\",\n pointerEvents: \"none\",\n zIndex: 1,\n }}\n >\n <span\n style={{\n width: \"6px\",\n height: \"6px\",\n borderRadius: \"50%\",\n backgroundColor: \"currentColor\",\n animation:\n \"gg-pulse 1.2s ease-in-out infinite\",\n display: \"inline-block\",\n flexShrink: 0,\n }}\n />\n {isTranscribing ? \"Transcribing…\" : \"REC\"}\n {isListening && !isTranscribing && (\n <span\n style={{\n display: \"inline-flex\",\n alignItems: \"flex-end\",\n gap: \"2px\",\n height: \"14px\",\n marginLeft: \"3px\",\n }}\n >\n {[\n { anim: \"gg-b1\", dur: \"0.6s\", delay: \"0s\" },\n {\n anim: \"gg-b2\",\n dur: \"0.5s\",\n delay: \"0.1s\",\n },\n {\n anim: \"gg-b3\",\n dur: \"0.7s\",\n delay: \"0.05s\",\n },\n {\n anim: \"gg-b4\",\n dur: \"0.55s\",\n delay: \"0.15s\",\n },\n ].map((b, i) => (\n <span\n key={i}\n style={{\n width: \"2.5px\",\n height: \"4px\",\n borderRadius: \"1px\",\n backgroundColor: \"#ef4444\",\n animation: `${b.anim} ${b.dur} ease-in-out ${b.delay} infinite`,\n display: \"inline-block\",\n alignSelf: \"center\",\n }}\n />\n ))}\n </span>\n )}\n </span>\n )}\n {/* Top-right: AI enhance */}\n {enhanceText && (\n <button\n type=\"button\"\n onClick={async () => {\n if (!description.trim() || isEnhancing) return;\n setIsEnhancing(true);\n try {\n const polished = await enhanceText(\n description,\n screenshots[0] ?? null,\n );\n if (polished && polished !== description) {\n setOriginalDescription(description);\n setDescription(polished);\n setIsEnhanced(true);\n if (validationError)\n setValidationError(null);\n }\n } finally {\n setIsEnhancing(false);\n }\n }}\n disabled={\n !description.trim() || isEnhancing || isEnhanced\n }\n style={{\n position: \"absolute\",\n top: \"6px\",\n right: \"6px\",\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"4px\",\n background: t.inputBg,\n border: \"none\",\n padding: \"2px 6px\",\n borderRadius: \"4px\",\n fontFamily: \"inherit\",\n fontSize: \"11px\",\n color: t.textMuted,\n cursor:\n !description.trim() || isEnhancing\n ? \"default\"\n : \"pointer\",\n opacity: !description.trim() ? 0.5 : 1,\n zIndex: 1,\n }}\n title=\"Polish grammar — preserves your meaning\"\n >\n <svg\n width=\"11\"\n height=\"11\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M12 3l1.5 4.5L18 9l-4.5 1.5L12 15l-1.5-4.5L6 9l4.5-1.5L12 3zM19 15l.75 2.25L22 18l-2.25.75L19 21l-.75-2.25L16 18l2.25-.75L19 15z\"\n stroke={t.textMuted}\n strokeWidth=\"1.5\"\n strokeLinejoin=\"round\"\n />\n </svg>\n {isEnhancing ? \"Enhancing...\" : \"AI enhance\"}\n </button>\n )}\n {/* Bottom-right: mic icon only, outlined */}\n {transcribeAudio && (\n <button\n type=\"button\"\n onClick={() => {\n void toggleVoice();\n }}\n title={\n isListening\n ? \"Stop recording\"\n : \"Speak your report\"\n }\n style={{\n position: \"absolute\",\n bottom: \"14px\",\n right: \"7px\",\n width: \"26px\",\n height: \"26px\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n background: \"transparent\",\n border: `1.5px solid ${isListening ? \"#ef4444\" : t.inputBorder}`,\n borderRadius: \"6px\",\n color: isListening ? \"#ef4444\" : t.textMuted,\n cursor: \"pointer\",\n zIndex: 1,\n padding: 0,\n transition:\n \"border-color 0.2s ease, color 0.2s ease\",\n }}\n >\n {isListening ? (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <rect\n x=\"6\"\n y=\"6\"\n width=\"12\"\n height=\"12\"\n rx=\"2\"\n />\n </svg>\n ) : (\n <svg\n width=\"13\"\n height=\"13\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <rect\n x=\"9\"\n y=\"2\"\n width=\"6\"\n height=\"12\"\n rx=\"3\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n />\n <path\n d=\"M5 10a7 7 0 0014 0M12 19v3M9 22h6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n />\n </svg>\n )}\n </button>\n )}\n </div>\n {transcribeAudio && !isListening && !isTranscribing && (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"5px\",\n marginTop: \"5px\",\n fontSize: \"11px\",\n color: t.text,\n opacity: 0.55,\n userSelect: \"none\",\n }}\n >\n <svg width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M12 2a3 3 0 0 0-3 3v7a3 3 0 0 0 6 0V5a3 3 0 0 0-3-3Z\"/>\n <path d=\"M19 10v2a7 7 0 0 1-14 0v-2\"/>\n <line x1=\"12\" x2=\"12\" y1=\"19\" y2=\"22\"/>\n </svg>\n Hold Space to speak — we'll transcribe it\n </div>\n )}\n {isEnhanced && originalDescription !== null && (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"6px\",\n marginTop: \"6px\",\n padding: \"6px 8px\",\n borderRadius: \"6px\",\n background: isDark\n ? \"rgba(34,211,238,0.06)\"\n : \"rgba(8,145,178,0.05)\",\n border: `1px solid ${t.accent}40`,\n }}\n >\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n style={{ flexShrink: 0 }}\n >\n <path\n d=\"M12 3l1.5 4.5L18 9l-4.5 1.5L12 15l-1.5-4.5L6 9l4.5-1.5L12 3z\"\n stroke={t.accent}\n strokeWidth=\"1.5\"\n strokeLinejoin=\"round\"\n />\n </svg>\n <span\n style={{\n fontSize: \"11px\",\n color: t.textMuted,\n flex: 1,\n }}\n >\n AI enhanced\n </span>\n <button\n type=\"button\"\n onClick={() => {\n setIsEnhanced(false);\n setOriginalDescription(null);\n }}\n style={{\n padding: \"2px 8px\",\n borderRadius: \"4px\",\n border: `1px solid ${t.accent}`,\n background: t.accent,\n color: t.accentText,\n fontSize: \"11px\",\n fontWeight: 600,\n cursor: \"pointer\",\n fontFamily: \"inherit\",\n }}\n >\n Keep\n </button>\n <button\n type=\"button\"\n onClick={() => {\n setDescription(originalDescription);\n setIsEnhanced(false);\n setOriginalDescription(null);\n }}\n style={{\n padding: \"2px 8px\",\n borderRadius: \"4px\",\n border: `1px solid ${t.inputBorder}`,\n background: \"transparent\",\n color: t.textMuted,\n fontSize: \"11px\",\n fontWeight: 600,\n cursor: \"pointer\",\n fontFamily: \"inherit\",\n }}\n >\n Restore\n </button>\n </div>\n )}\n {voiceError && (\n <p\n style={{\n color: \"#ef4444\",\n fontSize: \"11px\",\n marginTop: \"4px\",\n marginBottom: 0,\n }}\n >\n {voiceError}\n </p>\n )}\n\n {/* Screenshot section */}\n <div style={{ marginTop: \"10px\" }}>\n <span\n style={{\n fontSize: \"12px\",\n color: t.textMuted,\n marginBottom: \"6px\",\n display: \"block\",\n fontWeight: 500,\n }}\n >\n Attachments\n {screenshots.length + attachments.length > 0\n ? ` (${screenshots.length + attachments.length})`\n : \"\"}\n </span>\n {screenshots.length > 0 && (\n <div\n style={{\n display: \"flex\",\n flexWrap: \"wrap\",\n gap: \"8px\",\n marginBottom: \"8px\",\n }}\n >\n {screenshots.map((src, i) => (\n <div\n key={i}\n style={{\n position: \"relative\",\n width: \"56px\",\n height: \"56px\",\n }}\n >\n <img\n src={src}\n alt={`Screenshot ${i + 1}`}\n onClick={() => setPreviewIndex(i)}\n style={{\n width: \"100%\",\n height: \"100%\",\n borderRadius: \"6px\",\n border: `1px solid ${t.border}`,\n objectFit: \"cover\",\n objectPosition: \"top\",\n cursor: \"zoom-in\",\n display: \"block\",\n }}\n />\n <button\n type=\"button\"\n onClick={() =>\n setScreenshots((prev) =>\n prev.filter((_, idx) => idx !== i),\n )\n }\n aria-label={`Remove screenshot ${i + 1}`}\n style={{\n position: \"absolute\",\n top: \"-6px\",\n right: \"-6px\",\n width: \"17px\",\n height: \"17px\",\n borderRadius: \"50%\",\n border: \"none\",\n background: \"#ef4444\",\n color: \"#fff\",\n fontSize: \"11px\",\n lineHeight: 1,\n padding: 0,\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n <svg\n width=\"8\"\n height=\"8\"\n viewBox=\"0 0 10 10\"\n fill=\"none\"\n >\n <path\n d=\"M1 1L9 9M9 1L1 9\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n </button>\n <button\n type=\"button\"\n onClick={() => setAnnotatingIndex(i)}\n aria-label={`Annotate screenshot ${i + 1}`}\n title=\"Annotate\"\n style={{\n position: \"absolute\",\n top: \"50%\",\n left: \"50%\",\n transform: \"translate(-50%, -50%)\",\n width: \"24px\",\n height: \"24px\",\n borderRadius: \"50%\",\n border: \"none\",\n background: t.accent,\n color: t.accentText,\n padding: 0,\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n boxShadow: \"0 2px 8px rgba(0,0,0,0.45)\",\n }}\n >\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n >\n <path\n d=\"M12 20h9M16.5 3.5a2.12 2.12 0 013 3L7 19l-4 1 1-4L16.5 3.5z\"\n stroke=\"currentColor\"\n strokeWidth=\"2.2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n </div>\n ))}\n </div>\n )}\n {attachments.length > 0 && (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"6px\",\n marginBottom: \"8px\",\n }}\n >\n {attachments.map((a, i) => (\n <div\n key={i}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"8px\",\n padding: \"6px 8px\",\n borderRadius: \"6px\",\n border: `1px solid ${t.border}`,\n }}\n >\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n style={{ flexShrink: 0, opacity: 0.6 }}\n >\n <path\n d=\"M14 2H6a2 2 0 00-2 2v16a2 2 0 002 2h12a2 2 0 002-2V8z\"\n stroke={t.textMuted}\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M14 2v6h6\"\n stroke={t.textMuted}\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n <span\n style={{\n fontSize: \"11px\",\n color: t.text,\n flex: 1,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {a.name}\n </span>\n <span\n style={{ fontSize: \"10px\", color: t.textMuted }}\n >\n {(a.size / 1024).toFixed(0)}KB\n </span>\n <button\n type=\"button\"\n onClick={() =>\n setAttachments((prev) =>\n prev.filter((_, idx) => idx !== i),\n )\n }\n aria-label={`Remove ${a.name}`}\n style={{\n width: \"16px\",\n height: \"16px\",\n borderRadius: \"50%\",\n border: \"none\",\n background: \"#ef4444\",\n color: \"#fff\",\n fontSize: \"10px\",\n lineHeight: 1,\n padding: 0,\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n flexShrink: 0,\n }}\n >\n <svg\n width=\"8\"\n height=\"8\"\n viewBox=\"0 0 10 10\"\n fill=\"none\"\n >\n <path\n d=\"M1 1L9 9M9 1L1 9\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n </button>\n </div>\n ))}\n </div>\n )}\n {/* Drop zone — always available to add more */}\n <div\n onClick={() => fileInputRef.current?.click()}\n onDrop={(e) => {\n e.preventDefault();\n setScreenshotDragOver(false);\n addFiles(Array.from(e.dataTransfer.files));\n }}\n onDragOver={(e) => {\n e.preventDefault();\n setScreenshotDragOver(true);\n }}\n onDragLeave={() => setScreenshotDragOver(false)}\n style={{\n border: `1.5px dashed ${screenshotDragOver ? t.accent : t.inputBorder}`,\n borderRadius: \"8px\",\n padding:\n screenshots.length + attachments.length > 0\n ? \"8px 12px\"\n : \"18px 12px\",\n textAlign: \"center\",\n cursor: \"pointer\",\n background: screenshotDragOver\n ? isDark\n ? \"rgba(34,211,238,0.06)\"\n : \"rgba(8,145,178,0.04)\"\n : \"transparent\",\n transition:\n \"border-color 0.15s ease, background 0.15s ease\",\n }}\n >\n {screenshots.length + attachments.length > 0 ? (\n <p\n style={{\n margin: 0,\n fontSize: \"11px\",\n fontWeight: 500,\n color: t.textMuted,\n }}\n >\n {screenshotDragOver\n ? \"Drop to attach\"\n : \"+ Add more · Drag & drop · Paste\"}\n </p>\n ) : (\n <>\n <svg\n width=\"22\"\n height=\"22\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n style={{\n margin: \"0 auto 6px\",\n display: \"block\",\n opacity: 0.45,\n }}\n >\n <rect\n x=\"3\"\n y=\"3\"\n width=\"18\"\n height=\"18\"\n rx=\"2\"\n stroke={t.textMuted}\n strokeWidth=\"1.5\"\n />\n <circle\n cx=\"8.5\"\n cy=\"8.5\"\n r=\"1.5\"\n stroke={t.textMuted}\n strokeWidth=\"1.5\"\n />\n <path\n d=\"M21 15l-5-5L5 21\"\n stroke={t.textMuted}\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n <p\n style={{\n margin: 0,\n fontSize: \"12px\",\n fontWeight: 600,\n color: t.text,\n }}\n >\n {screenshotDragOver\n ? \"Drop to attach\"\n : \"Add screenshots or files\"}\n </p>\n <p\n style={{\n margin: \"3px 0 0\",\n fontSize: \"11px\",\n color: t.textMuted,\n }}\n >\n Images, PDF, DOC, XLS · Drag & drop · Paste\n ⌘V / Ctrl+V · Click to browse\n </p>\n </>\n )}\n </div>\n </div>\n\n {showSeverity && reportType === \"BUG\" && (\n <div style={{ marginTop: \"10px\" }}>\n <span\n style={{\n fontSize: \"12px\",\n color: t.textMuted,\n marginBottom: \"6px\",\n display: \"block\",\n }}\n >\n Severity\n </span>\n <div style={{ display: \"flex\", gap: \"6px\" }}>\n {(\n [\"low\", \"medium\", \"high\"] as ReportSeverity[]\n ).map((s) => (\n <button\n key={s}\n type=\"button\"\n onClick={() => setSeverity(s)}\n style={{\n flex: 1,\n padding: \"6px 0\",\n borderRadius: \"6px\",\n border: `1px solid ${severity === s ? t.accent : t.inputBorder}`,\n background:\n severity === s ? t.accent : \"transparent\",\n color:\n severity === s ? t.accentText : t.text,\n fontSize: \"12px\",\n fontWeight: 600,\n cursor: \"pointer\",\n fontFamily: \"inherit\",\n textTransform: \"capitalize\",\n transition: \"all 0.15s ease\",\n }}\n >\n {s}\n </button>\n ))}\n </div>\n </div>\n )}\n {validationError && (\n <p\n style={{\n color: \"#ef4444\",\n fontSize: \"12px\",\n marginTop: \"6px\",\n }}\n >\n {validationError}\n </p>\n )}\n <button\n type=\"button\"\n onClick={handleSubmit}\n disabled={!description.trim() || isSubmitting}\n style={{\n marginTop: \"12px\",\n width: \"100%\",\n padding: \"10px\",\n borderRadius: \"8px\",\n border: \"none\",\n backgroundColor:\n !description.trim() || isSubmitting\n ? t.bgSecondary\n : t.accent,\n color:\n !description.trim() || isSubmitting\n ? t.textMuted\n : t.accentText,\n fontSize: \"14px\",\n fontWeight: 600,\n cursor:\n !description.trim() || isSubmitting\n ? \"not-allowed\"\n : \"pointer\",\n fontFamily: \"inherit\",\n transition: \"background-color 0.15s ease\",\n }}\n >\n {isSubmitting ? \"Sending...\" : \"Send Report\"}\n </button>\n </>\n )}\n </>\n )}\n </div>\n\n {/* Footer */}\n <div\n style={{\n padding: \"8px 16px 10px\",\n borderTop: `1px solid ${t.border}`,\n textAlign: \"center\",\n }}\n >\n <span style={{ fontSize: \"11px\", color: t.textMuted }}>\n Powered by Glitchgrab\n </span>\n </div>\n </div>\n </div>,\n document.body,\n )}\n\n {/* Hidden file input */}\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\"image/*,.pdf,.doc,.docx,.xls,.xlsx,.csv\"\n multiple\n onChange={handleFileUpload}\n style={{ display: \"none\" }}\n />\n\n {/* Full-screen screenshot preview */}\n {previewIndex !== null &&\n screenshots[previewIndex] &&\n createPortal(\n <div\n style={{\n position: \"fixed\",\n inset: 0,\n zIndex: 2147483647,\n backgroundColor: \"rgba(0,0,0,0.85)\",\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: \"16px\",\n cursor: \"pointer\",\n }}\n onClick={(e) => {\n e.stopPropagation();\n setPreviewIndex(null);\n }}\n onMouseDown={(e) => e.stopPropagation()}\n >\n <div\n ref={previewImgRef}\n style={{ position: \"relative\", maxWidth: \"100%\" }}\n onClick={(e) => e.stopPropagation()}\n >\n <img\n src={screenshots[previewIndex]}\n alt=\"Screenshot preview\"\n style={{\n maxWidth: \"100%\",\n maxHeight: \"calc(100vh - 80px)\",\n borderRadius: \"8px\",\n objectFit: \"contain\",\n cursor: \"default\",\n display: \"block\",\n }}\n />\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n setAnnotatingIndex(previewIndex);\n }}\n style={{\n position: \"absolute\",\n top: \"12px\",\n right: \"12px\",\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"6px\",\n padding: \"8px 14px\",\n borderRadius: \"999px\",\n border: \"none\",\n background: t.accent,\n color: t.accentText,\n fontSize: \"13px\",\n fontWeight: 700,\n cursor: \"pointer\",\n fontFamily: \"inherit\",\n boxShadow: \"0 4px 14px rgba(0,0,0,0.35)\",\n animation: \"gg-pulse 2s ease-in-out infinite\",\n }}\n >\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n d=\"M12 20h9M16.5 3.5a2.12 2.12 0 013 3L7 19l-4 1 1-4L16.5 3.5z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n Annotate\n </button>\n </div>\n <div\n style={{\n marginTop: \"12px\",\n display: \"flex\",\n alignItems: \"center\",\n gap: \"12px\",\n }}\n >\n <span\n style={{\n color: t.textMuted,\n fontSize: \"12px\",\n }}\n >\n {screenshots.length > 1\n ? `${previewIndex + 1} / ${screenshots.length} · Click outside to close`\n : \"Click outside to close\"}\n </span>\n </div>\n </div>,\n document.body,\n )}\n\n {/* Annotation overlay */}\n {annotatingIndex !== null &&\n screenshots[annotatingIndex] &&\n createPortal(\n <AnnotationCanvas\n imageSrc={screenshots[annotatingIndex]}\n onCancel={() => setAnnotatingIndex(null)}\n onSave={(dataUrl) => {\n setScreenshots((prev) =>\n prev.map((s, i) => (i === annotatingIndex ? dataUrl : s)),\n );\n setAnnotatingIndex(null);\n }}\n />,\n document.body,\n )}\n </>\n );\n}\n\n/* ─── Helpers ─── */\n\nfunction getTypeLabel(type: ReportType): string {\n switch (type) {\n case \"BUG\":\n return \"Bug Report\";\n case \"FEATURE_REQUEST\":\n return \"Feature Request\";\n case \"UI_IMPROVEMENT\":\n return \"UI Improvement\";\n case \"PERFORMANCE\":\n return \"Performance\";\n case \"SECURITY\":\n return \"Security\";\n case \"QUESTION\":\n return \"Question\";\n case \"OTHER\":\n return \"Other\";\n }\n}\n\nfunction getTypeSubtitle(type: ReportType): string {\n switch (type) {\n case \"BUG\":\n return \"Something isn't working\";\n case \"FEATURE_REQUEST\":\n return \"Suggest an improvement\";\n case \"UI_IMPROVEMENT\":\n return \"Something looks off\";\n case \"PERFORMANCE\":\n return \"Something is slow\";\n case \"SECURITY\":\n return \"Report a security concern\";\n case \"QUESTION\":\n return \"Ask a question\";\n case \"OTHER\":\n return \"General feedback\";\n }\n}\n\nfunction getPlaceholder(type: ReportType, idx = 0, hasVoice = false): string {\n if (hasVoice && idx === 1) return \"Hold Space to speak — we'll transcribe it\";\n switch (type) {\n case \"BUG\":\n return \"What went wrong? Describe it or paste an error...\";\n case \"FEATURE_REQUEST\":\n return \"Describe the feature you'd like...\";\n case \"UI_IMPROVEMENT\":\n return \"What looks off? Describe the visual issue...\";\n case \"PERFORMANCE\":\n return \"What's slow? Describe when it happens...\";\n case \"SECURITY\":\n return \"Describe the security concern...\";\n case \"QUESTION\":\n return \"What would you like to know?\";\n case \"OTHER\":\n return \"Tell us what's on your mind...\";\n }\n}\n\nfunction getTypeIcon(type: ReportType, color: string, size = 24): ReactNode {\n const props = {\n width: size,\n height: size,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n style: { flexShrink: 0 } as CSSProperties,\n };\n switch (type) {\n case \"BUG\":\n return (\n <svg {...props}>\n <path\n d=\"M8 2L6.5 3.5M16 2L17.5 3.5M3 9H7M17 9H21M12 2a5 5 0 015 5v4a5 5 0 01-10 0V7a5 5 0 015-5zM7 16l-2 3M17 16l2 3\"\n stroke={color}\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n case \"FEATURE_REQUEST\":\n return (\n <svg {...props}>\n <path\n d=\"M12 2L15.09 8.26L22 9.27L17 14.14L18.18 21.02L12 17.77L5.82 21.02L7 14.14L2 9.27L8.91 8.26L12 2z\"\n stroke={color}\n strokeWidth=\"1.5\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n case \"UI_IMPROVEMENT\":\n return (\n <svg {...props}>\n <rect\n x=\"3\"\n y=\"3\"\n width=\"18\"\n height=\"18\"\n rx=\"2\"\n stroke={color}\n strokeWidth=\"1.5\"\n />\n <path\n d=\"M3 9h18M9 21V9\"\n stroke={color}\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n case \"PERFORMANCE\":\n return (\n <svg {...props}>\n <path\n d=\"M12 21a9 9 0 100-18 9 9 0 000 18zM12 12l4-4M12 7v.01\"\n stroke={color}\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n case \"SECURITY\":\n return (\n <svg {...props}>\n <path\n d=\"M12 3l7 3v5c0 4.5-3 8.5-7 10-4-1.5-7-5.5-7-10V6l7-3z\"\n stroke={color}\n strokeWidth=\"1.5\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n case \"QUESTION\":\n return (\n <svg {...props}>\n <circle cx=\"12\" cy=\"12\" r=\"10\" stroke={color} strokeWidth=\"1.5\" />\n <path\n d=\"M9.09 9a3 3 0 015.83 1c0 2-3 3-3 3M12 17h.01\"\n stroke={color}\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n case \"OTHER\":\n return (\n <svg {...props}>\n <path\n d=\"M21 15a2 2 0 01-2 2H7l-4 4V5a2 2 0 012-2h14a2 2 0 012 2v10z\"\n stroke={color}\n strokeWidth=\"1.5\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n }\n}\n","\"use client\";\n\nimport { useEffect, useRef, useState } from \"react\";\n\ntype Point = { x: number; y: number };\n\ntype Stroke =\n | { type: \"freehand\"; color: string; width: number; points: Point[] }\n | { type: \"circle\"; color: string; width: number; cx: number; cy: number; r: number };\n\nconst PALETTE = [\"#ef4444\", \"#f59e0b\", \"#22c55e\", \"#3b82f6\", \"#a855f7\", \"#ffffff\"];\n\nfunction drawStroke(ctx: CanvasRenderingContext2D, s: Stroke) {\n ctx.strokeStyle = s.color;\n ctx.lineWidth = s.width;\n ctx.lineCap = \"round\";\n ctx.lineJoin = \"round\";\n if (s.type === \"freehand\") {\n if (s.points.length < 2) return;\n ctx.beginPath();\n ctx.moveTo(s.points[0].x, s.points[0].y);\n for (let i = 1; i < s.points.length; i++) ctx.lineTo(s.points[i].x, s.points[i].y);\n ctx.stroke();\n } else {\n ctx.beginPath();\n ctx.arc(s.cx, s.cy, s.r, 0, Math.PI * 2);\n ctx.stroke();\n }\n}\n\ninterface AnnotationCanvasProps {\n imageSrc: string;\n onSave: (dataUrl: string) => void;\n onCancel: () => void;\n}\n\n/** Freehand + circle annotation overlay for a screenshot preview — draws directly on a canvas sized to the image's natural resolution, composited on save. */\nexport function AnnotationCanvas({ imageSrc, onSave, onCancel }: AnnotationCanvasProps) {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const imgRef = useRef<HTMLImageElement | null>(null);\n const [ready, setReady] = useState(false);\n const [tool, setTool] = useState<\"pen\" | \"circle\">(\"pen\");\n const [color, setColor] = useState(PALETTE[0]);\n const [strokeWidth, setStrokeWidth] = useState(4);\n const [strokes, setStrokes] = useState<Stroke[]>([]);\n const [currentStroke, setCurrentStroke] = useState<Stroke | null>(null);\n\n useEffect(() => {\n const img = new Image();\n img.onload = () => {\n imgRef.current = img;\n const canvas = canvasRef.current;\n if (canvas) {\n canvas.width = img.naturalWidth;\n canvas.height = img.naturalHeight;\n }\n setReady(true);\n };\n img.src = imageSrc;\n }, [imageSrc]);\n\n useEffect(() => {\n if (!ready) return;\n const canvas = canvasRef.current;\n const img = imgRef.current;\n if (!canvas || !img) return;\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return;\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n ctx.drawImage(img, 0, 0, canvas.width, canvas.height);\n for (const s of strokes) drawStroke(ctx, s);\n if (currentStroke) drawStroke(ctx, currentStroke);\n }, [ready, strokes, currentStroke]);\n\n const getPos = (e: React.PointerEvent<HTMLCanvasElement>): Point => {\n const canvas = e.currentTarget;\n const rect = canvas.getBoundingClientRect();\n return {\n x: ((e.clientX - rect.left) * canvas.width) / rect.width,\n y: ((e.clientY - rect.top) * canvas.height) / rect.height,\n };\n };\n\n const handlePointerDown = (e: React.PointerEvent<HTMLCanvasElement>) => {\n e.currentTarget.setPointerCapture(e.pointerId);\n const { x, y } = getPos(e);\n setCurrentStroke(\n tool === \"pen\"\n ? { type: \"freehand\", color, width: strokeWidth, points: [{ x, y }] }\n : { type: \"circle\", color, width: strokeWidth, cx: x, cy: y, r: 0 },\n );\n };\n\n const handlePointerMove = (e: React.PointerEvent<HTMLCanvasElement>) => {\n if (!currentStroke) return;\n const { x, y } = getPos(e);\n setCurrentStroke((prev) => {\n if (!prev) return prev;\n if (prev.type === \"freehand\") return { ...prev, points: [...prev.points, { x, y }] };\n return { ...prev, r: Math.hypot(x - prev.cx, y - prev.cy) };\n });\n };\n\n const handlePointerUp = () => {\n setCurrentStroke((prev) => {\n if (prev) setStrokes((s) => [...s, prev]);\n return null;\n });\n };\n\n const handleSave = () => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n onSave(canvas.toDataURL(\"image/jpeg\", 0.85));\n };\n\n const iconBtn = (active = false): React.CSSProperties => ({\n width: \"30px\",\n height: \"30px\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n borderRadius: \"6px\",\n border: `1.5px solid ${active ? \"#22d3ee\" : \"rgba(255,255,255,0.15)\"}`,\n background: active ? \"rgba(34,211,238,0.15)\" : \"transparent\",\n color: \"#fff\",\n cursor: \"pointer\",\n padding: 0,\n });\n\n return (\n <div\n style={{\n position: \"fixed\",\n inset: 0,\n zIndex: 2147483647,\n backgroundColor: \"rgba(0,0,0,0.9)\",\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: \"16px\",\n }}\n onClick={(e) => {\n e.stopPropagation();\n if (e.target === e.currentTarget) onCancel();\n }}\n onPointerDown={(e) => e.stopPropagation()}\n >\n <canvas\n ref={canvasRef}\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerUp}\n style={{\n maxWidth: \"100%\",\n maxHeight: \"calc(100vh - 140px)\",\n borderRadius: \"8px\",\n touchAction: \"none\",\n cursor: \"crosshair\",\n display: \"block\",\n }}\n />\n\n <div\n style={{\n marginTop: \"14px\",\n display: \"flex\",\n alignItems: \"center\",\n gap: \"8px\",\n flexWrap: \"wrap\",\n justifyContent: \"center\",\n maxWidth: \"100%\",\n }}\n >\n <button type=\"button\" onClick={() => setTool(\"pen\")} style={iconBtn(tool === \"pen\")} title=\"Freehand\" aria-label=\"Freehand tool\">\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path d=\"M12 20h9M16.5 3.5a2.12 2.12 0 013 3L7 19l-4 1 1-4L16.5 3.5z\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </button>\n <button type=\"button\" onClick={() => setTool(\"circle\")} style={iconBtn(tool === \"circle\")} title=\"Circle\" aria-label=\"Circle tool\">\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\">\n <circle cx=\"12\" cy=\"12\" r=\"8\" stroke=\"currentColor\" strokeWidth=\"1.8\" />\n </svg>\n </button>\n\n <div style={{ width: \"1px\", height: \"20px\", background: \"rgba(255,255,255,0.15)\" }} />\n\n {PALETTE.map((c) => (\n <button\n key={c}\n type=\"button\"\n onClick={() => setColor(c)}\n aria-label={`Color ${c}`}\n style={{\n width: \"22px\",\n height: \"22px\",\n borderRadius: \"50%\",\n background: c,\n border: color === c ? \"2px solid #22d3ee\" : \"2px solid rgba(255,255,255,0.3)\",\n cursor: \"pointer\",\n padding: 0,\n }}\n />\n ))}\n <input\n type=\"color\"\n value={color}\n onChange={(e) => setColor(e.target.value)}\n title=\"Custom color\"\n aria-label=\"Custom color\"\n style={{\n width: \"22px\",\n height: \"22px\",\n padding: 0,\n border: \"none\",\n background: \"none\",\n cursor: \"pointer\",\n }}\n />\n\n <div style={{ width: \"1px\", height: \"20px\", background: \"rgba(255,255,255,0.15)\" }} />\n\n <input\n type=\"range\"\n min={2}\n max={12}\n value={strokeWidth}\n onChange={(e) => setStrokeWidth(Number(e.target.value))}\n title=\"Stroke width\"\n aria-label=\"Stroke width\"\n style={{ width: \"70px\" }}\n />\n\n <div style={{ width: \"1px\", height: \"20px\", background: \"rgba(255,255,255,0.15)\" }} />\n\n <button\n type=\"button\"\n onClick={() => setStrokes((s) => s.slice(0, -1))}\n disabled={strokes.length === 0}\n style={{ ...iconBtn(), opacity: strokes.length === 0 ? 0.35 : 1 }}\n title=\"Undo\"\n aria-label=\"Undo\"\n >\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path d=\"M9 14L4 9l5-5M4 9h10a6 6 0 010 12h-2\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </button>\n <button\n type=\"button\"\n onClick={() => setStrokes([])}\n disabled={strokes.length === 0}\n style={{ ...iconBtn(), opacity: strokes.length === 0 ? 0.35 : 1 }}\n title=\"Clear all\"\n aria-label=\"Clear all\"\n >\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path d=\"M3 6h18M8 6V4a1 1 0 011-1h6a1 1 0 011 1v2m2 0v14a1 1 0 01-1 1H7a1 1 0 01-1-1V6h12z\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </button>\n </div>\n\n <div style={{ marginTop: \"12px\", display: \"flex\", gap: \"8px\" }}>\n <button\n type=\"button\"\n onClick={onCancel}\n style={{\n padding: \"8px 16px\",\n borderRadius: \"8px\",\n border: \"1.5px solid rgba(255,255,255,0.2)\",\n background: \"transparent\",\n color: \"#fff\",\n fontSize: \"13px\",\n fontWeight: 600,\n cursor: \"pointer\",\n fontFamily: \"inherit\",\n }}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={handleSave}\n style={{\n padding: \"8px 16px\",\n borderRadius: \"8px\",\n border: \"none\",\n background: \"#22d3ee\",\n color: \"#09090b\",\n fontSize: \"13px\",\n fontWeight: 600,\n cursor: \"pointer\",\n fontFamily: \"inherit\",\n }}\n >\n Save annotation\n </button>\n </div>\n </div>\n );\n}\n","/**\n * The global keyboard shortcut that opens the Glitchgrab report dialog.\n * Single source of truth — the provider's keydown handler and every label\n * rendered anywhere (SDK dialog, host app UI) derive from this.\n */\n\n/** Server-safe label. Used during SSR and as the non-Mac label. */\nexport const GLITCHGRAB_SHORTCUT = \"Ctrl+Shift+G\";\n\n/** Mac label, using the platform's modifier glyphs. */\nexport const GLITCHGRAB_SHORTCUT_MAC = \"⌘⇧G\";\n\n/** True when running on a Mac-like platform. Always false on the server. */\nfunction isMac(): boolean {\n try {\n if (typeof navigator === \"undefined\") return false;\n return /Mac|iPhone|iPad|iPod/i.test(navigator.platform || navigator.userAgent);\n } catch {\n return false;\n }\n}\n\n/**\n * OS-aware label for the report-dialog shortcut — `⌘⇧G` on Mac,\n * `Ctrl+Shift+G` elsewhere. Returns the non-Mac label on the server, so\n * render it client-side (or after mount) to avoid a hydration mismatch.\n */\nexport function getShortcutLabel(): string {\n return isMac() ? GLITCHGRAB_SHORTCUT_MAC : GLITCHGRAB_SHORTCUT;\n}\n\n/** True when the keyboard event matches the report-dialog shortcut. */\nexport function matchesShortcut(e: KeyboardEvent): boolean {\n return (\n (e.metaKey || e.ctrlKey) && e.shiftKey && e.key.toLowerCase() === \"g\"\n );\n}\n","\"use client\";\n\nimport { useState, type CSSProperties, type ReactNode } from \"react\";\nimport type { ReportButtonProps } from \"./types\";\nimport { useGlitchgrab } from \"./provider\";\n\n/** Safe version of useGlitchgrab that returns null when outside provider */\nfunction useGlitchgrabSafe() {\n try {\n return useGlitchgrab();\n } catch {\n return null;\n }\n}\n\n/**\n * Optional trigger button for opening the report dialog.\n *\n * The dialog itself lives inside `GlitchgrabProvider` — you don't need this component\n * unless you want a visible trigger button. You can also open the dialog programmatically\n * via `useGlitchgrab().openReportDialog()`.\n *\n * @example\n * ```tsx\n * // Use the default floating button\n * <ReportButton />\n *\n * // Use your own trigger\n * <ReportButton>\n * {({ onClick }) => <button onClick={onClick}>Report</button>}\n * </ReportButton>\n *\n * // Or skip ReportButton entirely and use the hook\n * const { openReportDialog } = useGlitchgrab();\n * <button onClick={() => openReportDialog()}>Report</button>\n * ```\n */\nexport function ReportButton({\n position = \"bottom-right\",\n label = \"Report Bug\",\n className,\n children,\n}: ReportButtonProps & {\n children?: (props: { onClick: () => void; capturing: boolean }) => ReactNode;\n}) {\n const [capturing, setCapturing] = useState(false);\n const glitchgrab = useGlitchgrabSafe();\n\n if (!glitchgrab) return null;\n\n const handleClick = async () => {\n setCapturing(true);\n glitchgrab.openReportDialog();\n setCapturing(false);\n };\n\n // Custom trigger via render prop\n if (children) {\n return <>{children({ onClick: handleClick, capturing })}</>;\n }\n\n // Default floating button\n const isTop = position?.startsWith(\"top\") ?? false;\n const isLeft = position?.endsWith(\"left\") ?? false;\n\n const positionStyles: CSSProperties = {\n ...(isLeft ? { left: \"16px\" } : { right: \"16px\" }),\n ...(isTop ? { top: \"16px\" } : { bottom: \"16px\" }),\n };\n\n return (\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={capturing}\n className={className}\n style={{\n position: \"fixed\",\n ...positionStyles,\n zIndex: 99999,\n padding: \"10px 18px\",\n borderRadius: \"24px\",\n border: \"none\",\n backgroundColor: \"#18181b\",\n color: \"#fafafa\",\n fontSize: \"14px\",\n fontWeight: 500,\n fontFamily:\n '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n cursor: capturing ? \"wait\" : \"pointer\",\n boxShadow:\n \"0 4px 12px rgba(0, 0, 0, 0.15), 0 1px 3px rgba(0, 0, 0, 0.1)\",\n transition: \"transform 0.15s ease, box-shadow 0.15s ease\",\n display: \"flex\",\n alignItems: \"center\",\n gap: \"6px\",\n opacity: capturing ? 0.7 : 1,\n }}\n onMouseEnter={(e) => {\n (e.target as HTMLElement).style.transform = \"scale(1.05)\";\n }}\n onMouseLeave={(e) => {\n (e.target as HTMLElement).style.transform = \"scale(1)\";\n }}\n aria-label={label}\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n style={{ flexShrink: 0 }}\n >\n <path\n d=\"M8 1C4.134 1 1 4.134 1 8s3.134 7 7 7 7-3.134 7-7-3.134-7-7-7zm0 12.5a.75.75 0 110-1.5.75.75 0 010 1.5zm.75-3.5a.75.75 0 01-1.5 0V5a.75.75 0 011.5 0v5z\"\n fill=\"currentColor\"\n />\n </svg>\n {capturing ? \"Capturing...\" : label}\n </button>\n );\n}\n","\"use client\";\n\nimport { useState, useEffect, useCallback } from \"react\";\n\nexport interface GlitchgrabReport {\n id: string;\n source: string;\n status: string;\n rawInput: string | null;\n reporterPrimaryKey: string;\n reporterName: string;\n reporterEmail: string | null;\n reporterPhone: string | null;\n pageUrl: string | null;\n createdAt: string;\n /** Number of comments on the linked GitHub issue (0 if no issue) */\n commentCount: number;\n issue: {\n githubNumber: number;\n githubUrl: string;\n title: string;\n labels: string[];\n severity: string | null;\n githubState: string | null;\n } | null;\n}\n\nconst BASE_URL = \"https://glitchgrab.dev\";\n\n/**\n * Hook to fetch bug reports for a specific user.\n *\n * ```tsx\n * const { reports, isLoading, error, refetch } = useGlitchgrabReports({\n * token: process.env.NEXT_PUBLIC_GLITCHGRAB_TOKEN!,\n * userId: session.user.id,\n * });\n * ```\n */\nexport function useGlitchgrabReports({\n token,\n userId,\n limit = 100,\n}: {\n token: string;\n userId: string;\n /** Max results (default 100, max 100) */\n limit?: number;\n}): {\n reports: GlitchgrabReport[];\n isLoading: boolean;\n isFetching: boolean;\n error: string | null;\n refetch: () => Promise<void>;\n} {\n const [reports, setReports] = useState<GlitchgrabReport[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n const [isFetching, setIsFetching] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const fetchReports = useCallback(async () => {\n if (!token || !userId) {\n setIsLoading(false);\n return;\n }\n\n setIsFetching(true);\n setError(null);\n\n try {\n const res = await fetch(\n `${BASE_URL}/api/v1/sdk/reports?reporterPrimaryKey=${encodeURIComponent(userId)}&limit=${limit}`,\n { headers: { Authorization: `Bearer ${token}` } }\n );\n const data = await res.json();\n\n if (data.success) {\n setReports(data.data ?? []);\n } else {\n setError(data.error ?? \"Failed to fetch reports\");\n }\n } catch {\n setError(\"Network error\");\n } finally {\n setIsLoading(false);\n setIsFetching(false);\n }\n }, [token, userId, limit]);\n\n useEffect(() => {\n fetchReports();\n }, [fetchReports]);\n\n return { reports, isLoading, isFetching, error, refetch: fetchReports };\n}\n\n/**\n * Standalone fetcher — use with TanStack Query or any data fetching library.\n *\n * ```tsx\n * const { data } = useQuery({\n * queryKey: [\"glitchgrab-reports\", userId],\n * queryFn: () => fetchGlitchgrabReports({\n * token: process.env.NEXT_PUBLIC_GLITCHGRAB_TOKEN!,\n * userId: session.user.id,\n * }),\n * });\n * ```\n */\nexport async function fetchGlitchgrabReports({\n token,\n userId,\n limit = 100,\n}: {\n token: string;\n userId: string;\n limit?: number;\n}): Promise<GlitchgrabReport[]> {\n const res = await fetch(\n `${BASE_URL}/api/v1/sdk/reports?reporterPrimaryKey=${encodeURIComponent(userId)}&limit=${limit}`,\n { headers: { Authorization: `Bearer ${token}` } }\n );\n const data = await res.json();\n if (!data.success) throw new Error(data.error ?? \"Failed to fetch reports\");\n return data.data ?? [];\n}\n\n// ─── Report Actions ─────────────────────────────────────\n\nasync function reportAction(\n token: string,\n reportId: string,\n body: Record<string, string>\n): Promise<void> {\n const res = await fetch(`${BASE_URL}/api/v1/reports/${reportId}/actions`, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(body),\n });\n const data = await res.json().catch(() => ({}));\n if (!res.ok || !data.success) throw new Error(data.error ?? \"Action failed\");\n}\n\n/**\n * Hook to manage report actions with loading/error states.\n *\n * ```tsx\n * const { approve, reject, close, isPending, error } = useGlitchgrabActions({\n * token: process.env.NEXT_PUBLIC_GLITCHGRAB_TOKEN!,\n * onSuccess: () => refetch(),\n * onError: (err) => toast.error(err.message),\n * });\n *\n * <button onClick={() => approve(reportId)} disabled={isPending}>\n * {isPending ? \"...\" : \"Approve\"}\n * </button>\n * ```\n */\nexport function useGlitchgrabActions({\n token,\n onSuccess,\n onError,\n}: {\n token: string;\n onSuccess?: () => void;\n onError?: (error: Error) => void;\n}) {\n const [isPending, setIsPending] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const run = useCallback(\n async (reportId: string, body: Record<string, string>) => {\n setIsPending(true);\n setError(null);\n try {\n await reportAction(token, reportId, body);\n onSuccess?.();\n } catch (e) {\n const err = e instanceof Error ? e : new Error(\"Action failed\");\n setError(err.message);\n onError?.(err);\n } finally {\n setIsPending(false);\n }\n },\n [token, onSuccess, onError]\n );\n\n return {\n approve: (reportId: string) => run(reportId, { action: \"label\", label: \"approved\" }),\n reject: (reportId: string) => run(reportId, { action: \"label\", label: \"rejected\" }),\n close: (reportId: string) => run(reportId, { action: \"close\" }),\n reopen: (reportId: string) => run(reportId, { action: \"reopen\" }),\n label: (reportId: string, label: string) => run(reportId, { action: \"label\", label }),\n unlabel: (reportId: string, label: string) => run(reportId, { action: \"unlabel\", label }),\n isPending,\n error,\n };\n}\n"],"mappings":"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","names":["import_react","e","import_react","import_jsx_runtime","rgb","words","enhanceText","transcribeAudio","e","t","import_jsx_runtime","DEFAULT_BASE_URL","maxBreadcrumbs","addBreadcrumb","import_react","import_jsx_runtime","import_react"]}
|