@diegotsi/flint-react 2.0.1 → 2.0.2

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.cjs CHANGED
@@ -1446,7 +1446,7 @@ function WidgetContent({
1446
1446
  });
1447
1447
  });
1448
1448
  return unsubscribe;
1449
- }, [enableFrustration, autoReportFrustration, globalInit]);
1449
+ }, [enableFrustration, autoReportFrustration, globalInit, projectKey, resolvedUser, serverUrl]);
1450
1450
  const label = buttonLabel ?? t("buttonLabel");
1451
1451
  return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_jsx_runtime3.Fragment, { children: [
1452
1452
  /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/FlintModal.tsx","../src/api.ts","../src/ScreenAnnotator.tsx","../src/theme.ts","../src/FlintWidget.tsx","../src/collectors/console.ts","../src/collectors/environment.ts","../src/collectors/formErrors.ts","../src/collectors/frustration.ts","../src/collectors/network.ts","../src/i18n/index.ts","../src/i18n/locales/en.json","../src/store.ts"],"sourcesContent":["export type {\n FlintConfig,\n FlintUser,\n FlintWidgetProps,\n Locale,\n ReportPayload,\n ReportResult,\n Severity,\n Theme,\n ThemeOverride,\n} from \"@diegotsi/flint-core\";\nexport { FlintModal } from \"./FlintModal.js\";\nexport { FlintWidget } from \"./FlintWidget.js\";\nexport { Flint, flint } from \"./store.js\";\n","import type {\n ConsoleEntry,\n EnvironmentInfo,\n FlintUser,\n FormErrorEntry,\n NetworkEntry,\n ReportPayload,\n ReportResult,\n Severity,\n Theme,\n} from \"@diegotsi/flint-core\";\nimport type { eventWithTime } from \"@rrweb/types\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { submitReplay, submitReport } from \"./api.js\";\nimport { ScreenAnnotator } from \"./ScreenAnnotator.js\";\nimport { resolveTheme } from \"./theme.js\";\n\ninterface Props {\n projectKey: string;\n serverUrl: string;\n user?: FlintUser;\n meta?: Record<string, unknown>;\n theme: Theme;\n zIndex: number;\n onClose: () => void;\n getEnvironment: () => EnvironmentInfo;\n getConsoleLogs: () => ConsoleEntry[];\n getNetworkErrors: () => NetworkEntry[];\n getFormErrors: () => FormErrorEntry[];\n getReplayEvents: () => eventWithTime[];\n getExternalReplayUrl: () => string | undefined;\n initialSelection?: string;\n enableScreenshot?: boolean;\n enableTextIssues?: boolean;\n statusPageUrl?: string;\n onBeforeSubmit?: (payload: ReportPayload) => boolean | Promise<boolean>;\n onSuccess?: (result: ReportResult) => void;\n onError?: (error: Error) => void;\n}\n\nconst SEVERITIES: Severity[] = [\"P1\", \"P2\", \"P3\", \"P4\"];\nconst SEV_COLOR: Record<Severity, string> = {\n P1: \"#ef4444\",\n P2: \"#f97316\",\n P3: \"#eab308\",\n P4: \"#22c55e\",\n};\n\ntype Status = \"idle\" | \"submitting\" | \"success\" | \"error\";\n\n// Inject CSS keyframes once — animations can't be done with inline styles alone\nfunction injectKeyframes() {\n if (typeof document === \"undefined\") return;\n if (document.getElementById(\"_flint_kf\")) return;\n const s = document.createElement(\"style\");\n s.id = \"_flint_kf\";\n s.textContent = `\n @keyframes _flint_in {\n from { opacity: 0; transform: scale(0.93) translateY(10px); }\n to { opacity: 1; transform: scale(1) translateY(0); }\n }\n @keyframes _flint_overlay_in {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n @keyframes _flint_spin {\n to { transform: rotate(360deg); }\n }\n @keyframes _flint_pulse {\n 0%, 100% { opacity: 0.5; transform: scale(0.88); }\n 50% { opacity: 1; transform: scale(1.08); }\n }\n @keyframes _flint_ripple {\n 0% { opacity: 0.5; transform: scale(0.75); }\n 100% { opacity: 0; transform: scale(1.55); }\n }\n @keyframes _flint_sending_dot {\n 0%, 80%, 100% { opacity: 0.2; transform: scale(0.8); }\n 40% { opacity: 1; transform: scale(1); }\n }\n @keyframes _flint_success_up {\n from { opacity: 0; transform: translateY(8px); }\n to { opacity: 1; transform: translateY(0); }\n }\n `;\n document.head.appendChild(s);\n}\n\nexport function FlintModal({\n projectKey,\n serverUrl,\n user,\n meta,\n theme,\n zIndex,\n onClose,\n getEnvironment,\n getConsoleLogs,\n getNetworkErrors,\n getFormErrors,\n getReplayEvents,\n getExternalReplayUrl,\n initialSelection = \"\",\n enableScreenshot = true,\n enableTextIssues = true,\n statusPageUrl,\n onBeforeSubmit,\n onSuccess,\n onError,\n}: Props) {\n const { t } = useTranslation();\n const colors = resolveTheme(theme);\n const isDark = theme === \"dark\";\n\n const [severity, setSeverity] = useState<Severity>(\"P2\");\n const [description, setDescription] = useState(\"\");\n const [expectedBehavior, setExpectedBehavior] = useState(\"\");\n const [screenshot, setScreenshot] = useState<File | null>(null);\n const [annotating, setAnnotating] = useState(false);\n const [status, setStatus] = useState<Status>(\"idle\");\n const [result, setResult] = useState<ReportResult | null>(null);\n const [errorMsg, setErrorMsg] = useState(\"\");\n\n // Text issue mode\n const [mode, setMode] = useState<\"bug\" | \"text\">(enableTextIssues && initialSelection ? \"text\" : \"bug\");\n const [textOriginal, setTextOriginal] = useState(initialSelection);\n const [textSuggested, setTextSuggested] = useState(\"\");\n const [textLang, setTextLang] = useState(\n typeof document !== \"undefined\" ? document.documentElement.lang?.split(\"-\")[0] || \"en\" : \"en\",\n );\n\n const fileRef = useRef<HTMLInputElement>(null);\n const overlayRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n injectKeyframes();\n }, []);\n\n useEffect(() => {\n const handler = (e: KeyboardEvent) => {\n if (e.key === \"Escape\" && status !== \"submitting\") onClose();\n };\n window.addEventListener(\"keydown\", handler);\n return () => window.removeEventListener(\"keydown\", handler);\n }, [onClose, status]);\n\n const handleOverlayClick = useCallback(\n (e: React.MouseEvent) => {\n if (e.target === overlayRef.current && status !== \"submitting\") onClose();\n },\n [onClose, status],\n );\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n const isText = mode === \"text\";\n if (isText) {\n if (!textOriginal.trim() || !textSuggested.trim()) return;\n } else {\n if (!description.trim()) return;\n }\n\n setStatus(\"submitting\");\n setErrorMsg(\"\");\n\n const collectedMeta: Record<string, unknown> = {\n ...meta,\n environment: getEnvironment(),\n consoleLogs: getConsoleLogs(),\n networkErrors: getNetworkErrors(),\n formErrors: getFormErrors(),\n };\n\n if (isText) {\n collectedMeta.textIssue = {\n original: textOriginal.trim(),\n suggested: textSuggested.trim(),\n lang: textLang,\n };\n }\n\n const payload: ReportPayload = {\n reporterId: user?.id ?? \"anonymous\",\n reporterName: user?.name ?? \"Anonymous\",\n reporterEmail: user?.email,\n description: isText ? `[Text issue] \"${textOriginal.trim()}\" → \"${textSuggested.trim()}\"` : description.trim(),\n expectedBehavior: !isText ? expectedBehavior.trim() || undefined : undefined,\n externalReplayUrl: getExternalReplayUrl() || undefined,\n severity: isText ? \"P3\" : severity,\n url: window.location.href,\n meta: collectedMeta,\n label: isText ? \"TEXT\" : undefined,\n };\n\n if (onBeforeSubmit) {\n const proceed = await onBeforeSubmit(payload);\n if (!proceed) {\n setStatus(\"idle\");\n return;\n }\n }\n\n try {\n const res = await submitReport(serverUrl, projectKey, payload, !isText ? (screenshot ?? undefined) : undefined);\n setResult(res);\n setStatus(\"success\");\n onSuccess?.(res);\n\n const events = getReplayEvents();\n if (events.length > 0) {\n submitReplay(serverUrl, projectKey, res.id, events).catch(() => {});\n }\n } catch (err) {\n const error = err instanceof Error ? err : new Error(t(\"errorLabel\"));\n setErrorMsg(error.message);\n setStatus(\"error\");\n onError?.(error);\n }\n };\n\n // ── Shared style tokens ────────────────────────────────────────────────────\n const inputBorder = isDark ? \"rgba(255,255,255,0.1)\" : \"rgba(0,0,0,0.1)\";\n const accentGlow = `0 0 20px ${colors.accent}40, 0 4px 16px rgba(0,0,0,0.2)`;\n\n const overlayStyle: React.CSSProperties = {\n position: \"fixed\",\n inset: 0,\n background: \"rgba(0,0,0,0.5)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n zIndex,\n padding: \"16px\",\n backdropFilter: \"blur(10px)\",\n WebkitBackdropFilter: \"blur(10px)\",\n animation: \"_flint_overlay_in 0.2s ease\",\n };\n\n const modalStyle: React.CSSProperties = {\n background: colors.background,\n backdropFilter: colors.backdropFilter,\n WebkitBackdropFilter: colors.backdropFilter,\n borderRadius: \"20px\",\n boxShadow: colors.shadow,\n border: `1px solid ${colors.border}`,\n width: \"100%\",\n maxWidth: \"600px\",\n maxHeight: \"92vh\",\n overflowY: \"auto\",\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif',\n color: colors.text,\n animation: \"_flint_in 0.28s cubic-bezier(0.16, 1, 0.3, 1)\",\n };\n\n const inputStyle: React.CSSProperties = {\n width: \"100%\",\n padding: \"11px 13px\",\n borderRadius: \"10px\",\n border: `1px solid ${inputBorder}`,\n background: colors.backgroundSecondary,\n color: colors.text,\n fontSize: \"16px\",\n outline: \"none\",\n boxSizing: \"border-box\",\n fontFamily: \"inherit\",\n transition: \"border-color 0.15s\",\n };\n\n // ── Loading + Success (unified animated state) ────────────────────────────\n if (status === \"submitting\" || status === \"success\") {\n const isSuccess = status === \"success\";\n const ringBorder = isSuccess\n ? \"3px solid #22c55e\"\n : `3px solid ${isDark ? \"rgba(255,255,255,0.08)\" : \"rgba(0,0,0,0.08)\"}`;\n const ringTopColor = isSuccess ? \"#22c55e\" : colors.accent;\n\n return (\n <div style={overlayStyle}>\n <div\n style={modalStyle}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={isSuccess ? t(\"successTitle\") : t(\"sending\")}\n >\n <ModalHeader colors={colors} inputBorder={inputBorder} showClose={false} onClose={onClose} />\n\n <div\n style={{\n padding: \"40px 32px 48px\",\n textAlign: \"center\",\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n }}\n >\n {/* Animated rings */}\n <div style={{ position: \"relative\", width: 80, height: 80, marginBottom: 28 }}>\n {/* Ripple 1 — fade out on success */}\n <div\n style={{\n position: \"absolute\",\n inset: -10,\n borderRadius: \"50%\",\n border: `1.5px solid ${colors.accent}`,\n animation: \"_flint_ripple 1.8s ease-out infinite\",\n opacity: isSuccess ? 0 : 1,\n transition: \"opacity 0.3s ease\",\n }}\n />\n {/* Ripple 2 (delayed) */}\n <div\n style={{\n position: \"absolute\",\n inset: -10,\n borderRadius: \"50%\",\n border: `1.5px solid ${colors.accent}`,\n animation: \"_flint_ripple 1.8s ease-out infinite 0.6s\",\n opacity: isSuccess ? 0 : 1,\n transition: \"opacity 0.3s ease\",\n }}\n />\n {/* Spinning ring — transitions to solid green on success */}\n <div\n style={{\n position: \"absolute\",\n inset: 0,\n borderRadius: \"50%\",\n border: ringBorder,\n borderTopColor: ringTopColor,\n animation: isSuccess ? \"none\" : \"_flint_spin 0.85s linear infinite\",\n transition: \"border-color 0.45s ease, border-top-color 0.45s ease\",\n }}\n />\n {/* Center: spark fades out, check fades in */}\n <div style={{ position: \"absolute\", inset: 14, borderRadius: \"50%\" }}>\n {/* Spark */}\n <div\n style={{\n position: \"absolute\",\n inset: 0,\n borderRadius: \"50%\",\n background: `linear-gradient(135deg, ${colors.accent}30, ${colors.accentHover}50)`,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n animation: isSuccess ? \"none\" : \"_flint_pulse 2s ease-in-out infinite\",\n opacity: isSuccess ? 0 : 1,\n transition: \"opacity 0.3s ease\",\n }}\n >\n <SparkIcon color={colors.accent} size={20} />\n </div>\n {/* Checkmark */}\n <div\n style={{\n position: \"absolute\",\n inset: 0,\n borderRadius: \"50%\",\n background: \"rgba(34,197,94,0.15)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n opacity: isSuccess ? 1 : 0,\n transform: isSuccess ? \"scale(1)\" : \"scale(0.65)\",\n transition: \"opacity 0.35s ease 0.2s, transform 0.4s cubic-bezier(0.16,1,0.3,1) 0.2s\",\n }}\n >\n <CheckIcon size={20} />\n </div>\n </div>\n </div>\n\n {/* Title crossfade */}\n <div style={{ position: \"relative\", height: 26, width: \"100%\", marginBottom: 10 }}>\n <div\n style={{\n position: \"absolute\",\n inset: 0,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n fontSize: 19,\n fontWeight: 700,\n color: colors.text,\n letterSpacing: \"-0.02em\",\n opacity: isSuccess ? 0 : 1,\n transition: \"opacity 0.25s ease\",\n pointerEvents: \"none\",\n }}\n >\n {t(\"sending\")}\n </div>\n <div\n style={{\n position: \"absolute\",\n inset: 0,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n fontSize: 19,\n fontWeight: 700,\n color: colors.text,\n letterSpacing: \"-0.02em\",\n opacity: isSuccess ? 1 : 0,\n transform: isSuccess ? \"translateY(0)\" : \"translateY(6px)\",\n transition: \"opacity 0.35s ease 0.25s, transform 0.35s ease 0.25s\",\n pointerEvents: isSuccess ? \"auto\" : \"none\",\n }}\n >\n {t(\"successTitle\")}\n </div>\n </div>\n\n {/* Subtitle crossfade */}\n <div style={{ position: \"relative\", minHeight: 76, width: \"100%\" }}>\n {/* Loading subtitle */}\n <div\n style={{\n position: \"absolute\",\n inset: 0,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 6,\n color: colors.textMuted,\n fontSize: 15,\n opacity: isSuccess ? 0 : 1,\n transition: \"opacity 0.2s ease\",\n pointerEvents: \"none\",\n }}\n >\n <span>{t(\"capturingContext\")}</span>\n <SendingDots color={colors.accent} />\n </div>\n {/* Success subtitle */}\n <div\n style={{\n position: \"absolute\",\n inset: 0,\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n gap: 10,\n opacity: isSuccess ? 1 : 0,\n transform: isSuccess ? \"translateY(0)\" : \"translateY(8px)\",\n transition: \"opacity 0.35s ease 0.35s, transform 0.35s ease 0.35s\",\n pointerEvents: isSuccess ? \"auto\" : \"none\",\n }}\n >\n <p style={{ fontSize: 15, color: colors.textMuted, margin: 0 }}>{result ? `ID: ${result.id}` : \"\"}</p>\n {statusPageUrl && user?.id && (\n <a\n href={`${statusPageUrl}/status?project_key=${encodeURIComponent(projectKey)}&reporter_id=${encodeURIComponent(user.id)}&server_url=${encodeURIComponent(serverUrl)}`}\n target=\"_blank\"\n rel=\"noreferrer\"\n style={{\n fontSize: 14,\n color: colors.accent,\n textDecoration: \"none\",\n fontWeight: 600,\n animation: \"_flint_success_up 0.35s ease 0.4s both\",\n }}\n >\n {\"\\ud83d\\udccb\"} Track your bugs {\"\\u2192\"}\n </a>\n )}\n {/*\n {result?.slackMessageUrl && (\n <a\n href={result.slackMessageUrl}\n target=\"_blank\"\n rel=\"noreferrer\"\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 6,\n padding: \"9px 18px\",\n borderRadius: \"10px\",\n background: `linear-gradient(135deg, ${colors.accent}, ${colors.accentHover})`,\n color: colors.buttonText,\n textDecoration: \"none\",\n fontSize: \"15px\",\n fontWeight: 600,\n boxShadow: accentGlow,\n }}\n >\n {t(\"successSlack\")} ↗\n </a>\n )} */}\n <button\n onClick={onClose}\n style={{\n width: \"100%\",\n padding: \"13px 20px\",\n borderRadius: 12,\n border: \"none\",\n background: `linear-gradient(135deg, ${colors.accent}, ${colors.accentHover})`,\n color: colors.buttonText,\n fontSize: 17,\n fontWeight: 700,\n cursor: \"pointer\",\n letterSpacing: \"-0.01em\",\n boxShadow: accentGlow,\n fontFamily: \"inherit\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 8,\n }}\n >\n {t(\"close\")}\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n );\n }\n\n // ── Form ──────────────────────────────────────────────────────────────────\n return (\n <>\n {enableScreenshot && annotating && (\n <ScreenAnnotator\n zIndex={zIndex + 1}\n onCapture={(file) => {\n setScreenshot(file);\n setAnnotating(false);\n }}\n onCancel={() => setAnnotating(false)}\n />\n )}\n {!annotating && (\n <div ref={overlayRef} style={overlayStyle} onClick={handleOverlayClick}>\n <div style={modalStyle} role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"flint-modal-title\">\n <ModalHeader\n colors={colors}\n inputBorder={inputBorder}\n showClose\n onClose={onClose}\n titleId=\"flint-modal-title\"\n title={t(\"modalTitle\")}\n />\n\n <form onSubmit={handleSubmit} style={{ padding: \"20px 24px 24px\" }}>\n {/* Mode toggle */}\n {enableTextIssues && (\n <div\n style={{\n display: \"flex\",\n gap: 4,\n marginBottom: 20,\n background: colors.backgroundSecondary,\n borderRadius: 12,\n padding: 4,\n border: `1px solid ${inputBorder}`,\n }}\n >\n {([\"bug\", \"text\"] as const).map((m) => (\n <button\n key={m}\n type=\"button\"\n onClick={() => setMode(m)}\n style={{\n flex: 1,\n padding: \"8px 10px\",\n borderRadius: 9,\n border: \"none\",\n cursor: \"pointer\",\n fontSize: 13,\n fontWeight: mode === m ? 700 : 500,\n fontFamily: \"inherit\",\n transition: \"background 0.15s, color 0.15s\",\n background:\n mode === m ? `linear-gradient(135deg, ${colors.accent}, ${colors.accentHover})` : \"transparent\",\n color: mode === m ? colors.buttonText : colors.textMuted,\n boxShadow: mode === m ? `0 2px 8px ${colors.accent}30` : \"none\",\n }}\n >\n {m === \"bug\" ? \"🐛 Bug\" : \"🔤 Text / Translation\"}\n </button>\n ))}\n </div>\n )}\n\n {/* Text issue fields */}\n {mode === \"text\" && (\n <>\n <div style={{ marginBottom: 14 }}>\n <FieldLabel colors={colors} htmlFor=\"flint-text-original\">\n Original text\n </FieldLabel>\n <textarea\n id=\"flint-text-original\"\n style={{ ...inputStyle, resize: \"vertical\", minHeight: 60 }}\n value={textOriginal}\n onChange={(e) => setTextOriginal(e.target.value)}\n placeholder=\"Text that is wrong on screen…\"\n required\n />\n </div>\n <div style={{ marginBottom: 14 }}>\n <FieldLabel colors={colors} htmlFor=\"flint-text-suggested\">\n Suggested correction\n </FieldLabel>\n <textarea\n id=\"flint-text-suggested\"\n style={{ ...inputStyle, resize: \"vertical\", minHeight: 60 }}\n value={textSuggested}\n onChange={(e) => setTextSuggested(e.target.value)}\n placeholder=\"How it should read…\"\n required\n />\n </div>\n <div style={{ marginBottom: 20 }}>\n <FieldLabel colors={colors} htmlFor=\"flint-text-lang\">\n Language\n </FieldLabel>\n <select\n id=\"flint-text-lang\"\n value={textLang}\n onChange={(e) => setTextLang(e.target.value)}\n style={{\n ...inputStyle,\n appearance: \"none\",\n cursor: \"pointer\",\n }}\n >\n <option value=\"en\">English (en)</option>\n <option value=\"he\">עברית (he)</option>\n </select>\n </div>\n </>\n )}\n\n {/* Severity */}\n <div style={{ marginBottom: 18, display: mode === \"text\" ? \"none\" : undefined }}>\n <FieldLabel colors={colors}>{t(\"severityLabel\")}</FieldLabel>\n <div style={{ display: \"grid\", gridTemplateColumns: \"repeat(4,1fr)\", gap: 8 }}>\n {SEVERITIES.map((sev) => (\n <SeverityButton\n key={sev}\n sev={sev}\n label={t(`severity_${sev}_label`)}\n selected={severity === sev}\n hint={t(`severity_${sev}_hint`)}\n color={SEV_COLOR[sev]}\n accent={colors.accent}\n border={inputBorder}\n bg={colors.backgroundSecondary}\n text={colors.text}\n onClick={() => setSeverity(sev)}\n />\n ))}\n </div>\n </div>\n\n {/* What Is Broken */}\n {mode === \"bug\" && (\n <div style={{ marginBottom: 14 }}>\n <FieldLabel colors={colors} htmlFor=\"flint-description\">\n {t(\"whatIsBrokenLabel\")}\n </FieldLabel>\n <textarea\n id=\"flint-description\"\n style={{ ...inputStyle, resize: \"vertical\", minHeight: 80 }}\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n placeholder={t(\"whatIsBrokenPlaceholder\")}\n required\n />\n </div>\n )}\n\n {/* Expected Behavior (optional) */}\n {mode === \"bug\" && (\n <div style={{ marginBottom: 14 }}>\n <FieldLabel colors={colors} htmlFor=\"flint-expected\">\n {t(\"expectedBehaviorLabel\")}\n </FieldLabel>\n <textarea\n id=\"flint-expected\"\n style={{ ...inputStyle, resize: \"vertical\", minHeight: 72 }}\n value={expectedBehavior}\n onChange={(e) => setExpectedBehavior(e.target.value)}\n placeholder={t(\"expectedBehaviorPlaceholder\")}\n />\n </div>\n )}\n\n {/* Screenshot */}\n <div style={{ marginBottom: 20, display: mode === \"text\" || !enableScreenshot ? \"none\" : undefined }}>\n <FieldLabel colors={colors}>{t(\"screenshotLabel\")}</FieldLabel>\n {screenshot ? (\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 10 }}>\n <img\n src={URL.createObjectURL(screenshot)}\n alt=\"Screenshot preview\"\n style={{ height: 60, borderRadius: 8, objectFit: \"cover\", border: `1px solid ${inputBorder}` }}\n />\n <span\n style={{\n fontSize: 13,\n color: colors.textMuted,\n flex: 1,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {screenshot.name}\n </span>\n <button\n type=\"button\"\n onClick={() => setScreenshot(null)}\n aria-label=\"Remove screenshot\"\n style={{\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n fontSize: 18,\n color: colors.textMuted,\n lineHeight: 1,\n padding: \"2px 6px\",\n borderRadius: 6,\n fontFamily: \"inherit\",\n }}\n >\n ×\n </button>\n </div>\n ) : (\n <div style={{ display: \"flex\", gap: 8 }}>\n <button\n type=\"button\"\n onClick={() => fileRef.current?.click()}\n style={{\n flex: 1,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 6,\n padding: \"10px 13px\",\n borderRadius: 10,\n border: `1px dashed ${inputBorder}`,\n cursor: \"pointer\",\n fontSize: 14,\n color: colors.textMuted,\n background: colors.backgroundSecondary,\n fontFamily: \"inherit\",\n }}\n >\n 📎 {t(\"screenshotAttachFile\")}\n </button>\n <button\n type=\"button\"\n onClick={() => setAnnotating(true)}\n style={{\n flex: 1,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 6,\n padding: \"10px 13px\",\n borderRadius: 10,\n border: `1px dashed ${inputBorder}`,\n cursor: \"pointer\",\n fontSize: 14,\n color: colors.textMuted,\n background: colors.backgroundSecondary,\n fontFamily: \"inherit\",\n }}\n >\n 🔲 {t(\"screenshotMarkOnScreen\")}\n </button>\n </div>\n )}\n <input\n id=\"flint-screenshot\"\n ref={fileRef}\n type=\"file\"\n accept=\"image/*\"\n style={{ display: \"none\" }}\n onChange={(e) => setScreenshot(e.target.files?.[0] ?? null)}\n />\n </div>\n\n {/* Session replay info */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n padding: \"9px 12px\",\n borderRadius: 10,\n background: isDark ? \"rgba(255,255,255,0.04)\" : \"rgba(0,77,240,0.04)\",\n border: `1px solid ${isDark ? \"rgba(255,255,255,0.08)\" : \"rgba(0,77,240,0.1)\"}`,\n marginBottom: 16,\n }}\n >\n <span style={{ fontSize: 16 }}>🎥</span>\n <span style={{ fontSize: 14, color: colors.textMuted, lineHeight: 1.4 }}>{t(\"replayInfo\")}</span>\n </div>\n\n {/* Error */}\n {status === \"error\" && (\n <div\n style={{\n padding: \"10px 13px\",\n borderRadius: 10,\n background: \"rgba(239,68,68,0.08)\",\n border: \"1px solid rgba(239,68,68,0.2)\",\n color: \"#f87171\",\n fontSize: 14,\n marginBottom: 16,\n }}\n >\n ⚠️ {errorMsg || t(\"errorLabel\")}\n </div>\n )}\n\n {/* Submit */}\n <button\n type=\"submit\"\n style={{\n width: \"100%\",\n padding: \"13px 20px\",\n borderRadius: 12,\n border: \"none\",\n background: `linear-gradient(135deg, ${colors.accent}, ${colors.accentHover})`,\n color: colors.buttonText,\n fontSize: 17,\n fontWeight: 700,\n cursor: \"pointer\",\n letterSpacing: \"-0.01em\",\n boxShadow: accentGlow,\n fontFamily: \"inherit\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 8,\n }}\n >\n <SparkIcon color={colors.buttonText} size={15} />\n {t(\"submitLabel\")}\n </button>\n\n {/* Cancel */}\n <button\n type=\"button\"\n onClick={onClose}\n style={{\n width: \"100%\",\n padding: \"10px\",\n marginTop: 8,\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n fontSize: 15,\n color: colors.textMuted,\n fontFamily: \"inherit\",\n borderRadius: 8,\n }}\n >\n {t(\"cancel\")}\n </button>\n </form>\n </div>\n </div>\n )}\n </>\n );\n}\n\n// ─── Sub-components ──────────────────────────────────────────────────────────\n\nfunction ModalHeader({\n colors,\n inputBorder,\n showClose,\n onClose,\n titleId,\n title,\n}: {\n colors: ReturnType<typeof resolveTheme>;\n inputBorder: string;\n showClose: boolean;\n onClose: () => void;\n titleId?: string;\n title?: string;\n}) {\n return (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 10,\n padding: \"16px 20px 14px\",\n borderBottom: `1px solid ${inputBorder}`,\n }}\n >\n {/* Brand chip */}\n <div\n style={{\n width: 28,\n height: 28,\n borderRadius: 8,\n background: `linear-gradient(135deg, ${colors.accent}20, ${colors.accentHover}35)`,\n border: `1px solid ${colors.accent}30`,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n flexShrink: 0,\n }}\n >\n <SparkIcon color={colors.accent} size={13} />\n </div>\n\n {titleId && title ? (\n <h2\n id={titleId}\n style={{ margin: 0, fontSize: 16, fontWeight: 600, color: colors.text, letterSpacing: \"-0.01em\", flex: 1 }}\n >\n {title}\n </h2>\n ) : (\n <span style={{ flex: 1, fontSize: 15, fontWeight: 600, color: colors.textMuted }}>Flint</span>\n )}\n\n {showClose && (\n <button\n onClick={onClose}\n aria-label=\"Close\"\n style={{\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n padding: 4,\n color: colors.textMuted,\n fontSize: 22,\n lineHeight: 1,\n borderRadius: 6,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n opacity: 0.6,\n fontFamily: \"inherit\",\n }}\n >\n ×\n </button>\n )}\n </div>\n );\n}\n\nfunction FieldLabel({\n children,\n colors,\n htmlFor,\n}: {\n children: React.ReactNode;\n colors: ReturnType<typeof resolveTheme>;\n htmlFor?: string;\n}) {\n return (\n <label\n htmlFor={htmlFor}\n style={{\n display: \"block\",\n fontSize: \"12px\",\n fontWeight: 700,\n color: colors.textMuted,\n marginBottom: 6,\n textTransform: \"uppercase\" as const,\n letterSpacing: \"0.07em\",\n }}\n >\n {children}\n </label>\n );\n}\n\nfunction SendingDots({ color }: { color: string }) {\n return (\n <span style={{ display: \"inline-flex\", gap: 3, alignItems: \"center\" }}>\n {[0, 1, 2].map((i) => (\n <span\n key={i}\n style={{\n width: 4,\n height: 4,\n borderRadius: \"50%\",\n background: color,\n display: \"inline-block\",\n animation: `_flint_sending_dot 1.4s ease-in-out infinite ${i * 0.2}s`,\n }}\n />\n ))}\n </span>\n );\n}\n\ninterface SevBtnProps {\n sev: Severity;\n label: string;\n selected: boolean;\n hint: string;\n color: string;\n accent: string;\n border: string;\n bg: string;\n text: string;\n onClick: () => void;\n}\n\nfunction SeverityButton({ sev, label, selected, hint, color, accent, border, bg, text, onClick }: SevBtnProps) {\n return (\n <button\n type=\"button\"\n title={hint}\n onClick={onClick}\n style={{\n padding: \"9px 6px 8px\",\n borderRadius: 10,\n border: selected ? `2px solid ${accent}` : `1.5px solid ${border}`,\n background: selected ? `${accent}15` : bg,\n cursor: \"pointer\",\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n gap: 5,\n transition: \"border-color 0.12s, background 0.12s\",\n fontFamily: \"inherit\",\n }}\n >\n <span style={{ width: 8, height: 8, borderRadius: \"50%\", background: color, display: \"block\" }} />\n <span\n style={{\n fontSize: 13,\n fontWeight: selected ? 700 : 500,\n color: selected ? accent : text,\n letterSpacing: \"0.02em\",\n }}\n >\n {sev}\n </span>\n <span style={{ fontSize: 11, color: selected ? accent : text, opacity: 0.6, letterSpacing: \"0.02em\" }}>\n {label}\n </span>\n </button>\n );\n}\n\nfunction SparkIcon({ color = \"currentColor\", size = 14 }: { color?: string; size?: number }) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke={color}\n strokeWidth=\"2.2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M13 2L3 14h9l-1 8 10-12h-9l1-8z\" />\n </svg>\n );\n}\n\nfunction CheckIcon({ size = 20 }: { size?: number }) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"#22c55e\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n );\n}\n","export { submitReplay, submitReport } from \"@diegotsi/flint-core\";\n","import { domToCanvas } from \"modern-screenshot\";\nimport { useEffect, useRef, useState } from \"react\";\n\ninterface Props {\n zIndex: number;\n onCapture: (file: File) => void;\n onCancel: () => void;\n}\n\ntype Phase = \"idle\" | \"selecting\" | \"capturing\";\n\ninterface Rect {\n x: number;\n y: number;\n w: number;\n h: number;\n}\n\nfunction normalizeRect(startX: number, startY: number, endX: number, endY: number): Rect {\n return {\n x: Math.min(startX, endX),\n y: Math.min(startY, endY),\n w: Math.abs(endX - startX),\n h: Math.abs(endY - startY),\n };\n}\n\nexport function ScreenAnnotator({ zIndex, onCapture, onCancel }: Props) {\n const [phase, setPhase] = useState<Phase>(\"idle\");\n const [rect, setRect] = useState<Rect | null>(null);\n const startRef = useRef<{ x: number; y: number } | null>(null);\n const overlayRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") onCancel();\n };\n window.addEventListener(\"keydown\", onKey);\n return () => window.removeEventListener(\"keydown\", onKey);\n }, [onCancel]);\n\n const onMouseDown = (e: React.MouseEvent) => {\n e.preventDefault();\n startRef.current = { x: e.clientX, y: e.clientY };\n setPhase(\"selecting\");\n setRect({ x: e.clientX, y: e.clientY, w: 0, h: 0 });\n };\n\n const onMouseMove = (e: React.MouseEvent) => {\n if (phase !== \"selecting\" || !startRef.current) return;\n setRect(normalizeRect(startRef.current.x, startRef.current.y, e.clientX, e.clientY));\n };\n\n const onMouseUp = async (e: React.MouseEvent) => {\n if (phase !== \"selecting\" || !startRef.current) return;\n const finalRect = normalizeRect(startRef.current.x, startRef.current.y, e.clientX, e.clientY);\n startRef.current = null;\n\n if (finalRect.w < 5 || finalRect.h < 5) {\n setPhase(\"idle\");\n setRect(null);\n return;\n }\n\n setPhase(\"capturing\");\n\n const dpr = window.devicePixelRatio ?? 1;\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n\n // Wait for React to re-render + browser to paint so the overlay disappears\n await new Promise<void>((resolve) => requestAnimationFrame(() => requestAnimationFrame(() => resolve())));\n\n try {\n // Capture the visible viewport using modern-screenshot.\n // It clones only the visible area when width/height match the viewport.\n const fullCanvas = await domToCanvas(document.documentElement, {\n scale: dpr,\n width: vw,\n height: vh,\n style: {\n transform: `translate(-${window.scrollX}px, -${window.scrollY}px)`,\n },\n filter: (el) => el !== overlayRef.current,\n });\n\n // Crop canvas to viewport size (domToCanvas may produce a larger canvas)\n const canvas = document.createElement(\"canvas\");\n canvas.width = vw * dpr;\n canvas.height = vh * dpr;\n const ctx = canvas.getContext(\"2d\")!;\n ctx.drawImage(fullCanvas, 0, 0, vw * dpr, vh * dpr, 0, 0, vw * dpr, vh * dpr);\n\n // Draw annotation highlight — clientX/Y are viewport-relative\n ctx.fillStyle = \"rgba(255,200,0,0.25)\";\n ctx.fillRect(finalRect.x * dpr, finalRect.y * dpr, finalRect.w * dpr, finalRect.h * dpr);\n ctx.strokeStyle = \"#f97316\";\n ctx.lineWidth = 3 * dpr;\n ctx.strokeRect(finalRect.x * dpr, finalRect.y * dpr, finalRect.w * dpr, finalRect.h * dpr);\n\n canvas.toBlob((blob: Blob | null) => {\n if (blob) {\n onCapture(new File([blob], \"annotation.png\", { type: \"image/png\" }));\n } else {\n onCancel();\n }\n }, \"image/png\");\n } catch (err) {\n console.error(\"[Flint] ScreenAnnotator capture failed:\", err);\n onCancel();\n }\n };\n\n const isCapturing = phase === \"capturing\";\n\n return (\n <div\n ref={overlayRef}\n onMouseDown={onMouseDown}\n onMouseMove={onMouseMove}\n onMouseUp={onMouseUp}\n style={{\n position: \"fixed\",\n inset: 0,\n zIndex,\n cursor: isCapturing ? \"default\" : \"crosshair\",\n userSelect: \"none\",\n background: phase === \"selecting\" ? \"rgba(0,0,0,0.15)\" : \"rgba(0,0,0,0.05)\",\n transition: \"background 0.1s\",\n opacity: isCapturing ? 0 : 1,\n pointerEvents: isCapturing ? \"none\" : \"auto\",\n }}\n >\n {!isCapturing && (\n <div\n style={{\n position: \"absolute\",\n top: 16,\n left: \"50%\",\n transform: \"translateX(-50%)\",\n background: \"rgba(0,0,0,0.75)\",\n color: \"#fff\",\n padding: \"8px 18px\",\n borderRadius: 8,\n fontSize: 14,\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif',\n pointerEvents: \"none\",\n whiteSpace: \"nowrap\",\n backdropFilter: \"blur(4px)\",\n }}\n >\n Drag to highlight the problem area &nbsp;·&nbsp; Esc to cancel\n </div>\n )}\n\n {rect && phase === \"selecting\" && (\n <div\n style={{\n position: \"absolute\",\n left: rect.x,\n top: rect.y,\n width: rect.w,\n height: rect.h,\n background: \"rgba(255,200,0,0.2)\",\n border: \"2px dashed #f97316\",\n boxSizing: \"border-box\",\n pointerEvents: \"none\",\n }}\n />\n )}\n </div>\n );\n}\n","export { resolveTheme } from \"@diegotsi/flint-core\";\n","import { Flint, type FlintWidgetProps } from \"@diegotsi/flint-core\";\nimport type { eventWithTime } from \"@rrweb/types\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { I18nextProvider, useTranslation } from \"react-i18next\";\nimport { submitReport } from \"./api.js\";\nimport { createConsoleCollector } from \"./collectors/console.js\";\nimport { collectEnvironment } from \"./collectors/environment.js\";\nimport { createFormErrorCollector } from \"./collectors/formErrors.js\";\nimport { createFrustrationCollector } from \"./collectors/frustration.js\";\nimport { createNetworkCollector } from \"./collectors/network.js\";\nimport { FlintModal } from \"./FlintModal.js\";\nimport widgetI18n from \"./i18n/index.js\";\nimport { _setFormErrorCollector, useFlintStore } from \"./store.js\";\nimport { resolveTheme } from \"./theme.js\";\n\nconst REPLAY_WINDOW_MS = 60_000; // rolling 60-second buffer\n\nexport function FlintWidget(props: FlintWidgetProps) {\n const { locale = \"en-US\" } = props;\n\n useEffect(() => {\n widgetI18n.changeLanguage(locale);\n }, [locale]);\n\n return (\n <I18nextProvider i18n={widgetI18n}>\n <WidgetContent {...props} />\n </I18nextProvider>\n );\n}\n\nfunction WidgetContent({\n projectKey,\n serverUrl,\n user,\n meta,\n extraFields,\n buttonLabel,\n theme = \"dark\",\n zIndex = 9999,\n statusPageUrl,\n datadogSite,\n enableReplay = true,\n enableScreenshot = true,\n enableConsole = true,\n enableNetwork = true,\n enableTextIssues = true,\n enableFormErrors = true,\n enableFrustration = false,\n autoReportFrustration = false,\n onBeforeSubmit,\n onSuccess,\n onError,\n onOpen,\n onClose,\n}: FlintWidgetProps) {\n const globalState = useFlintStore();\n const resolvedUser = user ?? globalState.user;\n const resolvedSessionReplay = extraFields?.sessionReplay ?? globalState.sessionReplay;\n const getExternalReplayUrl = () => {\n // 1. Explicit sessionReplay prop takes priority\n const src = resolvedSessionReplay;\n const explicit = typeof src === \"function\" ? src() : src;\n if (explicit) return explicit;\n\n // 2. Auto-detect Datadog RUM if datadogSite is configured\n if (datadogSite) {\n try {\n const ddRum = (window as unknown as Record<string, unknown>).DD_RUM as\n | { getInternalContext?: () => { session_id?: string } | undefined }\n | undefined;\n const ctx = ddRum?.getInternalContext?.();\n if (ctx?.session_id) {\n const now = Math.floor(Date.now() / 1000);\n const fromTs = now - 30; // 30s before bug report\n const toTs = now + 5; // 5s buffer\n return `https://${datadogSite}/rum/replay/sessions/${ctx.session_id}?from_ts=${fromTs}&to_ts=${toTs}&tab=replay&live=false`;\n }\n } catch {\n // DD_RUM not available or threw — silently skip\n }\n }\n\n return undefined;\n };\n const { t } = useTranslation();\n const [open, setOpen] = useState(false);\n const [hovered, setHovered] = useState(false);\n const pendingSelection = useRef(\"\");\n const colors = resolveTheme(theme);\n\n // ── Selection tooltip ────────────────────────────────────────────────────\n const [selectionTooltip, setSelectionTooltip] = useState<{\n text: string;\n x: number;\n y: number;\n } | null>(null);\n const tooltipRef = useRef<HTMLButtonElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n\n const handleMouseUp = useCallback((e: MouseEvent) => {\n const target = e.target as Node;\n // Ignore clicks inside our own tooltip/trigger or when modal is open\n if (tooltipRef.current?.contains(target)) return;\n if (triggerRef.current?.contains(target)) return;\n\n // Small delay so the browser finalises the selection\n requestAnimationFrame(() => {\n const sel = window.getSelection();\n const text = sel?.toString().trim() ?? \"\";\n if (text.length < 2) {\n setSelectionTooltip(null);\n return;\n }\n\n const range = sel?.getRangeAt(0);\n if (!range) return;\n const rect = range.getBoundingClientRect();\n setSelectionTooltip({\n text,\n x: rect.left + rect.width / 2,\n y: rect.top - 8,\n });\n });\n }, []);\n\n const handleSelectionChange = useCallback(() => {\n const text = window.getSelection()?.toString().trim() ?? \"\";\n if (text.length < 2) setSelectionTooltip(null);\n }, []);\n\n useEffect(() => {\n document.addEventListener(\"mouseup\", handleMouseUp);\n document.addEventListener(\"selectionchange\", handleSelectionChange);\n return () => {\n document.removeEventListener(\"mouseup\", handleMouseUp);\n document.removeEventListener(\"selectionchange\", handleSelectionChange);\n };\n }, [handleMouseUp, handleSelectionChange]);\n\n const openWithSelection = (text: string) => {\n pendingSelection.current = text;\n setSelectionTooltip(null);\n setOpen(true);\n onOpen?.();\n };\n\n // ── Collectors ─────────────────────────────────────────────────────────────\n // If Flint.init() was called, read from the global singleton.\n // Otherwise, create local collectors (backward compat).\n const globalInit = Flint.isInitialized();\n const global = Flint.getInstance();\n\n const consoleCollector = useRef<ReturnType<typeof createConsoleCollector> | null>(null);\n const networkCollector = useRef<ReturnType<typeof createNetworkCollector> | null>(null);\n const replayEvents = useRef<eventWithTime[]>([]);\n const stopReplay = useRef<(() => void) | null>(null);\n const formErrorCollector = useRef<ReturnType<typeof createFormErrorCollector> | null>(null);\n const frustrationCollector = useRef<ReturnType<typeof createFrustrationCollector> | null>(null);\n\n if (!globalInit) {\n if (enableConsole && !consoleCollector.current) {\n consoleCollector.current = createConsoleCollector();\n consoleCollector.current.start();\n }\n if (enableNetwork && !networkCollector.current) {\n const flintHost = (() => {\n try {\n return new URL(serverUrl).hostname;\n } catch {\n return \"\";\n }\n })();\n networkCollector.current = createNetworkCollector(flintHost ? [flintHost] : []);\n networkCollector.current.start();\n }\n if (enableFormErrors && !formErrorCollector.current) {\n formErrorCollector.current = createFormErrorCollector();\n formErrorCollector.current.start();\n _setFormErrorCollector(formErrorCollector.current);\n }\n if (enableFrustration && !frustrationCollector.current) {\n frustrationCollector.current = createFrustrationCollector();\n frustrationCollector.current.start();\n }\n }\n\n useEffect(() => {\n if (globalInit) return;\n let cancelled = false;\n\n if (enableReplay) {\n import(\"rrweb\").then(({ record }) => {\n if (cancelled) return;\n const stopFn = record({\n emit(event) {\n replayEvents.current.push(event);\n const cutoff = Date.now() - REPLAY_WINDOW_MS;\n while (replayEvents.current.length > 0 && replayEvents.current[0].timestamp < cutoff) {\n replayEvents.current.shift();\n }\n },\n });\n stopReplay.current = stopFn ?? null;\n });\n }\n\n return () => {\n cancelled = true;\n consoleCollector.current?.stop();\n networkCollector.current?.stop();\n formErrorCollector.current?.stop();\n _setFormErrorCollector(null);\n frustrationCollector.current?.stop();\n stopReplay.current?.();\n };\n }, [enableReplay, globalInit]);\n\n // ── Auto-report frustration events (only for local collectors) ───────────\n useEffect(() => {\n if (globalInit) return;\n if (!enableFrustration || !autoReportFrustration || !frustrationCollector.current) return;\n\n const unsubscribe = frustrationCollector.current.onFrustration(async (event) => {\n const user = resolvedUser;\n await submitReport(serverUrl, projectKey, {\n reporterId: user?.id ?? \"anonymous\",\n reporterName: user?.name ?? \"Anonymous\",\n reporterEmail: user?.email,\n description: `[Auto-detected] ${event.type.replace(/_/g, \" \")}: ${event.details}`,\n severity: event.type === \"error_loop\" ? \"P1\" : event.type === \"rage_click\" ? \"P2\" : \"P3\",\n url: event.url,\n meta: {\n environment: collectEnvironment(),\n consoleLogs: consoleCollector.current?.getEntries() ?? [],\n networkErrors: networkCollector.current?.getEntries() ?? [],\n formErrors: formErrorCollector.current?.getEntries() ?? [],\n frustrationEvent: event,\n },\n }).catch(() => {});\n });\n\n return unsubscribe;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [enableFrustration, autoReportFrustration, globalInit]);\n\n const label = buttonLabel ?? t(\"buttonLabel\");\n\n return (\n <>\n {/* Floating trigger button */}\n <button\n ref={triggerRef}\n onMouseDown={() => {\n pendingSelection.current = window.getSelection()?.toString().trim() ?? \"\";\n }}\n onClick={() => {\n setOpen(true);\n onOpen?.();\n }}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n aria-label={label}\n style={{\n position: \"fixed\",\n bottom: \"40px\",\n right: \"20px\",\n zIndex: zIndex - 1,\n display: \"flex\",\n alignItems: \"center\",\n gap: \"8px\",\n padding: \"10px 18px\",\n borderRadius: \"24px\",\n border: \"none\",\n background: `linear-gradient(135deg, ${colors.accent}, ${colors.accentHover})`,\n color: colors.buttonText,\n fontSize: \"13px\",\n fontWeight: 600,\n cursor: \"pointer\",\n boxShadow: hovered\n ? `0 0 28px ${colors.accent}55, 0 8px 24px rgba(0,0,0,0.3)`\n : `0 0 16px ${colors.accent}33, 0 4px 16px rgba(0,0,0,0.2)`,\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif',\n transform: hovered ? \"translateY(-2px)\" : \"translateY(0)\",\n transition: \"transform 0.15s ease, box-shadow 0.15s ease\",\n letterSpacing: \"0.01em\",\n }}\n >\n <SparkIcon />\n {label}\n </button>\n\n {/* Selection tooltip */}\n {enableTextIssues && selectionTooltip && !open && (\n <button\n ref={tooltipRef}\n onClick={() => openWithSelection(selectionTooltip.text)}\n style={{\n position: \"fixed\",\n left: Math.max(8, Math.min(selectionTooltip.x - 70, window.innerWidth - 148)),\n top: Math.max(8, selectionTooltip.y - 36),\n zIndex: zIndex + 1,\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n padding: \"6px 12px\",\n borderRadius: 10,\n border: \"none\",\n background: `linear-gradient(135deg, ${colors.accent}, ${colors.accentHover})`,\n color: colors.buttonText,\n fontSize: 12,\n fontWeight: 600,\n cursor: \"pointer\",\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif',\n boxShadow: `0 4px 20px rgba(0,0,0,0.25), 0 0 12px ${colors.accent}40`,\n animation: \"flint-tooltip-in 0.15s ease-out\",\n whiteSpace: \"nowrap\",\n }}\n >\n <TextIcon />\n Report text issue\n </button>\n )}\n\n {/* Tooltip animation */}\n <style>{`\n @keyframes flint-tooltip-in {\n from { opacity: 0; transform: translateY(4px); }\n to { opacity: 1; transform: translateY(0); }\n }\n `}</style>\n\n {/* Modal */}\n {open && (\n <FlintModal\n projectKey={projectKey}\n serverUrl={serverUrl}\n user={resolvedUser}\n meta={meta}\n theme={theme}\n zIndex={zIndex}\n onClose={() => {\n setOpen(false);\n onClose?.();\n pendingSelection.current = \"\";\n }}\n getEnvironment={collectEnvironment}\n getConsoleLogs={() =>\n globalInit ? (global?.console?.getEntries() ?? []) : (consoleCollector.current?.getEntries() ?? [])\n }\n getNetworkErrors={() =>\n globalInit ? (global?.network?.getEntries() ?? []) : (networkCollector.current?.getEntries() ?? [])\n }\n getFormErrors={() =>\n globalInit ? (global?.formErrors?.getEntries() ?? []) : (formErrorCollector.current?.getEntries() ?? [])\n }\n getReplayEvents={() =>\n globalInit ? (Flint.getReplayEvents() as eventWithTime[]) : [...replayEvents.current]\n }\n getExternalReplayUrl={getExternalReplayUrl}\n initialSelection={pendingSelection.current}\n enableScreenshot={enableScreenshot}\n enableTextIssues={enableTextIssues}\n statusPageUrl={statusPageUrl}\n onBeforeSubmit={onBeforeSubmit}\n onSuccess={onSuccess}\n onError={onError}\n />\n )}\n </>\n );\n}\n\nfunction TextIcon() {\n return (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M17 10H3\" />\n <path d=\"M21 6H3\" />\n <path d=\"M21 14H3\" />\n <path d=\"M17 18H3\" />\n </svg>\n );\n}\n\nfunction SparkIcon() {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M13 2L3 14h9l-1 8 10-12h-9l1-8z\" />\n </svg>\n );\n}\n","export { createConsoleCollector } from \"@diegotsi/flint-core\";\n","export { collectEnvironment } from \"@diegotsi/flint-core\";\n","export { createFormErrorCollector } from \"@diegotsi/flint-core\";\n","export { createFrustrationCollector } from \"@diegotsi/flint-core\";\n","export { createNetworkCollector } from \"@diegotsi/flint-core\";\n","import i18next, { createInstance } from \"i18next\";\nimport { initReactI18next } from \"react-i18next\";\nimport en from \"./locales/en.json\";\n\nexport const widgetI18n: ReturnType<typeof createInstance> = createInstance();\n\nwidgetI18n.use(initReactI18next).init({\n lng: \"en-US\",\n fallbackLng: \"en-US\",\n resources: { \"en-US\": { translation: en } },\n interpolation: { escapeValue: false },\n initImmediate: false,\n});\n\nexport default widgetI18n;\n","{\n \"buttonLabel\": \"Report bug\",\n \"modalTitle\": \"Report an issue\",\n \"severityLabel\": \"Severity\",\n \"severity_P1_hint\": \"Critical — system down\",\n \"severity_P2_hint\": \"High — core feature broken\",\n \"severity_P3_hint\": \"Medium — noticeable but workable\",\n \"severity_P4_hint\": \"Low — cosmetic or improvement\",\n \"severity_P1_label\": \"Critical\",\n \"severity_P2_label\": \"High\",\n \"severity_P3_label\": \"Medium\",\n \"severity_P4_label\": \"Low\",\n \"whatIsBrokenLabel\": \"What Is Broken\",\n \"whatIsBrokenPlaceholder\": \"1–2 sentences: what is currently happening that should NOT happen.\",\n \"expectedBehaviorLabel\": \"Expected Behavior (optional)\",\n \"expectedBehaviorPlaceholder\": \"Describe exactly what the user should see or receive after the fix.\",\n \"screenshotLabel\": \"Screenshot (optional)\",\n \"screenshotPlaceholder\": \"Click to attach...\",\n \"screenshotAttachFile\": \"Attach file\",\n \"screenshotMarkOnScreen\": \"Mark on screen\",\n \"submitLabel\": \"Submit\",\n \"close\": \"Close\",\n \"successTitle\": \"Bug reported!\",\n \"successDuplicate\": \"Looks like a duplicate of an existing bug.\",\n \"successGitHub\": \"View GitHub issue\",\n \"successSlack\": \"View Slack message\",\n \"replayInfo\": \"No need to record your screen — we automatically capture a session replay when you submit.\",\n \"errorLabel\": \"Failed to submit. Please try again.\",\n \"cancel\": \"Cancel\",\n \"sending\": \"Sending report\",\n \"capturingContext\": \"Capturing context\"\n}\n","import { getSnapshot, subscribe } from \"@diegotsi/flint-core\";\nimport { useSyncExternalStore } from \"react\";\n\nexport { _setFormErrorCollector, Flint, flint } from \"@diegotsi/flint-core\";\n\nexport function useFlintStore() {\n return useSyncExternalStore(subscribe, getSnapshot);\n}\n"],"mappings":"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","names":["import_react","import_flint_core","import_jsx_runtime","import_flint_core","import_react","import_react_i18next","import_flint_core","import_flint_core","import_flint_core","import_flint_core","import_flint_core","import_react_i18next","import_flint_core","import_react","import_jsx_runtime","user","SparkIcon"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/FlintModal.tsx","../src/api.ts","../src/ScreenAnnotator.tsx","../src/theme.ts","../src/FlintWidget.tsx","../src/collectors/console.ts","../src/collectors/environment.ts","../src/collectors/formErrors.ts","../src/collectors/frustration.ts","../src/collectors/network.ts","../src/i18n/index.ts","../src/i18n/locales/en.json","../src/store.ts"],"sourcesContent":["export type {\n FlintConfig,\n FlintUser,\n FlintWidgetProps,\n Locale,\n ReportPayload,\n ReportResult,\n Severity,\n Theme,\n ThemeOverride,\n} from \"@diegotsi/flint-core\";\nexport { FlintModal } from \"./FlintModal.js\";\nexport { FlintWidget } from \"./FlintWidget.js\";\nexport { Flint, flint } from \"./store.js\";\n","import type {\n ConsoleEntry,\n EnvironmentInfo,\n FlintUser,\n FormErrorEntry,\n NetworkEntry,\n ReportPayload,\n ReportResult,\n Severity,\n Theme,\n} from \"@diegotsi/flint-core\";\nimport type { eventWithTime } from \"@rrweb/types\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { submitReplay, submitReport } from \"./api.js\";\nimport { ScreenAnnotator } from \"./ScreenAnnotator.js\";\nimport { resolveTheme } from \"./theme.js\";\n\ninterface Props {\n projectKey: string;\n serverUrl: string;\n user?: FlintUser;\n meta?: Record<string, unknown>;\n theme: Theme;\n zIndex: number;\n onClose: () => void;\n getEnvironment: () => EnvironmentInfo;\n getConsoleLogs: () => ConsoleEntry[];\n getNetworkErrors: () => NetworkEntry[];\n getFormErrors: () => FormErrorEntry[];\n getReplayEvents: () => eventWithTime[];\n getExternalReplayUrl: () => string | undefined;\n initialSelection?: string;\n enableScreenshot?: boolean;\n enableTextIssues?: boolean;\n statusPageUrl?: string;\n onBeforeSubmit?: (payload: ReportPayload) => boolean | Promise<boolean>;\n onSuccess?: (result: ReportResult) => void;\n onError?: (error: Error) => void;\n}\n\nconst SEVERITIES: Severity[] = [\"P1\", \"P2\", \"P3\", \"P4\"];\nconst SEV_COLOR: Record<Severity, string> = {\n P1: \"#ef4444\",\n P2: \"#f97316\",\n P3: \"#eab308\",\n P4: \"#22c55e\",\n};\n\ntype Status = \"idle\" | \"submitting\" | \"success\" | \"error\";\n\n// Inject CSS keyframes once — animations can't be done with inline styles alone\nfunction injectKeyframes() {\n if (typeof document === \"undefined\") return;\n if (document.getElementById(\"_flint_kf\")) return;\n const s = document.createElement(\"style\");\n s.id = \"_flint_kf\";\n s.textContent = `\n @keyframes _flint_in {\n from { opacity: 0; transform: scale(0.93) translateY(10px); }\n to { opacity: 1; transform: scale(1) translateY(0); }\n }\n @keyframes _flint_overlay_in {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n @keyframes _flint_spin {\n to { transform: rotate(360deg); }\n }\n @keyframes _flint_pulse {\n 0%, 100% { opacity: 0.5; transform: scale(0.88); }\n 50% { opacity: 1; transform: scale(1.08); }\n }\n @keyframes _flint_ripple {\n 0% { opacity: 0.5; transform: scale(0.75); }\n 100% { opacity: 0; transform: scale(1.55); }\n }\n @keyframes _flint_sending_dot {\n 0%, 80%, 100% { opacity: 0.2; transform: scale(0.8); }\n 40% { opacity: 1; transform: scale(1); }\n }\n @keyframes _flint_success_up {\n from { opacity: 0; transform: translateY(8px); }\n to { opacity: 1; transform: translateY(0); }\n }\n `;\n document.head.appendChild(s);\n}\n\nexport function FlintModal({\n projectKey,\n serverUrl,\n user,\n meta,\n theme,\n zIndex,\n onClose,\n getEnvironment,\n getConsoleLogs,\n getNetworkErrors,\n getFormErrors,\n getReplayEvents,\n getExternalReplayUrl,\n initialSelection = \"\",\n enableScreenshot = true,\n enableTextIssues = true,\n statusPageUrl,\n onBeforeSubmit,\n onSuccess,\n onError,\n}: Props) {\n const { t } = useTranslation();\n const colors = resolveTheme(theme);\n const isDark = theme === \"dark\";\n\n const [severity, setSeverity] = useState<Severity>(\"P2\");\n const [description, setDescription] = useState(\"\");\n const [expectedBehavior, setExpectedBehavior] = useState(\"\");\n const [screenshot, setScreenshot] = useState<File | null>(null);\n const [annotating, setAnnotating] = useState(false);\n const [status, setStatus] = useState<Status>(\"idle\");\n const [result, setResult] = useState<ReportResult | null>(null);\n const [errorMsg, setErrorMsg] = useState(\"\");\n\n // Text issue mode\n const [mode, setMode] = useState<\"bug\" | \"text\">(enableTextIssues && initialSelection ? \"text\" : \"bug\");\n const [textOriginal, setTextOriginal] = useState(initialSelection);\n const [textSuggested, setTextSuggested] = useState(\"\");\n const [textLang, setTextLang] = useState(\n typeof document !== \"undefined\" ? document.documentElement.lang?.split(\"-\")[0] || \"en\" : \"en\",\n );\n\n const fileRef = useRef<HTMLInputElement>(null);\n const overlayRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n injectKeyframes();\n }, []);\n\n useEffect(() => {\n const handler = (e: KeyboardEvent) => {\n if (e.key === \"Escape\" && status !== \"submitting\") onClose();\n };\n window.addEventListener(\"keydown\", handler);\n return () => window.removeEventListener(\"keydown\", handler);\n }, [onClose, status]);\n\n const handleOverlayClick = useCallback(\n (e: React.MouseEvent) => {\n if (e.target === overlayRef.current && status !== \"submitting\") onClose();\n },\n [onClose, status],\n );\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n const isText = mode === \"text\";\n if (isText) {\n if (!textOriginal.trim() || !textSuggested.trim()) return;\n } else {\n if (!description.trim()) return;\n }\n\n setStatus(\"submitting\");\n setErrorMsg(\"\");\n\n const collectedMeta: Record<string, unknown> = {\n ...meta,\n environment: getEnvironment(),\n consoleLogs: getConsoleLogs(),\n networkErrors: getNetworkErrors(),\n formErrors: getFormErrors(),\n };\n\n if (isText) {\n collectedMeta.textIssue = {\n original: textOriginal.trim(),\n suggested: textSuggested.trim(),\n lang: textLang,\n };\n }\n\n const payload: ReportPayload = {\n reporterId: user?.id ?? \"anonymous\",\n reporterName: user?.name ?? \"Anonymous\",\n reporterEmail: user?.email,\n description: isText ? `[Text issue] \"${textOriginal.trim()}\" → \"${textSuggested.trim()}\"` : description.trim(),\n expectedBehavior: !isText ? expectedBehavior.trim() || undefined : undefined,\n externalReplayUrl: getExternalReplayUrl() || undefined,\n severity: isText ? \"P3\" : severity,\n url: window.location.href,\n meta: collectedMeta,\n label: isText ? \"TEXT\" : undefined,\n };\n\n if (onBeforeSubmit) {\n const proceed = await onBeforeSubmit(payload);\n if (!proceed) {\n setStatus(\"idle\");\n return;\n }\n }\n\n try {\n const res = await submitReport(serverUrl, projectKey, payload, !isText ? (screenshot ?? undefined) : undefined);\n setResult(res);\n setStatus(\"success\");\n onSuccess?.(res);\n\n const events = getReplayEvents();\n if (events.length > 0) {\n submitReplay(serverUrl, projectKey, res.id, events).catch(() => {});\n }\n } catch (err) {\n const error = err instanceof Error ? err : new Error(t(\"errorLabel\"));\n setErrorMsg(error.message);\n setStatus(\"error\");\n onError?.(error);\n }\n };\n\n // ── Shared style tokens ────────────────────────────────────────────────────\n const inputBorder = isDark ? \"rgba(255,255,255,0.1)\" : \"rgba(0,0,0,0.1)\";\n const accentGlow = `0 0 20px ${colors.accent}40, 0 4px 16px rgba(0,0,0,0.2)`;\n\n const overlayStyle: React.CSSProperties = {\n position: \"fixed\",\n inset: 0,\n background: \"rgba(0,0,0,0.5)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n zIndex,\n padding: \"16px\",\n backdropFilter: \"blur(10px)\",\n WebkitBackdropFilter: \"blur(10px)\",\n animation: \"_flint_overlay_in 0.2s ease\",\n };\n\n const modalStyle: React.CSSProperties = {\n background: colors.background,\n backdropFilter: colors.backdropFilter,\n WebkitBackdropFilter: colors.backdropFilter,\n borderRadius: \"20px\",\n boxShadow: colors.shadow,\n border: `1px solid ${colors.border}`,\n width: \"100%\",\n maxWidth: \"600px\",\n maxHeight: \"92vh\",\n overflowY: \"auto\",\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif',\n color: colors.text,\n animation: \"_flint_in 0.28s cubic-bezier(0.16, 1, 0.3, 1)\",\n };\n\n const inputStyle: React.CSSProperties = {\n width: \"100%\",\n padding: \"11px 13px\",\n borderRadius: \"10px\",\n border: `1px solid ${inputBorder}`,\n background: colors.backgroundSecondary,\n color: colors.text,\n fontSize: \"16px\",\n outline: \"none\",\n boxSizing: \"border-box\",\n fontFamily: \"inherit\",\n transition: \"border-color 0.15s\",\n };\n\n // ── Loading + Success (unified animated state) ────────────────────────────\n if (status === \"submitting\" || status === \"success\") {\n const isSuccess = status === \"success\";\n const ringBorder = isSuccess\n ? \"3px solid #22c55e\"\n : `3px solid ${isDark ? \"rgba(255,255,255,0.08)\" : \"rgba(0,0,0,0.08)\"}`;\n const ringTopColor = isSuccess ? \"#22c55e\" : colors.accent;\n\n return (\n <div style={overlayStyle}>\n <div\n style={modalStyle}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={isSuccess ? t(\"successTitle\") : t(\"sending\")}\n >\n <ModalHeader colors={colors} inputBorder={inputBorder} showClose={false} onClose={onClose} />\n\n <div\n style={{\n padding: \"40px 32px 48px\",\n textAlign: \"center\",\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n }}\n >\n {/* Animated rings */}\n <div style={{ position: \"relative\", width: 80, height: 80, marginBottom: 28 }}>\n {/* Ripple 1 — fade out on success */}\n <div\n style={{\n position: \"absolute\",\n inset: -10,\n borderRadius: \"50%\",\n border: `1.5px solid ${colors.accent}`,\n animation: \"_flint_ripple 1.8s ease-out infinite\",\n opacity: isSuccess ? 0 : 1,\n transition: \"opacity 0.3s ease\",\n }}\n />\n {/* Ripple 2 (delayed) */}\n <div\n style={{\n position: \"absolute\",\n inset: -10,\n borderRadius: \"50%\",\n border: `1.5px solid ${colors.accent}`,\n animation: \"_flint_ripple 1.8s ease-out infinite 0.6s\",\n opacity: isSuccess ? 0 : 1,\n transition: \"opacity 0.3s ease\",\n }}\n />\n {/* Spinning ring — transitions to solid green on success */}\n <div\n style={{\n position: \"absolute\",\n inset: 0,\n borderRadius: \"50%\",\n border: ringBorder,\n borderTopColor: ringTopColor,\n animation: isSuccess ? \"none\" : \"_flint_spin 0.85s linear infinite\",\n transition: \"border-color 0.45s ease, border-top-color 0.45s ease\",\n }}\n />\n {/* Center: spark fades out, check fades in */}\n <div style={{ position: \"absolute\", inset: 14, borderRadius: \"50%\" }}>\n {/* Spark */}\n <div\n style={{\n position: \"absolute\",\n inset: 0,\n borderRadius: \"50%\",\n background: `linear-gradient(135deg, ${colors.accent}30, ${colors.accentHover}50)`,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n animation: isSuccess ? \"none\" : \"_flint_pulse 2s ease-in-out infinite\",\n opacity: isSuccess ? 0 : 1,\n transition: \"opacity 0.3s ease\",\n }}\n >\n <SparkIcon color={colors.accent} size={20} />\n </div>\n {/* Checkmark */}\n <div\n style={{\n position: \"absolute\",\n inset: 0,\n borderRadius: \"50%\",\n background: \"rgba(34,197,94,0.15)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n opacity: isSuccess ? 1 : 0,\n transform: isSuccess ? \"scale(1)\" : \"scale(0.65)\",\n transition: \"opacity 0.35s ease 0.2s, transform 0.4s cubic-bezier(0.16,1,0.3,1) 0.2s\",\n }}\n >\n <CheckIcon size={20} />\n </div>\n </div>\n </div>\n\n {/* Title crossfade */}\n <div style={{ position: \"relative\", height: 26, width: \"100%\", marginBottom: 10 }}>\n <div\n style={{\n position: \"absolute\",\n inset: 0,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n fontSize: 19,\n fontWeight: 700,\n color: colors.text,\n letterSpacing: \"-0.02em\",\n opacity: isSuccess ? 0 : 1,\n transition: \"opacity 0.25s ease\",\n pointerEvents: \"none\",\n }}\n >\n {t(\"sending\")}\n </div>\n <div\n style={{\n position: \"absolute\",\n inset: 0,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n fontSize: 19,\n fontWeight: 700,\n color: colors.text,\n letterSpacing: \"-0.02em\",\n opacity: isSuccess ? 1 : 0,\n transform: isSuccess ? \"translateY(0)\" : \"translateY(6px)\",\n transition: \"opacity 0.35s ease 0.25s, transform 0.35s ease 0.25s\",\n pointerEvents: isSuccess ? \"auto\" : \"none\",\n }}\n >\n {t(\"successTitle\")}\n </div>\n </div>\n\n {/* Subtitle crossfade */}\n <div style={{ position: \"relative\", minHeight: 76, width: \"100%\" }}>\n {/* Loading subtitle */}\n <div\n style={{\n position: \"absolute\",\n inset: 0,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 6,\n color: colors.textMuted,\n fontSize: 15,\n opacity: isSuccess ? 0 : 1,\n transition: \"opacity 0.2s ease\",\n pointerEvents: \"none\",\n }}\n >\n <span>{t(\"capturingContext\")}</span>\n <SendingDots color={colors.accent} />\n </div>\n {/* Success subtitle */}\n <div\n style={{\n position: \"absolute\",\n inset: 0,\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n gap: 10,\n opacity: isSuccess ? 1 : 0,\n transform: isSuccess ? \"translateY(0)\" : \"translateY(8px)\",\n transition: \"opacity 0.35s ease 0.35s, transform 0.35s ease 0.35s\",\n pointerEvents: isSuccess ? \"auto\" : \"none\",\n }}\n >\n <p style={{ fontSize: 15, color: colors.textMuted, margin: 0 }}>{result ? `ID: ${result.id}` : \"\"}</p>\n {statusPageUrl && user?.id && (\n <a\n href={`${statusPageUrl}/status?project_key=${encodeURIComponent(projectKey)}&reporter_id=${encodeURIComponent(user.id)}&server_url=${encodeURIComponent(serverUrl)}`}\n target=\"_blank\"\n rel=\"noreferrer\"\n style={{\n fontSize: 14,\n color: colors.accent,\n textDecoration: \"none\",\n fontWeight: 600,\n animation: \"_flint_success_up 0.35s ease 0.4s both\",\n }}\n >\n {\"\\ud83d\\udccb\"} Track your bugs {\"\\u2192\"}\n </a>\n )}\n {/*\n {result?.slackMessageUrl && (\n <a\n href={result.slackMessageUrl}\n target=\"_blank\"\n rel=\"noreferrer\"\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 6,\n padding: \"9px 18px\",\n borderRadius: \"10px\",\n background: `linear-gradient(135deg, ${colors.accent}, ${colors.accentHover})`,\n color: colors.buttonText,\n textDecoration: \"none\",\n fontSize: \"15px\",\n fontWeight: 600,\n boxShadow: accentGlow,\n }}\n >\n {t(\"successSlack\")} ↗\n </a>\n )} */}\n <button\n onClick={onClose}\n style={{\n width: \"100%\",\n padding: \"13px 20px\",\n borderRadius: 12,\n border: \"none\",\n background: `linear-gradient(135deg, ${colors.accent}, ${colors.accentHover})`,\n color: colors.buttonText,\n fontSize: 17,\n fontWeight: 700,\n cursor: \"pointer\",\n letterSpacing: \"-0.01em\",\n boxShadow: accentGlow,\n fontFamily: \"inherit\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 8,\n }}\n >\n {t(\"close\")}\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n );\n }\n\n // ── Form ──────────────────────────────────────────────────────────────────\n return (\n <>\n {enableScreenshot && annotating && (\n <ScreenAnnotator\n zIndex={zIndex + 1}\n onCapture={(file) => {\n setScreenshot(file);\n setAnnotating(false);\n }}\n onCancel={() => setAnnotating(false)}\n />\n )}\n {!annotating && (\n <div ref={overlayRef} style={overlayStyle} onClick={handleOverlayClick}>\n <div style={modalStyle} role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"flint-modal-title\">\n <ModalHeader\n colors={colors}\n inputBorder={inputBorder}\n showClose\n onClose={onClose}\n titleId=\"flint-modal-title\"\n title={t(\"modalTitle\")}\n />\n\n <form onSubmit={handleSubmit} style={{ padding: \"20px 24px 24px\" }}>\n {/* Mode toggle */}\n {enableTextIssues && (\n <div\n style={{\n display: \"flex\",\n gap: 4,\n marginBottom: 20,\n background: colors.backgroundSecondary,\n borderRadius: 12,\n padding: 4,\n border: `1px solid ${inputBorder}`,\n }}\n >\n {([\"bug\", \"text\"] as const).map((m) => (\n <button\n key={m}\n type=\"button\"\n onClick={() => setMode(m)}\n style={{\n flex: 1,\n padding: \"8px 10px\",\n borderRadius: 9,\n border: \"none\",\n cursor: \"pointer\",\n fontSize: 13,\n fontWeight: mode === m ? 700 : 500,\n fontFamily: \"inherit\",\n transition: \"background 0.15s, color 0.15s\",\n background:\n mode === m\n ? `linear-gradient(135deg, ${colors.accent}, ${colors.accentHover})`\n : \"transparent\",\n color: mode === m ? colors.buttonText : colors.textMuted,\n boxShadow: mode === m ? `0 2px 8px ${colors.accent}30` : \"none\",\n }}\n >\n {m === \"bug\" ? \"🐛 Bug\" : \"🔤 Text / Translation\"}\n </button>\n ))}\n </div>\n )}\n\n {/* Text issue fields */}\n {mode === \"text\" && (\n <>\n <div style={{ marginBottom: 14 }}>\n <FieldLabel colors={colors} htmlFor=\"flint-text-original\">\n Original text\n </FieldLabel>\n <textarea\n id=\"flint-text-original\"\n style={{ ...inputStyle, resize: \"vertical\", minHeight: 60 }}\n value={textOriginal}\n onChange={(e) => setTextOriginal(e.target.value)}\n placeholder=\"Text that is wrong on screen…\"\n required\n />\n </div>\n <div style={{ marginBottom: 14 }}>\n <FieldLabel colors={colors} htmlFor=\"flint-text-suggested\">\n Suggested correction\n </FieldLabel>\n <textarea\n id=\"flint-text-suggested\"\n style={{ ...inputStyle, resize: \"vertical\", minHeight: 60 }}\n value={textSuggested}\n onChange={(e) => setTextSuggested(e.target.value)}\n placeholder=\"How it should read…\"\n required\n />\n </div>\n <div style={{ marginBottom: 20 }}>\n <FieldLabel colors={colors} htmlFor=\"flint-text-lang\">\n Language\n </FieldLabel>\n <select\n id=\"flint-text-lang\"\n value={textLang}\n onChange={(e) => setTextLang(e.target.value)}\n style={{\n ...inputStyle,\n appearance: \"none\",\n cursor: \"pointer\",\n }}\n >\n <option value=\"en\">English (en)</option>\n <option value=\"he\">עברית (he)</option>\n </select>\n </div>\n </>\n )}\n\n {/* Severity */}\n <div style={{ marginBottom: 18, display: mode === \"text\" ? \"none\" : undefined }}>\n <FieldLabel colors={colors}>{t(\"severityLabel\")}</FieldLabel>\n <div style={{ display: \"grid\", gridTemplateColumns: \"repeat(4,1fr)\", gap: 8 }}>\n {SEVERITIES.map((sev) => (\n <SeverityButton\n key={sev}\n sev={sev}\n label={t(`severity_${sev}_label`)}\n selected={severity === sev}\n hint={t(`severity_${sev}_hint`)}\n color={SEV_COLOR[sev]}\n accent={colors.accent}\n border={inputBorder}\n bg={colors.backgroundSecondary}\n text={colors.text}\n onClick={() => setSeverity(sev)}\n />\n ))}\n </div>\n </div>\n\n {/* What Is Broken */}\n {mode === \"bug\" && (\n <div style={{ marginBottom: 14 }}>\n <FieldLabel colors={colors} htmlFor=\"flint-description\">\n {t(\"whatIsBrokenLabel\")}\n </FieldLabel>\n <textarea\n id=\"flint-description\"\n style={{ ...inputStyle, resize: \"vertical\", minHeight: 80 }}\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n placeholder={t(\"whatIsBrokenPlaceholder\")}\n required\n />\n </div>\n )}\n\n {/* Expected Behavior (optional) */}\n {mode === \"bug\" && (\n <div style={{ marginBottom: 14 }}>\n <FieldLabel colors={colors} htmlFor=\"flint-expected\">\n {t(\"expectedBehaviorLabel\")}\n </FieldLabel>\n <textarea\n id=\"flint-expected\"\n style={{ ...inputStyle, resize: \"vertical\", minHeight: 72 }}\n value={expectedBehavior}\n onChange={(e) => setExpectedBehavior(e.target.value)}\n placeholder={t(\"expectedBehaviorPlaceholder\")}\n />\n </div>\n )}\n\n {/* Screenshot */}\n <div style={{ marginBottom: 20, display: mode === \"text\" || !enableScreenshot ? \"none\" : undefined }}>\n <FieldLabel colors={colors}>{t(\"screenshotLabel\")}</FieldLabel>\n {screenshot ? (\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 10 }}>\n <img\n src={URL.createObjectURL(screenshot)}\n alt=\"Screenshot preview\"\n style={{ height: 60, borderRadius: 8, objectFit: \"cover\", border: `1px solid ${inputBorder}` }}\n />\n <span\n style={{\n fontSize: 13,\n color: colors.textMuted,\n flex: 1,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {screenshot.name}\n </span>\n <button\n type=\"button\"\n onClick={() => setScreenshot(null)}\n aria-label=\"Remove screenshot\"\n style={{\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n fontSize: 18,\n color: colors.textMuted,\n lineHeight: 1,\n padding: \"2px 6px\",\n borderRadius: 6,\n fontFamily: \"inherit\",\n }}\n >\n ×\n </button>\n </div>\n ) : (\n <div style={{ display: \"flex\", gap: 8 }}>\n <button\n type=\"button\"\n onClick={() => fileRef.current?.click()}\n style={{\n flex: 1,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 6,\n padding: \"10px 13px\",\n borderRadius: 10,\n border: `1px dashed ${inputBorder}`,\n cursor: \"pointer\",\n fontSize: 14,\n color: colors.textMuted,\n background: colors.backgroundSecondary,\n fontFamily: \"inherit\",\n }}\n >\n 📎 {t(\"screenshotAttachFile\")}\n </button>\n <button\n type=\"button\"\n onClick={() => setAnnotating(true)}\n style={{\n flex: 1,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 6,\n padding: \"10px 13px\",\n borderRadius: 10,\n border: `1px dashed ${inputBorder}`,\n cursor: \"pointer\",\n fontSize: 14,\n color: colors.textMuted,\n background: colors.backgroundSecondary,\n fontFamily: \"inherit\",\n }}\n >\n 🔲 {t(\"screenshotMarkOnScreen\")}\n </button>\n </div>\n )}\n <input\n id=\"flint-screenshot\"\n ref={fileRef}\n type=\"file\"\n accept=\"image/*\"\n style={{ display: \"none\" }}\n onChange={(e) => setScreenshot(e.target.files?.[0] ?? null)}\n />\n </div>\n\n {/* Session replay info */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n padding: \"9px 12px\",\n borderRadius: 10,\n background: isDark ? \"rgba(255,255,255,0.04)\" : \"rgba(0,77,240,0.04)\",\n border: `1px solid ${isDark ? \"rgba(255,255,255,0.08)\" : \"rgba(0,77,240,0.1)\"}`,\n marginBottom: 16,\n }}\n >\n <span style={{ fontSize: 16 }}>🎥</span>\n <span style={{ fontSize: 14, color: colors.textMuted, lineHeight: 1.4 }}>{t(\"replayInfo\")}</span>\n </div>\n\n {/* Error */}\n {status === \"error\" && (\n <div\n style={{\n padding: \"10px 13px\",\n borderRadius: 10,\n background: \"rgba(239,68,68,0.08)\",\n border: \"1px solid rgba(239,68,68,0.2)\",\n color: \"#f87171\",\n fontSize: 14,\n marginBottom: 16,\n }}\n >\n ⚠️ {errorMsg || t(\"errorLabel\")}\n </div>\n )}\n\n {/* Submit */}\n <button\n type=\"submit\"\n style={{\n width: \"100%\",\n padding: \"13px 20px\",\n borderRadius: 12,\n border: \"none\",\n background: `linear-gradient(135deg, ${colors.accent}, ${colors.accentHover})`,\n color: colors.buttonText,\n fontSize: 17,\n fontWeight: 700,\n cursor: \"pointer\",\n letterSpacing: \"-0.01em\",\n boxShadow: accentGlow,\n fontFamily: \"inherit\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 8,\n }}\n >\n <SparkIcon color={colors.buttonText} size={15} />\n {t(\"submitLabel\")}\n </button>\n\n {/* Cancel */}\n <button\n type=\"button\"\n onClick={onClose}\n style={{\n width: \"100%\",\n padding: \"10px\",\n marginTop: 8,\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n fontSize: 15,\n color: colors.textMuted,\n fontFamily: \"inherit\",\n borderRadius: 8,\n }}\n >\n {t(\"cancel\")}\n </button>\n </form>\n </div>\n </div>\n )}\n </>\n );\n}\n\n// ─── Sub-components ──────────────────────────────────────────────────────────\n\nfunction ModalHeader({\n colors,\n inputBorder,\n showClose,\n onClose,\n titleId,\n title,\n}: {\n colors: ReturnType<typeof resolveTheme>;\n inputBorder: string;\n showClose: boolean;\n onClose: () => void;\n titleId?: string;\n title?: string;\n}) {\n return (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 10,\n padding: \"16px 20px 14px\",\n borderBottom: `1px solid ${inputBorder}`,\n }}\n >\n {/* Brand chip */}\n <div\n style={{\n width: 28,\n height: 28,\n borderRadius: 8,\n background: `linear-gradient(135deg, ${colors.accent}20, ${colors.accentHover}35)`,\n border: `1px solid ${colors.accent}30`,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n flexShrink: 0,\n }}\n >\n <SparkIcon color={colors.accent} size={13} />\n </div>\n\n {titleId && title ? (\n <h2\n id={titleId}\n style={{ margin: 0, fontSize: 16, fontWeight: 600, color: colors.text, letterSpacing: \"-0.01em\", flex: 1 }}\n >\n {title}\n </h2>\n ) : (\n <span style={{ flex: 1, fontSize: 15, fontWeight: 600, color: colors.textMuted }}>Flint</span>\n )}\n\n {showClose && (\n <button\n onClick={onClose}\n aria-label=\"Close\"\n style={{\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n padding: 4,\n color: colors.textMuted,\n fontSize: 22,\n lineHeight: 1,\n borderRadius: 6,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n opacity: 0.6,\n fontFamily: \"inherit\",\n }}\n >\n ×\n </button>\n )}\n </div>\n );\n}\n\nfunction FieldLabel({\n children,\n colors,\n htmlFor,\n}: {\n children: React.ReactNode;\n colors: ReturnType<typeof resolveTheme>;\n htmlFor?: string;\n}) {\n return (\n <label\n htmlFor={htmlFor}\n style={{\n display: \"block\",\n fontSize: \"12px\",\n fontWeight: 700,\n color: colors.textMuted,\n marginBottom: 6,\n textTransform: \"uppercase\" as const,\n letterSpacing: \"0.07em\",\n }}\n >\n {children}\n </label>\n );\n}\n\nfunction SendingDots({ color }: { color: string }) {\n return (\n <span style={{ display: \"inline-flex\", gap: 3, alignItems: \"center\" }}>\n {[0, 1, 2].map((i) => (\n <span\n key={i}\n style={{\n width: 4,\n height: 4,\n borderRadius: \"50%\",\n background: color,\n display: \"inline-block\",\n animation: `_flint_sending_dot 1.4s ease-in-out infinite ${i * 0.2}s`,\n }}\n />\n ))}\n </span>\n );\n}\n\ninterface SevBtnProps {\n sev: Severity;\n label: string;\n selected: boolean;\n hint: string;\n color: string;\n accent: string;\n border: string;\n bg: string;\n text: string;\n onClick: () => void;\n}\n\nfunction SeverityButton({ sev, label, selected, hint, color, accent, border, bg, text, onClick }: SevBtnProps) {\n return (\n <button\n type=\"button\"\n title={hint}\n onClick={onClick}\n style={{\n padding: \"9px 6px 8px\",\n borderRadius: 10,\n border: selected ? `2px solid ${accent}` : `1.5px solid ${border}`,\n background: selected ? `${accent}15` : bg,\n cursor: \"pointer\",\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n gap: 5,\n transition: \"border-color 0.12s, background 0.12s\",\n fontFamily: \"inherit\",\n }}\n >\n <span style={{ width: 8, height: 8, borderRadius: \"50%\", background: color, display: \"block\" }} />\n <span\n style={{\n fontSize: 13,\n fontWeight: selected ? 700 : 500,\n color: selected ? accent : text,\n letterSpacing: \"0.02em\",\n }}\n >\n {sev}\n </span>\n <span style={{ fontSize: 11, color: selected ? accent : text, opacity: 0.6, letterSpacing: \"0.02em\" }}>\n {label}\n </span>\n </button>\n );\n}\n\nfunction SparkIcon({ color = \"currentColor\", size = 14 }: { color?: string; size?: number }) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke={color}\n strokeWidth=\"2.2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M13 2L3 14h9l-1 8 10-12h-9l1-8z\" />\n </svg>\n );\n}\n\nfunction CheckIcon({ size = 20 }: { size?: number }) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"#22c55e\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n );\n}\n","export { submitReplay, submitReport } from \"@diegotsi/flint-core\";\n","import { domToCanvas } from \"modern-screenshot\";\nimport { useEffect, useRef, useState } from \"react\";\n\ninterface Props {\n zIndex: number;\n onCapture: (file: File) => void;\n onCancel: () => void;\n}\n\ntype Phase = \"idle\" | \"selecting\" | \"capturing\";\n\ninterface Rect {\n x: number;\n y: number;\n w: number;\n h: number;\n}\n\nfunction normalizeRect(startX: number, startY: number, endX: number, endY: number): Rect {\n return {\n x: Math.min(startX, endX),\n y: Math.min(startY, endY),\n w: Math.abs(endX - startX),\n h: Math.abs(endY - startY),\n };\n}\n\nexport function ScreenAnnotator({ zIndex, onCapture, onCancel }: Props) {\n const [phase, setPhase] = useState<Phase>(\"idle\");\n const [rect, setRect] = useState<Rect | null>(null);\n const startRef = useRef<{ x: number; y: number } | null>(null);\n const overlayRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") onCancel();\n };\n window.addEventListener(\"keydown\", onKey);\n return () => window.removeEventListener(\"keydown\", onKey);\n }, [onCancel]);\n\n const onMouseDown = (e: React.MouseEvent) => {\n e.preventDefault();\n startRef.current = { x: e.clientX, y: e.clientY };\n setPhase(\"selecting\");\n setRect({ x: e.clientX, y: e.clientY, w: 0, h: 0 });\n };\n\n const onMouseMove = (e: React.MouseEvent) => {\n if (phase !== \"selecting\" || !startRef.current) return;\n setRect(normalizeRect(startRef.current.x, startRef.current.y, e.clientX, e.clientY));\n };\n\n const onMouseUp = async (e: React.MouseEvent) => {\n if (phase !== \"selecting\" || !startRef.current) return;\n const finalRect = normalizeRect(startRef.current.x, startRef.current.y, e.clientX, e.clientY);\n startRef.current = null;\n\n if (finalRect.w < 5 || finalRect.h < 5) {\n setPhase(\"idle\");\n setRect(null);\n return;\n }\n\n setPhase(\"capturing\");\n\n const dpr = window.devicePixelRatio ?? 1;\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n\n // Wait for React to re-render + browser to paint so the overlay disappears\n await new Promise<void>((resolve) => requestAnimationFrame(() => requestAnimationFrame(() => resolve())));\n\n try {\n // Capture the visible viewport using modern-screenshot.\n // It clones only the visible area when width/height match the viewport.\n const fullCanvas = await domToCanvas(document.documentElement, {\n scale: dpr,\n width: vw,\n height: vh,\n style: {\n transform: `translate(-${window.scrollX}px, -${window.scrollY}px)`,\n },\n filter: (el) => el !== overlayRef.current,\n });\n\n // Crop canvas to viewport size (domToCanvas may produce a larger canvas)\n const canvas = document.createElement(\"canvas\");\n canvas.width = vw * dpr;\n canvas.height = vh * dpr;\n const ctx = canvas.getContext(\"2d\")!;\n ctx.drawImage(fullCanvas, 0, 0, vw * dpr, vh * dpr, 0, 0, vw * dpr, vh * dpr);\n\n // Draw annotation highlight — clientX/Y are viewport-relative\n ctx.fillStyle = \"rgba(255,200,0,0.25)\";\n ctx.fillRect(finalRect.x * dpr, finalRect.y * dpr, finalRect.w * dpr, finalRect.h * dpr);\n ctx.strokeStyle = \"#f97316\";\n ctx.lineWidth = 3 * dpr;\n ctx.strokeRect(finalRect.x * dpr, finalRect.y * dpr, finalRect.w * dpr, finalRect.h * dpr);\n\n canvas.toBlob((blob: Blob | null) => {\n if (blob) {\n onCapture(new File([blob], \"annotation.png\", { type: \"image/png\" }));\n } else {\n onCancel();\n }\n }, \"image/png\");\n } catch (err) {\n console.error(\"[Flint] ScreenAnnotator capture failed:\", err);\n onCancel();\n }\n };\n\n const isCapturing = phase === \"capturing\";\n\n return (\n <div\n ref={overlayRef}\n onMouseDown={onMouseDown}\n onMouseMove={onMouseMove}\n onMouseUp={onMouseUp}\n style={{\n position: \"fixed\",\n inset: 0,\n zIndex,\n cursor: isCapturing ? \"default\" : \"crosshair\",\n userSelect: \"none\",\n background: phase === \"selecting\" ? \"rgba(0,0,0,0.15)\" : \"rgba(0,0,0,0.05)\",\n transition: \"background 0.1s\",\n opacity: isCapturing ? 0 : 1,\n pointerEvents: isCapturing ? \"none\" : \"auto\",\n }}\n >\n {!isCapturing && (\n <div\n style={{\n position: \"absolute\",\n top: 16,\n left: \"50%\",\n transform: \"translateX(-50%)\",\n background: \"rgba(0,0,0,0.75)\",\n color: \"#fff\",\n padding: \"8px 18px\",\n borderRadius: 8,\n fontSize: 14,\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif',\n pointerEvents: \"none\",\n whiteSpace: \"nowrap\",\n backdropFilter: \"blur(4px)\",\n }}\n >\n Drag to highlight the problem area &nbsp;·&nbsp; Esc to cancel\n </div>\n )}\n\n {rect && phase === \"selecting\" && (\n <div\n style={{\n position: \"absolute\",\n left: rect.x,\n top: rect.y,\n width: rect.w,\n height: rect.h,\n background: \"rgba(255,200,0,0.2)\",\n border: \"2px dashed #f97316\",\n boxSizing: \"border-box\",\n pointerEvents: \"none\",\n }}\n />\n )}\n </div>\n );\n}\n","export { resolveTheme } from \"@diegotsi/flint-core\";\n","import { Flint, type FlintWidgetProps } from \"@diegotsi/flint-core\";\nimport type { eventWithTime } from \"@rrweb/types\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { I18nextProvider, useTranslation } from \"react-i18next\";\nimport { submitReport } from \"./api.js\";\nimport { createConsoleCollector } from \"./collectors/console.js\";\nimport { collectEnvironment } from \"./collectors/environment.js\";\nimport { createFormErrorCollector } from \"./collectors/formErrors.js\";\nimport { createFrustrationCollector } from \"./collectors/frustration.js\";\nimport { createNetworkCollector } from \"./collectors/network.js\";\nimport { FlintModal } from \"./FlintModal.js\";\nimport widgetI18n from \"./i18n/index.js\";\nimport { _setFormErrorCollector, useFlintStore } from \"./store.js\";\nimport { resolveTheme } from \"./theme.js\";\n\nconst REPLAY_WINDOW_MS = 60_000; // rolling 60s replay buffer\n\nexport function FlintWidget(props: FlintWidgetProps) {\n const { locale = \"en-US\" } = props;\n\n useEffect(() => {\n widgetI18n.changeLanguage(locale);\n }, [locale]);\n\n return (\n <I18nextProvider i18n={widgetI18n}>\n <WidgetContent {...props} />\n </I18nextProvider>\n );\n}\n\nfunction WidgetContent({\n projectKey,\n serverUrl,\n user,\n meta,\n extraFields,\n buttonLabel,\n theme = \"dark\",\n zIndex = 9999,\n statusPageUrl,\n datadogSite,\n enableReplay = true,\n enableScreenshot = true,\n enableConsole = true,\n enableNetwork = true,\n enableTextIssues = true,\n enableFormErrors = true,\n enableFrustration = false,\n autoReportFrustration = false,\n onBeforeSubmit,\n onSuccess,\n onError,\n onOpen,\n onClose,\n}: FlintWidgetProps) {\n const globalState = useFlintStore();\n const resolvedUser = user ?? globalState.user;\n const resolvedSessionReplay = extraFields?.sessionReplay ?? globalState.sessionReplay;\n const getExternalReplayUrl = () => {\n // 1. Explicit sessionReplay prop takes priority\n const src = resolvedSessionReplay;\n const explicit = typeof src === \"function\" ? src() : src;\n if (explicit) return explicit;\n\n // 2. Auto-detect Datadog RUM if datadogSite is configured\n if (datadogSite) {\n try {\n const ddRum = (window as unknown as Record<string, unknown>).DD_RUM as\n | { getInternalContext?: () => { session_id?: string } | undefined }\n | undefined;\n const ctx = ddRum?.getInternalContext?.();\n if (ctx?.session_id) {\n const now = Math.floor(Date.now() / 1000);\n const fromTs = now - 30; // 30s before bug report\n const toTs = now + 5; // 5s buffer\n return `https://${datadogSite}/rum/replay/sessions/${ctx.session_id}?from_ts=${fromTs}&to_ts=${toTs}&tab=replay&live=false`;\n }\n } catch {\n // DD_RUM not available or threw — silently skip\n }\n }\n\n return undefined;\n };\n const { t } = useTranslation();\n const [open, setOpen] = useState(false);\n const [hovered, setHovered] = useState(false);\n const pendingSelection = useRef(\"\");\n const colors = resolveTheme(theme);\n\n // ── Selection tooltip ────────────────────────────────────────────────────\n const [selectionTooltip, setSelectionTooltip] = useState<{\n text: string;\n x: number;\n y: number;\n } | null>(null);\n const tooltipRef = useRef<HTMLButtonElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n\n const handleMouseUp = useCallback((e: MouseEvent) => {\n const target = e.target as Node;\n // Ignore clicks inside our own tooltip/trigger or when modal is open\n if (tooltipRef.current?.contains(target)) return;\n if (triggerRef.current?.contains(target)) return;\n\n // Small delay so the browser finalises the selection\n requestAnimationFrame(() => {\n const sel = window.getSelection();\n const text = sel?.toString().trim() ?? \"\";\n if (text.length < 2) {\n setSelectionTooltip(null);\n return;\n }\n\n const range = sel?.getRangeAt(0);\n if (!range) return;\n const rect = range.getBoundingClientRect();\n setSelectionTooltip({\n text,\n x: rect.left + rect.width / 2,\n y: rect.top - 8,\n });\n });\n }, []);\n\n const handleSelectionChange = useCallback(() => {\n const text = window.getSelection()?.toString().trim() ?? \"\";\n if (text.length < 2) setSelectionTooltip(null);\n }, []);\n\n useEffect(() => {\n document.addEventListener(\"mouseup\", handleMouseUp);\n document.addEventListener(\"selectionchange\", handleSelectionChange);\n return () => {\n document.removeEventListener(\"mouseup\", handleMouseUp);\n document.removeEventListener(\"selectionchange\", handleSelectionChange);\n };\n }, [handleMouseUp, handleSelectionChange]);\n\n const openWithSelection = (text: string) => {\n pendingSelection.current = text;\n setSelectionTooltip(null);\n setOpen(true);\n onOpen?.();\n };\n\n // ── Collectors ─────────────────────────────────────────────────────────────\n // If Flint.init() was called, read from the global singleton.\n // Otherwise, create local collectors (backward compat).\n const globalInit = Flint.isInitialized();\n const global = Flint.getInstance();\n\n const consoleCollector = useRef<ReturnType<typeof createConsoleCollector> | null>(null);\n const networkCollector = useRef<ReturnType<typeof createNetworkCollector> | null>(null);\n const replayEvents = useRef<eventWithTime[]>([]);\n const stopReplay = useRef<(() => void) | null>(null);\n const formErrorCollector = useRef<ReturnType<typeof createFormErrorCollector> | null>(null);\n const frustrationCollector = useRef<ReturnType<typeof createFrustrationCollector> | null>(null);\n\n if (!globalInit) {\n if (enableConsole && !consoleCollector.current) {\n consoleCollector.current = createConsoleCollector();\n consoleCollector.current.start();\n }\n if (enableNetwork && !networkCollector.current) {\n const flintHost = (() => {\n try {\n return new URL(serverUrl).hostname;\n } catch {\n return \"\";\n }\n })();\n networkCollector.current = createNetworkCollector(flintHost ? [flintHost] : []);\n networkCollector.current.start();\n }\n if (enableFormErrors && !formErrorCollector.current) {\n formErrorCollector.current = createFormErrorCollector();\n formErrorCollector.current.start();\n _setFormErrorCollector(formErrorCollector.current);\n }\n if (enableFrustration && !frustrationCollector.current) {\n frustrationCollector.current = createFrustrationCollector();\n frustrationCollector.current.start();\n }\n }\n\n useEffect(() => {\n if (globalInit) return;\n let cancelled = false;\n\n if (enableReplay) {\n import(\"rrweb\").then(({ record }) => {\n if (cancelled) return;\n const stopFn = record({\n emit(event) {\n replayEvents.current.push(event);\n const cutoff = Date.now() - REPLAY_WINDOW_MS;\n while (replayEvents.current.length > 0 && replayEvents.current[0].timestamp < cutoff) {\n replayEvents.current.shift();\n }\n },\n });\n stopReplay.current = stopFn ?? null;\n });\n }\n\n return () => {\n cancelled = true;\n consoleCollector.current?.stop();\n networkCollector.current?.stop();\n formErrorCollector.current?.stop();\n _setFormErrorCollector(null);\n frustrationCollector.current?.stop();\n stopReplay.current?.();\n };\n }, [enableReplay, globalInit]);\n\n // ── Auto-report frustration events (only for local collectors) ───────────\n useEffect(() => {\n if (globalInit) return;\n if (!enableFrustration || !autoReportFrustration || !frustrationCollector.current) return;\n\n const unsubscribe = frustrationCollector.current.onFrustration(async (event) => {\n const user = resolvedUser;\n await submitReport(serverUrl, projectKey, {\n reporterId: user?.id ?? \"anonymous\",\n reporterName: user?.name ?? \"Anonymous\",\n reporterEmail: user?.email,\n description: `[Auto-detected] ${event.type.replace(/_/g, \" \")}: ${event.details}`,\n severity: event.type === \"error_loop\" ? \"P1\" : event.type === \"rage_click\" ? \"P2\" : \"P3\",\n url: event.url,\n meta: {\n environment: collectEnvironment(),\n consoleLogs: consoleCollector.current?.getEntries() ?? [],\n networkErrors: networkCollector.current?.getEntries() ?? [],\n formErrors: formErrorCollector.current?.getEntries() ?? [],\n frustrationEvent: event,\n },\n }).catch(() => {});\n });\n\n return unsubscribe;\n }, [enableFrustration, autoReportFrustration, globalInit, projectKey, resolvedUser, serverUrl]);\n\n const label = buttonLabel ?? t(\"buttonLabel\");\n\n return (\n <>\n {/* Floating trigger button */}\n <button\n ref={triggerRef}\n onMouseDown={() => {\n pendingSelection.current = window.getSelection()?.toString().trim() ?? \"\";\n }}\n onClick={() => {\n setOpen(true);\n onOpen?.();\n }}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n aria-label={label}\n style={{\n position: \"fixed\",\n bottom: \"40px\",\n right: \"20px\",\n zIndex: zIndex - 1,\n display: \"flex\",\n alignItems: \"center\",\n gap: \"8px\",\n padding: \"10px 18px\",\n borderRadius: \"24px\",\n border: \"none\",\n background: `linear-gradient(135deg, ${colors.accent}, ${colors.accentHover})`,\n color: colors.buttonText,\n fontSize: \"13px\",\n fontWeight: 600,\n cursor: \"pointer\",\n boxShadow: hovered\n ? `0 0 28px ${colors.accent}55, 0 8px 24px rgba(0,0,0,0.3)`\n : `0 0 16px ${colors.accent}33, 0 4px 16px rgba(0,0,0,0.2)`,\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif',\n transform: hovered ? \"translateY(-2px)\" : \"translateY(0)\",\n transition: \"transform 0.15s ease, box-shadow 0.15s ease\",\n letterSpacing: \"0.01em\",\n }}\n >\n <SparkIcon />\n {label}\n </button>\n\n {/* Selection tooltip */}\n {enableTextIssues && selectionTooltip && !open && (\n <button\n ref={tooltipRef}\n onClick={() => openWithSelection(selectionTooltip.text)}\n style={{\n position: \"fixed\",\n left: Math.max(8, Math.min(selectionTooltip.x - 70, window.innerWidth - 148)),\n top: Math.max(8, selectionTooltip.y - 36),\n zIndex: zIndex + 1,\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n padding: \"6px 12px\",\n borderRadius: 10,\n border: \"none\",\n background: `linear-gradient(135deg, ${colors.accent}, ${colors.accentHover})`,\n color: colors.buttonText,\n fontSize: 12,\n fontWeight: 600,\n cursor: \"pointer\",\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif',\n boxShadow: `0 4px 20px rgba(0,0,0,0.25), 0 0 12px ${colors.accent}40`,\n animation: \"flint-tooltip-in 0.15s ease-out\",\n whiteSpace: \"nowrap\",\n }}\n >\n <TextIcon />\n Report text issue\n </button>\n )}\n\n {/* Tooltip animation */}\n <style>{`\n @keyframes flint-tooltip-in {\n from { opacity: 0; transform: translateY(4px); }\n to { opacity: 1; transform: translateY(0); }\n }\n `}</style>\n\n {/* Modal */}\n {open && (\n <FlintModal\n projectKey={projectKey}\n serverUrl={serverUrl}\n user={resolvedUser}\n meta={meta}\n theme={theme}\n zIndex={zIndex}\n onClose={() => {\n setOpen(false);\n onClose?.();\n pendingSelection.current = \"\";\n }}\n getEnvironment={collectEnvironment}\n getConsoleLogs={() =>\n globalInit ? (global?.console?.getEntries() ?? []) : (consoleCollector.current?.getEntries() ?? [])\n }\n getNetworkErrors={() =>\n globalInit ? (global?.network?.getEntries() ?? []) : (networkCollector.current?.getEntries() ?? [])\n }\n getFormErrors={() =>\n globalInit ? (global?.formErrors?.getEntries() ?? []) : (formErrorCollector.current?.getEntries() ?? [])\n }\n getReplayEvents={() =>\n globalInit ? (Flint.getReplayEvents() as eventWithTime[]) : [...replayEvents.current]\n }\n getExternalReplayUrl={getExternalReplayUrl}\n initialSelection={pendingSelection.current}\n enableScreenshot={enableScreenshot}\n enableTextIssues={enableTextIssues}\n statusPageUrl={statusPageUrl}\n onBeforeSubmit={onBeforeSubmit}\n onSuccess={onSuccess}\n onError={onError}\n />\n )}\n </>\n );\n}\n\nfunction TextIcon() {\n return (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M17 10H3\" />\n <path d=\"M21 6H3\" />\n <path d=\"M21 14H3\" />\n <path d=\"M17 18H3\" />\n </svg>\n );\n}\n\nfunction SparkIcon() {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M13 2L3 14h9l-1 8 10-12h-9l1-8z\" />\n </svg>\n );\n}\n","export { createConsoleCollector } from \"@diegotsi/flint-core\";\n","export { collectEnvironment } from \"@diegotsi/flint-core\";\n","export { createFormErrorCollector } from \"@diegotsi/flint-core\";\n","export { createFrustrationCollector } from \"@diegotsi/flint-core\";\n","export { createNetworkCollector } from \"@diegotsi/flint-core\";\n","import { createInstance } from \"i18next\";\nimport { initReactI18next } from \"react-i18next\";\nimport en from \"./locales/en.json\";\n\nexport const widgetI18n: ReturnType<typeof createInstance> = createInstance();\n\nwidgetI18n.use(initReactI18next).init({\n lng: \"en-US\",\n fallbackLng: \"en-US\",\n resources: { \"en-US\": { translation: en } },\n interpolation: { escapeValue: false },\n initImmediate: false,\n});\n\nexport default widgetI18n;\n","{\n \"buttonLabel\": \"Report bug\",\n \"modalTitle\": \"Report an issue\",\n \"severityLabel\": \"Severity\",\n \"severity_P1_hint\": \"Critical — system down\",\n \"severity_P2_hint\": \"High — core feature broken\",\n \"severity_P3_hint\": \"Medium — noticeable but workable\",\n \"severity_P4_hint\": \"Low — cosmetic or improvement\",\n \"severity_P1_label\": \"Critical\",\n \"severity_P2_label\": \"High\",\n \"severity_P3_label\": \"Medium\",\n \"severity_P4_label\": \"Low\",\n \"whatIsBrokenLabel\": \"What Is Broken\",\n \"whatIsBrokenPlaceholder\": \"1–2 sentences: what is currently happening that should NOT happen.\",\n \"expectedBehaviorLabel\": \"Expected Behavior (optional)\",\n \"expectedBehaviorPlaceholder\": \"Describe exactly what the user should see or receive after the fix.\",\n \"screenshotLabel\": \"Screenshot (optional)\",\n \"screenshotPlaceholder\": \"Click to attach...\",\n \"screenshotAttachFile\": \"Attach file\",\n \"screenshotMarkOnScreen\": \"Mark on screen\",\n \"submitLabel\": \"Submit\",\n \"close\": \"Close\",\n \"successTitle\": \"Bug reported!\",\n \"successDuplicate\": \"Looks like a duplicate of an existing bug.\",\n \"successGitHub\": \"View GitHub issue\",\n \"successSlack\": \"View Slack message\",\n \"replayInfo\": \"No need to record your screen — we automatically capture a session replay when you submit.\",\n \"errorLabel\": \"Failed to submit. Please try again.\",\n \"cancel\": \"Cancel\",\n \"sending\": \"Sending report\",\n \"capturingContext\": \"Capturing context\"\n}\n","import { getSnapshot, subscribe } from \"@diegotsi/flint-core\";\nimport { useSyncExternalStore } from \"react\";\n\nexport { _setFormErrorCollector, Flint, flint } from \"@diegotsi/flint-core\";\n\nexport function useFlintStore() {\n return useSyncExternalStore(subscribe, getSnapshot);\n}\n"],"mappings":"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","names":["import_react","import_flint_core","import_jsx_runtime","import_flint_core","import_react","import_react_i18next","import_flint_core","import_flint_core","import_flint_core","import_flint_core","import_flint_core","import_react_i18next","import_flint_core","import_react","import_jsx_runtime","user","SparkIcon"]}
package/dist/index.js CHANGED
@@ -1407,7 +1407,7 @@ function WidgetContent({
1407
1407
  });
1408
1408
  });
1409
1409
  return unsubscribe;
1410
- }, [enableFrustration, autoReportFrustration, globalInit]);
1410
+ }, [enableFrustration, autoReportFrustration, globalInit, projectKey, resolvedUser, serverUrl]);
1411
1411
  const label = buttonLabel ?? t("buttonLabel");
1412
1412
  return /* @__PURE__ */ jsxs3(Fragment2, { children: [
1413
1413
  /* @__PURE__ */ jsxs3(
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/FlintModal.tsx","../src/api.ts","../src/ScreenAnnotator.tsx","../src/theme.ts","../src/FlintWidget.tsx","../src/collectors/console.ts","../src/collectors/environment.ts","../src/collectors/formErrors.ts","../src/collectors/frustration.ts","../src/collectors/network.ts","../src/i18n/index.ts","../src/i18n/locales/en.json","../src/store.ts"],"sourcesContent":["import type {\n ConsoleEntry,\n EnvironmentInfo,\n FlintUser,\n FormErrorEntry,\n NetworkEntry,\n ReportPayload,\n ReportResult,\n Severity,\n Theme,\n} from \"@diegotsi/flint-core\";\nimport type { eventWithTime } from \"@rrweb/types\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { submitReplay, submitReport } from \"./api.js\";\nimport { ScreenAnnotator } from \"./ScreenAnnotator.js\";\nimport { resolveTheme } from \"./theme.js\";\n\ninterface Props {\n projectKey: string;\n serverUrl: string;\n user?: FlintUser;\n meta?: Record<string, unknown>;\n theme: Theme;\n zIndex: number;\n onClose: () => void;\n getEnvironment: () => EnvironmentInfo;\n getConsoleLogs: () => ConsoleEntry[];\n getNetworkErrors: () => NetworkEntry[];\n getFormErrors: () => FormErrorEntry[];\n getReplayEvents: () => eventWithTime[];\n getExternalReplayUrl: () => string | undefined;\n initialSelection?: string;\n enableScreenshot?: boolean;\n enableTextIssues?: boolean;\n statusPageUrl?: string;\n onBeforeSubmit?: (payload: ReportPayload) => boolean | Promise<boolean>;\n onSuccess?: (result: ReportResult) => void;\n onError?: (error: Error) => void;\n}\n\nconst SEVERITIES: Severity[] = [\"P1\", \"P2\", \"P3\", \"P4\"];\nconst SEV_COLOR: Record<Severity, string> = {\n P1: \"#ef4444\",\n P2: \"#f97316\",\n P3: \"#eab308\",\n P4: \"#22c55e\",\n};\n\ntype Status = \"idle\" | \"submitting\" | \"success\" | \"error\";\n\n// Inject CSS keyframes once — animations can't be done with inline styles alone\nfunction injectKeyframes() {\n if (typeof document === \"undefined\") return;\n if (document.getElementById(\"_flint_kf\")) return;\n const s = document.createElement(\"style\");\n s.id = \"_flint_kf\";\n s.textContent = `\n @keyframes _flint_in {\n from { opacity: 0; transform: scale(0.93) translateY(10px); }\n to { opacity: 1; transform: scale(1) translateY(0); }\n }\n @keyframes _flint_overlay_in {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n @keyframes _flint_spin {\n to { transform: rotate(360deg); }\n }\n @keyframes _flint_pulse {\n 0%, 100% { opacity: 0.5; transform: scale(0.88); }\n 50% { opacity: 1; transform: scale(1.08); }\n }\n @keyframes _flint_ripple {\n 0% { opacity: 0.5; transform: scale(0.75); }\n 100% { opacity: 0; transform: scale(1.55); }\n }\n @keyframes _flint_sending_dot {\n 0%, 80%, 100% { opacity: 0.2; transform: scale(0.8); }\n 40% { opacity: 1; transform: scale(1); }\n }\n @keyframes _flint_success_up {\n from { opacity: 0; transform: translateY(8px); }\n to { opacity: 1; transform: translateY(0); }\n }\n `;\n document.head.appendChild(s);\n}\n\nexport function FlintModal({\n projectKey,\n serverUrl,\n user,\n meta,\n theme,\n zIndex,\n onClose,\n getEnvironment,\n getConsoleLogs,\n getNetworkErrors,\n getFormErrors,\n getReplayEvents,\n getExternalReplayUrl,\n initialSelection = \"\",\n enableScreenshot = true,\n enableTextIssues = true,\n statusPageUrl,\n onBeforeSubmit,\n onSuccess,\n onError,\n}: Props) {\n const { t } = useTranslation();\n const colors = resolveTheme(theme);\n const isDark = theme === \"dark\";\n\n const [severity, setSeverity] = useState<Severity>(\"P2\");\n const [description, setDescription] = useState(\"\");\n const [expectedBehavior, setExpectedBehavior] = useState(\"\");\n const [screenshot, setScreenshot] = useState<File | null>(null);\n const [annotating, setAnnotating] = useState(false);\n const [status, setStatus] = useState<Status>(\"idle\");\n const [result, setResult] = useState<ReportResult | null>(null);\n const [errorMsg, setErrorMsg] = useState(\"\");\n\n // Text issue mode\n const [mode, setMode] = useState<\"bug\" | \"text\">(enableTextIssues && initialSelection ? \"text\" : \"bug\");\n const [textOriginal, setTextOriginal] = useState(initialSelection);\n const [textSuggested, setTextSuggested] = useState(\"\");\n const [textLang, setTextLang] = useState(\n typeof document !== \"undefined\" ? document.documentElement.lang?.split(\"-\")[0] || \"en\" : \"en\",\n );\n\n const fileRef = useRef<HTMLInputElement>(null);\n const overlayRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n injectKeyframes();\n }, []);\n\n useEffect(() => {\n const handler = (e: KeyboardEvent) => {\n if (e.key === \"Escape\" && status !== \"submitting\") onClose();\n };\n window.addEventListener(\"keydown\", handler);\n return () => window.removeEventListener(\"keydown\", handler);\n }, [onClose, status]);\n\n const handleOverlayClick = useCallback(\n (e: React.MouseEvent) => {\n if (e.target === overlayRef.current && status !== \"submitting\") onClose();\n },\n [onClose, status],\n );\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n const isText = mode === \"text\";\n if (isText) {\n if (!textOriginal.trim() || !textSuggested.trim()) return;\n } else {\n if (!description.trim()) return;\n }\n\n setStatus(\"submitting\");\n setErrorMsg(\"\");\n\n const collectedMeta: Record<string, unknown> = {\n ...meta,\n environment: getEnvironment(),\n consoleLogs: getConsoleLogs(),\n networkErrors: getNetworkErrors(),\n formErrors: getFormErrors(),\n };\n\n if (isText) {\n collectedMeta.textIssue = {\n original: textOriginal.trim(),\n suggested: textSuggested.trim(),\n lang: textLang,\n };\n }\n\n const payload: ReportPayload = {\n reporterId: user?.id ?? \"anonymous\",\n reporterName: user?.name ?? \"Anonymous\",\n reporterEmail: user?.email,\n description: isText ? `[Text issue] \"${textOriginal.trim()}\" → \"${textSuggested.trim()}\"` : description.trim(),\n expectedBehavior: !isText ? expectedBehavior.trim() || undefined : undefined,\n externalReplayUrl: getExternalReplayUrl() || undefined,\n severity: isText ? \"P3\" : severity,\n url: window.location.href,\n meta: collectedMeta,\n label: isText ? \"TEXT\" : undefined,\n };\n\n if (onBeforeSubmit) {\n const proceed = await onBeforeSubmit(payload);\n if (!proceed) {\n setStatus(\"idle\");\n return;\n }\n }\n\n try {\n const res = await submitReport(serverUrl, projectKey, payload, !isText ? (screenshot ?? undefined) : undefined);\n setResult(res);\n setStatus(\"success\");\n onSuccess?.(res);\n\n const events = getReplayEvents();\n if (events.length > 0) {\n submitReplay(serverUrl, projectKey, res.id, events).catch(() => {});\n }\n } catch (err) {\n const error = err instanceof Error ? err : new Error(t(\"errorLabel\"));\n setErrorMsg(error.message);\n setStatus(\"error\");\n onError?.(error);\n }\n };\n\n // ── Shared style tokens ────────────────────────────────────────────────────\n const inputBorder = isDark ? \"rgba(255,255,255,0.1)\" : \"rgba(0,0,0,0.1)\";\n const accentGlow = `0 0 20px ${colors.accent}40, 0 4px 16px rgba(0,0,0,0.2)`;\n\n const overlayStyle: React.CSSProperties = {\n position: \"fixed\",\n inset: 0,\n background: \"rgba(0,0,0,0.5)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n zIndex,\n padding: \"16px\",\n backdropFilter: \"blur(10px)\",\n WebkitBackdropFilter: \"blur(10px)\",\n animation: \"_flint_overlay_in 0.2s ease\",\n };\n\n const modalStyle: React.CSSProperties = {\n background: colors.background,\n backdropFilter: colors.backdropFilter,\n WebkitBackdropFilter: colors.backdropFilter,\n borderRadius: \"20px\",\n boxShadow: colors.shadow,\n border: `1px solid ${colors.border}`,\n width: \"100%\",\n maxWidth: \"600px\",\n maxHeight: \"92vh\",\n overflowY: \"auto\",\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif',\n color: colors.text,\n animation: \"_flint_in 0.28s cubic-bezier(0.16, 1, 0.3, 1)\",\n };\n\n const inputStyle: React.CSSProperties = {\n width: \"100%\",\n padding: \"11px 13px\",\n borderRadius: \"10px\",\n border: `1px solid ${inputBorder}`,\n background: colors.backgroundSecondary,\n color: colors.text,\n fontSize: \"16px\",\n outline: \"none\",\n boxSizing: \"border-box\",\n fontFamily: \"inherit\",\n transition: \"border-color 0.15s\",\n };\n\n // ── Loading + Success (unified animated state) ────────────────────────────\n if (status === \"submitting\" || status === \"success\") {\n const isSuccess = status === \"success\";\n const ringBorder = isSuccess\n ? \"3px solid #22c55e\"\n : `3px solid ${isDark ? \"rgba(255,255,255,0.08)\" : \"rgba(0,0,0,0.08)\"}`;\n const ringTopColor = isSuccess ? \"#22c55e\" : colors.accent;\n\n return (\n <div style={overlayStyle}>\n <div\n style={modalStyle}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={isSuccess ? t(\"successTitle\") : t(\"sending\")}\n >\n <ModalHeader colors={colors} inputBorder={inputBorder} showClose={false} onClose={onClose} />\n\n <div\n style={{\n padding: \"40px 32px 48px\",\n textAlign: \"center\",\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n }}\n >\n {/* Animated rings */}\n <div style={{ position: \"relative\", width: 80, height: 80, marginBottom: 28 }}>\n {/* Ripple 1 — fade out on success */}\n <div\n style={{\n position: \"absolute\",\n inset: -10,\n borderRadius: \"50%\",\n border: `1.5px solid ${colors.accent}`,\n animation: \"_flint_ripple 1.8s ease-out infinite\",\n opacity: isSuccess ? 0 : 1,\n transition: \"opacity 0.3s ease\",\n }}\n />\n {/* Ripple 2 (delayed) */}\n <div\n style={{\n position: \"absolute\",\n inset: -10,\n borderRadius: \"50%\",\n border: `1.5px solid ${colors.accent}`,\n animation: \"_flint_ripple 1.8s ease-out infinite 0.6s\",\n opacity: isSuccess ? 0 : 1,\n transition: \"opacity 0.3s ease\",\n }}\n />\n {/* Spinning ring — transitions to solid green on success */}\n <div\n style={{\n position: \"absolute\",\n inset: 0,\n borderRadius: \"50%\",\n border: ringBorder,\n borderTopColor: ringTopColor,\n animation: isSuccess ? \"none\" : \"_flint_spin 0.85s linear infinite\",\n transition: \"border-color 0.45s ease, border-top-color 0.45s ease\",\n }}\n />\n {/* Center: spark fades out, check fades in */}\n <div style={{ position: \"absolute\", inset: 14, borderRadius: \"50%\" }}>\n {/* Spark */}\n <div\n style={{\n position: \"absolute\",\n inset: 0,\n borderRadius: \"50%\",\n background: `linear-gradient(135deg, ${colors.accent}30, ${colors.accentHover}50)`,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n animation: isSuccess ? \"none\" : \"_flint_pulse 2s ease-in-out infinite\",\n opacity: isSuccess ? 0 : 1,\n transition: \"opacity 0.3s ease\",\n }}\n >\n <SparkIcon color={colors.accent} size={20} />\n </div>\n {/* Checkmark */}\n <div\n style={{\n position: \"absolute\",\n inset: 0,\n borderRadius: \"50%\",\n background: \"rgba(34,197,94,0.15)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n opacity: isSuccess ? 1 : 0,\n transform: isSuccess ? \"scale(1)\" : \"scale(0.65)\",\n transition: \"opacity 0.35s ease 0.2s, transform 0.4s cubic-bezier(0.16,1,0.3,1) 0.2s\",\n }}\n >\n <CheckIcon size={20} />\n </div>\n </div>\n </div>\n\n {/* Title crossfade */}\n <div style={{ position: \"relative\", height: 26, width: \"100%\", marginBottom: 10 }}>\n <div\n style={{\n position: \"absolute\",\n inset: 0,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n fontSize: 19,\n fontWeight: 700,\n color: colors.text,\n letterSpacing: \"-0.02em\",\n opacity: isSuccess ? 0 : 1,\n transition: \"opacity 0.25s ease\",\n pointerEvents: \"none\",\n }}\n >\n {t(\"sending\")}\n </div>\n <div\n style={{\n position: \"absolute\",\n inset: 0,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n fontSize: 19,\n fontWeight: 700,\n color: colors.text,\n letterSpacing: \"-0.02em\",\n opacity: isSuccess ? 1 : 0,\n transform: isSuccess ? \"translateY(0)\" : \"translateY(6px)\",\n transition: \"opacity 0.35s ease 0.25s, transform 0.35s ease 0.25s\",\n pointerEvents: isSuccess ? \"auto\" : \"none\",\n }}\n >\n {t(\"successTitle\")}\n </div>\n </div>\n\n {/* Subtitle crossfade */}\n <div style={{ position: \"relative\", minHeight: 76, width: \"100%\" }}>\n {/* Loading subtitle */}\n <div\n style={{\n position: \"absolute\",\n inset: 0,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 6,\n color: colors.textMuted,\n fontSize: 15,\n opacity: isSuccess ? 0 : 1,\n transition: \"opacity 0.2s ease\",\n pointerEvents: \"none\",\n }}\n >\n <span>{t(\"capturingContext\")}</span>\n <SendingDots color={colors.accent} />\n </div>\n {/* Success subtitle */}\n <div\n style={{\n position: \"absolute\",\n inset: 0,\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n gap: 10,\n opacity: isSuccess ? 1 : 0,\n transform: isSuccess ? \"translateY(0)\" : \"translateY(8px)\",\n transition: \"opacity 0.35s ease 0.35s, transform 0.35s ease 0.35s\",\n pointerEvents: isSuccess ? \"auto\" : \"none\",\n }}\n >\n <p style={{ fontSize: 15, color: colors.textMuted, margin: 0 }}>{result ? `ID: ${result.id}` : \"\"}</p>\n {statusPageUrl && user?.id && (\n <a\n href={`${statusPageUrl}/status?project_key=${encodeURIComponent(projectKey)}&reporter_id=${encodeURIComponent(user.id)}&server_url=${encodeURIComponent(serverUrl)}`}\n target=\"_blank\"\n rel=\"noreferrer\"\n style={{\n fontSize: 14,\n color: colors.accent,\n textDecoration: \"none\",\n fontWeight: 600,\n animation: \"_flint_success_up 0.35s ease 0.4s both\",\n }}\n >\n {\"\\ud83d\\udccb\"} Track your bugs {\"\\u2192\"}\n </a>\n )}\n {/*\n {result?.slackMessageUrl && (\n <a\n href={result.slackMessageUrl}\n target=\"_blank\"\n rel=\"noreferrer\"\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 6,\n padding: \"9px 18px\",\n borderRadius: \"10px\",\n background: `linear-gradient(135deg, ${colors.accent}, ${colors.accentHover})`,\n color: colors.buttonText,\n textDecoration: \"none\",\n fontSize: \"15px\",\n fontWeight: 600,\n boxShadow: accentGlow,\n }}\n >\n {t(\"successSlack\")} ↗\n </a>\n )} */}\n <button\n onClick={onClose}\n style={{\n width: \"100%\",\n padding: \"13px 20px\",\n borderRadius: 12,\n border: \"none\",\n background: `linear-gradient(135deg, ${colors.accent}, ${colors.accentHover})`,\n color: colors.buttonText,\n fontSize: 17,\n fontWeight: 700,\n cursor: \"pointer\",\n letterSpacing: \"-0.01em\",\n boxShadow: accentGlow,\n fontFamily: \"inherit\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 8,\n }}\n >\n {t(\"close\")}\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n );\n }\n\n // ── Form ──────────────────────────────────────────────────────────────────\n return (\n <>\n {enableScreenshot && annotating && (\n <ScreenAnnotator\n zIndex={zIndex + 1}\n onCapture={(file) => {\n setScreenshot(file);\n setAnnotating(false);\n }}\n onCancel={() => setAnnotating(false)}\n />\n )}\n {!annotating && (\n <div ref={overlayRef} style={overlayStyle} onClick={handleOverlayClick}>\n <div style={modalStyle} role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"flint-modal-title\">\n <ModalHeader\n colors={colors}\n inputBorder={inputBorder}\n showClose\n onClose={onClose}\n titleId=\"flint-modal-title\"\n title={t(\"modalTitle\")}\n />\n\n <form onSubmit={handleSubmit} style={{ padding: \"20px 24px 24px\" }}>\n {/* Mode toggle */}\n {enableTextIssues && (\n <div\n style={{\n display: \"flex\",\n gap: 4,\n marginBottom: 20,\n background: colors.backgroundSecondary,\n borderRadius: 12,\n padding: 4,\n border: `1px solid ${inputBorder}`,\n }}\n >\n {([\"bug\", \"text\"] as const).map((m) => (\n <button\n key={m}\n type=\"button\"\n onClick={() => setMode(m)}\n style={{\n flex: 1,\n padding: \"8px 10px\",\n borderRadius: 9,\n border: \"none\",\n cursor: \"pointer\",\n fontSize: 13,\n fontWeight: mode === m ? 700 : 500,\n fontFamily: \"inherit\",\n transition: \"background 0.15s, color 0.15s\",\n background:\n mode === m ? `linear-gradient(135deg, ${colors.accent}, ${colors.accentHover})` : \"transparent\",\n color: mode === m ? colors.buttonText : colors.textMuted,\n boxShadow: mode === m ? `0 2px 8px ${colors.accent}30` : \"none\",\n }}\n >\n {m === \"bug\" ? \"🐛 Bug\" : \"🔤 Text / Translation\"}\n </button>\n ))}\n </div>\n )}\n\n {/* Text issue fields */}\n {mode === \"text\" && (\n <>\n <div style={{ marginBottom: 14 }}>\n <FieldLabel colors={colors} htmlFor=\"flint-text-original\">\n Original text\n </FieldLabel>\n <textarea\n id=\"flint-text-original\"\n style={{ ...inputStyle, resize: \"vertical\", minHeight: 60 }}\n value={textOriginal}\n onChange={(e) => setTextOriginal(e.target.value)}\n placeholder=\"Text that is wrong on screen…\"\n required\n />\n </div>\n <div style={{ marginBottom: 14 }}>\n <FieldLabel colors={colors} htmlFor=\"flint-text-suggested\">\n Suggested correction\n </FieldLabel>\n <textarea\n id=\"flint-text-suggested\"\n style={{ ...inputStyle, resize: \"vertical\", minHeight: 60 }}\n value={textSuggested}\n onChange={(e) => setTextSuggested(e.target.value)}\n placeholder=\"How it should read…\"\n required\n />\n </div>\n <div style={{ marginBottom: 20 }}>\n <FieldLabel colors={colors} htmlFor=\"flint-text-lang\">\n Language\n </FieldLabel>\n <select\n id=\"flint-text-lang\"\n value={textLang}\n onChange={(e) => setTextLang(e.target.value)}\n style={{\n ...inputStyle,\n appearance: \"none\",\n cursor: \"pointer\",\n }}\n >\n <option value=\"en\">English (en)</option>\n <option value=\"he\">עברית (he)</option>\n </select>\n </div>\n </>\n )}\n\n {/* Severity */}\n <div style={{ marginBottom: 18, display: mode === \"text\" ? \"none\" : undefined }}>\n <FieldLabel colors={colors}>{t(\"severityLabel\")}</FieldLabel>\n <div style={{ display: \"grid\", gridTemplateColumns: \"repeat(4,1fr)\", gap: 8 }}>\n {SEVERITIES.map((sev) => (\n <SeverityButton\n key={sev}\n sev={sev}\n label={t(`severity_${sev}_label`)}\n selected={severity === sev}\n hint={t(`severity_${sev}_hint`)}\n color={SEV_COLOR[sev]}\n accent={colors.accent}\n border={inputBorder}\n bg={colors.backgroundSecondary}\n text={colors.text}\n onClick={() => setSeverity(sev)}\n />\n ))}\n </div>\n </div>\n\n {/* What Is Broken */}\n {mode === \"bug\" && (\n <div style={{ marginBottom: 14 }}>\n <FieldLabel colors={colors} htmlFor=\"flint-description\">\n {t(\"whatIsBrokenLabel\")}\n </FieldLabel>\n <textarea\n id=\"flint-description\"\n style={{ ...inputStyle, resize: \"vertical\", minHeight: 80 }}\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n placeholder={t(\"whatIsBrokenPlaceholder\")}\n required\n />\n </div>\n )}\n\n {/* Expected Behavior (optional) */}\n {mode === \"bug\" && (\n <div style={{ marginBottom: 14 }}>\n <FieldLabel colors={colors} htmlFor=\"flint-expected\">\n {t(\"expectedBehaviorLabel\")}\n </FieldLabel>\n <textarea\n id=\"flint-expected\"\n style={{ ...inputStyle, resize: \"vertical\", minHeight: 72 }}\n value={expectedBehavior}\n onChange={(e) => setExpectedBehavior(e.target.value)}\n placeholder={t(\"expectedBehaviorPlaceholder\")}\n />\n </div>\n )}\n\n {/* Screenshot */}\n <div style={{ marginBottom: 20, display: mode === \"text\" || !enableScreenshot ? \"none\" : undefined }}>\n <FieldLabel colors={colors}>{t(\"screenshotLabel\")}</FieldLabel>\n {screenshot ? (\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 10 }}>\n <img\n src={URL.createObjectURL(screenshot)}\n alt=\"Screenshot preview\"\n style={{ height: 60, borderRadius: 8, objectFit: \"cover\", border: `1px solid ${inputBorder}` }}\n />\n <span\n style={{\n fontSize: 13,\n color: colors.textMuted,\n flex: 1,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {screenshot.name}\n </span>\n <button\n type=\"button\"\n onClick={() => setScreenshot(null)}\n aria-label=\"Remove screenshot\"\n style={{\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n fontSize: 18,\n color: colors.textMuted,\n lineHeight: 1,\n padding: \"2px 6px\",\n borderRadius: 6,\n fontFamily: \"inherit\",\n }}\n >\n ×\n </button>\n </div>\n ) : (\n <div style={{ display: \"flex\", gap: 8 }}>\n <button\n type=\"button\"\n onClick={() => fileRef.current?.click()}\n style={{\n flex: 1,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 6,\n padding: \"10px 13px\",\n borderRadius: 10,\n border: `1px dashed ${inputBorder}`,\n cursor: \"pointer\",\n fontSize: 14,\n color: colors.textMuted,\n background: colors.backgroundSecondary,\n fontFamily: \"inherit\",\n }}\n >\n 📎 {t(\"screenshotAttachFile\")}\n </button>\n <button\n type=\"button\"\n onClick={() => setAnnotating(true)}\n style={{\n flex: 1,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 6,\n padding: \"10px 13px\",\n borderRadius: 10,\n border: `1px dashed ${inputBorder}`,\n cursor: \"pointer\",\n fontSize: 14,\n color: colors.textMuted,\n background: colors.backgroundSecondary,\n fontFamily: \"inherit\",\n }}\n >\n 🔲 {t(\"screenshotMarkOnScreen\")}\n </button>\n </div>\n )}\n <input\n id=\"flint-screenshot\"\n ref={fileRef}\n type=\"file\"\n accept=\"image/*\"\n style={{ display: \"none\" }}\n onChange={(e) => setScreenshot(e.target.files?.[0] ?? null)}\n />\n </div>\n\n {/* Session replay info */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n padding: \"9px 12px\",\n borderRadius: 10,\n background: isDark ? \"rgba(255,255,255,0.04)\" : \"rgba(0,77,240,0.04)\",\n border: `1px solid ${isDark ? \"rgba(255,255,255,0.08)\" : \"rgba(0,77,240,0.1)\"}`,\n marginBottom: 16,\n }}\n >\n <span style={{ fontSize: 16 }}>🎥</span>\n <span style={{ fontSize: 14, color: colors.textMuted, lineHeight: 1.4 }}>{t(\"replayInfo\")}</span>\n </div>\n\n {/* Error */}\n {status === \"error\" && (\n <div\n style={{\n padding: \"10px 13px\",\n borderRadius: 10,\n background: \"rgba(239,68,68,0.08)\",\n border: \"1px solid rgba(239,68,68,0.2)\",\n color: \"#f87171\",\n fontSize: 14,\n marginBottom: 16,\n }}\n >\n ⚠️ {errorMsg || t(\"errorLabel\")}\n </div>\n )}\n\n {/* Submit */}\n <button\n type=\"submit\"\n style={{\n width: \"100%\",\n padding: \"13px 20px\",\n borderRadius: 12,\n border: \"none\",\n background: `linear-gradient(135deg, ${colors.accent}, ${colors.accentHover})`,\n color: colors.buttonText,\n fontSize: 17,\n fontWeight: 700,\n cursor: \"pointer\",\n letterSpacing: \"-0.01em\",\n boxShadow: accentGlow,\n fontFamily: \"inherit\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 8,\n }}\n >\n <SparkIcon color={colors.buttonText} size={15} />\n {t(\"submitLabel\")}\n </button>\n\n {/* Cancel */}\n <button\n type=\"button\"\n onClick={onClose}\n style={{\n width: \"100%\",\n padding: \"10px\",\n marginTop: 8,\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n fontSize: 15,\n color: colors.textMuted,\n fontFamily: \"inherit\",\n borderRadius: 8,\n }}\n >\n {t(\"cancel\")}\n </button>\n </form>\n </div>\n </div>\n )}\n </>\n );\n}\n\n// ─── Sub-components ──────────────────────────────────────────────────────────\n\nfunction ModalHeader({\n colors,\n inputBorder,\n showClose,\n onClose,\n titleId,\n title,\n}: {\n colors: ReturnType<typeof resolveTheme>;\n inputBorder: string;\n showClose: boolean;\n onClose: () => void;\n titleId?: string;\n title?: string;\n}) {\n return (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 10,\n padding: \"16px 20px 14px\",\n borderBottom: `1px solid ${inputBorder}`,\n }}\n >\n {/* Brand chip */}\n <div\n style={{\n width: 28,\n height: 28,\n borderRadius: 8,\n background: `linear-gradient(135deg, ${colors.accent}20, ${colors.accentHover}35)`,\n border: `1px solid ${colors.accent}30`,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n flexShrink: 0,\n }}\n >\n <SparkIcon color={colors.accent} size={13} />\n </div>\n\n {titleId && title ? (\n <h2\n id={titleId}\n style={{ margin: 0, fontSize: 16, fontWeight: 600, color: colors.text, letterSpacing: \"-0.01em\", flex: 1 }}\n >\n {title}\n </h2>\n ) : (\n <span style={{ flex: 1, fontSize: 15, fontWeight: 600, color: colors.textMuted }}>Flint</span>\n )}\n\n {showClose && (\n <button\n onClick={onClose}\n aria-label=\"Close\"\n style={{\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n padding: 4,\n color: colors.textMuted,\n fontSize: 22,\n lineHeight: 1,\n borderRadius: 6,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n opacity: 0.6,\n fontFamily: \"inherit\",\n }}\n >\n ×\n </button>\n )}\n </div>\n );\n}\n\nfunction FieldLabel({\n children,\n colors,\n htmlFor,\n}: {\n children: React.ReactNode;\n colors: ReturnType<typeof resolveTheme>;\n htmlFor?: string;\n}) {\n return (\n <label\n htmlFor={htmlFor}\n style={{\n display: \"block\",\n fontSize: \"12px\",\n fontWeight: 700,\n color: colors.textMuted,\n marginBottom: 6,\n textTransform: \"uppercase\" as const,\n letterSpacing: \"0.07em\",\n }}\n >\n {children}\n </label>\n );\n}\n\nfunction SendingDots({ color }: { color: string }) {\n return (\n <span style={{ display: \"inline-flex\", gap: 3, alignItems: \"center\" }}>\n {[0, 1, 2].map((i) => (\n <span\n key={i}\n style={{\n width: 4,\n height: 4,\n borderRadius: \"50%\",\n background: color,\n display: \"inline-block\",\n animation: `_flint_sending_dot 1.4s ease-in-out infinite ${i * 0.2}s`,\n }}\n />\n ))}\n </span>\n );\n}\n\ninterface SevBtnProps {\n sev: Severity;\n label: string;\n selected: boolean;\n hint: string;\n color: string;\n accent: string;\n border: string;\n bg: string;\n text: string;\n onClick: () => void;\n}\n\nfunction SeverityButton({ sev, label, selected, hint, color, accent, border, bg, text, onClick }: SevBtnProps) {\n return (\n <button\n type=\"button\"\n title={hint}\n onClick={onClick}\n style={{\n padding: \"9px 6px 8px\",\n borderRadius: 10,\n border: selected ? `2px solid ${accent}` : `1.5px solid ${border}`,\n background: selected ? `${accent}15` : bg,\n cursor: \"pointer\",\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n gap: 5,\n transition: \"border-color 0.12s, background 0.12s\",\n fontFamily: \"inherit\",\n }}\n >\n <span style={{ width: 8, height: 8, borderRadius: \"50%\", background: color, display: \"block\" }} />\n <span\n style={{\n fontSize: 13,\n fontWeight: selected ? 700 : 500,\n color: selected ? accent : text,\n letterSpacing: \"0.02em\",\n }}\n >\n {sev}\n </span>\n <span style={{ fontSize: 11, color: selected ? accent : text, opacity: 0.6, letterSpacing: \"0.02em\" }}>\n {label}\n </span>\n </button>\n );\n}\n\nfunction SparkIcon({ color = \"currentColor\", size = 14 }: { color?: string; size?: number }) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke={color}\n strokeWidth=\"2.2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M13 2L3 14h9l-1 8 10-12h-9l1-8z\" />\n </svg>\n );\n}\n\nfunction CheckIcon({ size = 20 }: { size?: number }) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"#22c55e\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n );\n}\n","export { submitReplay, submitReport } from \"@diegotsi/flint-core\";\n","import { domToCanvas } from \"modern-screenshot\";\nimport { useEffect, useRef, useState } from \"react\";\n\ninterface Props {\n zIndex: number;\n onCapture: (file: File) => void;\n onCancel: () => void;\n}\n\ntype Phase = \"idle\" | \"selecting\" | \"capturing\";\n\ninterface Rect {\n x: number;\n y: number;\n w: number;\n h: number;\n}\n\nfunction normalizeRect(startX: number, startY: number, endX: number, endY: number): Rect {\n return {\n x: Math.min(startX, endX),\n y: Math.min(startY, endY),\n w: Math.abs(endX - startX),\n h: Math.abs(endY - startY),\n };\n}\n\nexport function ScreenAnnotator({ zIndex, onCapture, onCancel }: Props) {\n const [phase, setPhase] = useState<Phase>(\"idle\");\n const [rect, setRect] = useState<Rect | null>(null);\n const startRef = useRef<{ x: number; y: number } | null>(null);\n const overlayRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") onCancel();\n };\n window.addEventListener(\"keydown\", onKey);\n return () => window.removeEventListener(\"keydown\", onKey);\n }, [onCancel]);\n\n const onMouseDown = (e: React.MouseEvent) => {\n e.preventDefault();\n startRef.current = { x: e.clientX, y: e.clientY };\n setPhase(\"selecting\");\n setRect({ x: e.clientX, y: e.clientY, w: 0, h: 0 });\n };\n\n const onMouseMove = (e: React.MouseEvent) => {\n if (phase !== \"selecting\" || !startRef.current) return;\n setRect(normalizeRect(startRef.current.x, startRef.current.y, e.clientX, e.clientY));\n };\n\n const onMouseUp = async (e: React.MouseEvent) => {\n if (phase !== \"selecting\" || !startRef.current) return;\n const finalRect = normalizeRect(startRef.current.x, startRef.current.y, e.clientX, e.clientY);\n startRef.current = null;\n\n if (finalRect.w < 5 || finalRect.h < 5) {\n setPhase(\"idle\");\n setRect(null);\n return;\n }\n\n setPhase(\"capturing\");\n\n const dpr = window.devicePixelRatio ?? 1;\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n\n // Wait for React to re-render + browser to paint so the overlay disappears\n await new Promise<void>((resolve) => requestAnimationFrame(() => requestAnimationFrame(() => resolve())));\n\n try {\n // Capture the visible viewport using modern-screenshot.\n // It clones only the visible area when width/height match the viewport.\n const fullCanvas = await domToCanvas(document.documentElement, {\n scale: dpr,\n width: vw,\n height: vh,\n style: {\n transform: `translate(-${window.scrollX}px, -${window.scrollY}px)`,\n },\n filter: (el) => el !== overlayRef.current,\n });\n\n // Crop canvas to viewport size (domToCanvas may produce a larger canvas)\n const canvas = document.createElement(\"canvas\");\n canvas.width = vw * dpr;\n canvas.height = vh * dpr;\n const ctx = canvas.getContext(\"2d\")!;\n ctx.drawImage(fullCanvas, 0, 0, vw * dpr, vh * dpr, 0, 0, vw * dpr, vh * dpr);\n\n // Draw annotation highlight — clientX/Y are viewport-relative\n ctx.fillStyle = \"rgba(255,200,0,0.25)\";\n ctx.fillRect(finalRect.x * dpr, finalRect.y * dpr, finalRect.w * dpr, finalRect.h * dpr);\n ctx.strokeStyle = \"#f97316\";\n ctx.lineWidth = 3 * dpr;\n ctx.strokeRect(finalRect.x * dpr, finalRect.y * dpr, finalRect.w * dpr, finalRect.h * dpr);\n\n canvas.toBlob((blob: Blob | null) => {\n if (blob) {\n onCapture(new File([blob], \"annotation.png\", { type: \"image/png\" }));\n } else {\n onCancel();\n }\n }, \"image/png\");\n } catch (err) {\n console.error(\"[Flint] ScreenAnnotator capture failed:\", err);\n onCancel();\n }\n };\n\n const isCapturing = phase === \"capturing\";\n\n return (\n <div\n ref={overlayRef}\n onMouseDown={onMouseDown}\n onMouseMove={onMouseMove}\n onMouseUp={onMouseUp}\n style={{\n position: \"fixed\",\n inset: 0,\n zIndex,\n cursor: isCapturing ? \"default\" : \"crosshair\",\n userSelect: \"none\",\n background: phase === \"selecting\" ? \"rgba(0,0,0,0.15)\" : \"rgba(0,0,0,0.05)\",\n transition: \"background 0.1s\",\n opacity: isCapturing ? 0 : 1,\n pointerEvents: isCapturing ? \"none\" : \"auto\",\n }}\n >\n {!isCapturing && (\n <div\n style={{\n position: \"absolute\",\n top: 16,\n left: \"50%\",\n transform: \"translateX(-50%)\",\n background: \"rgba(0,0,0,0.75)\",\n color: \"#fff\",\n padding: \"8px 18px\",\n borderRadius: 8,\n fontSize: 14,\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif',\n pointerEvents: \"none\",\n whiteSpace: \"nowrap\",\n backdropFilter: \"blur(4px)\",\n }}\n >\n Drag to highlight the problem area &nbsp;·&nbsp; Esc to cancel\n </div>\n )}\n\n {rect && phase === \"selecting\" && (\n <div\n style={{\n position: \"absolute\",\n left: rect.x,\n top: rect.y,\n width: rect.w,\n height: rect.h,\n background: \"rgba(255,200,0,0.2)\",\n border: \"2px dashed #f97316\",\n boxSizing: \"border-box\",\n pointerEvents: \"none\",\n }}\n />\n )}\n </div>\n );\n}\n","export { resolveTheme } from \"@diegotsi/flint-core\";\n","import { Flint, type FlintWidgetProps } from \"@diegotsi/flint-core\";\nimport type { eventWithTime } from \"@rrweb/types\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { I18nextProvider, useTranslation } from \"react-i18next\";\nimport { submitReport } from \"./api.js\";\nimport { createConsoleCollector } from \"./collectors/console.js\";\nimport { collectEnvironment } from \"./collectors/environment.js\";\nimport { createFormErrorCollector } from \"./collectors/formErrors.js\";\nimport { createFrustrationCollector } from \"./collectors/frustration.js\";\nimport { createNetworkCollector } from \"./collectors/network.js\";\nimport { FlintModal } from \"./FlintModal.js\";\nimport widgetI18n from \"./i18n/index.js\";\nimport { _setFormErrorCollector, useFlintStore } from \"./store.js\";\nimport { resolveTheme } from \"./theme.js\";\n\nconst REPLAY_WINDOW_MS = 60_000; // rolling 60-second buffer\n\nexport function FlintWidget(props: FlintWidgetProps) {\n const { locale = \"en-US\" } = props;\n\n useEffect(() => {\n widgetI18n.changeLanguage(locale);\n }, [locale]);\n\n return (\n <I18nextProvider i18n={widgetI18n}>\n <WidgetContent {...props} />\n </I18nextProvider>\n );\n}\n\nfunction WidgetContent({\n projectKey,\n serverUrl,\n user,\n meta,\n extraFields,\n buttonLabel,\n theme = \"dark\",\n zIndex = 9999,\n statusPageUrl,\n datadogSite,\n enableReplay = true,\n enableScreenshot = true,\n enableConsole = true,\n enableNetwork = true,\n enableTextIssues = true,\n enableFormErrors = true,\n enableFrustration = false,\n autoReportFrustration = false,\n onBeforeSubmit,\n onSuccess,\n onError,\n onOpen,\n onClose,\n}: FlintWidgetProps) {\n const globalState = useFlintStore();\n const resolvedUser = user ?? globalState.user;\n const resolvedSessionReplay = extraFields?.sessionReplay ?? globalState.sessionReplay;\n const getExternalReplayUrl = () => {\n // 1. Explicit sessionReplay prop takes priority\n const src = resolvedSessionReplay;\n const explicit = typeof src === \"function\" ? src() : src;\n if (explicit) return explicit;\n\n // 2. Auto-detect Datadog RUM if datadogSite is configured\n if (datadogSite) {\n try {\n const ddRum = (window as unknown as Record<string, unknown>).DD_RUM as\n | { getInternalContext?: () => { session_id?: string } | undefined }\n | undefined;\n const ctx = ddRum?.getInternalContext?.();\n if (ctx?.session_id) {\n const now = Math.floor(Date.now() / 1000);\n const fromTs = now - 30; // 30s before bug report\n const toTs = now + 5; // 5s buffer\n return `https://${datadogSite}/rum/replay/sessions/${ctx.session_id}?from_ts=${fromTs}&to_ts=${toTs}&tab=replay&live=false`;\n }\n } catch {\n // DD_RUM not available or threw — silently skip\n }\n }\n\n return undefined;\n };\n const { t } = useTranslation();\n const [open, setOpen] = useState(false);\n const [hovered, setHovered] = useState(false);\n const pendingSelection = useRef(\"\");\n const colors = resolveTheme(theme);\n\n // ── Selection tooltip ────────────────────────────────────────────────────\n const [selectionTooltip, setSelectionTooltip] = useState<{\n text: string;\n x: number;\n y: number;\n } | null>(null);\n const tooltipRef = useRef<HTMLButtonElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n\n const handleMouseUp = useCallback((e: MouseEvent) => {\n const target = e.target as Node;\n // Ignore clicks inside our own tooltip/trigger or when modal is open\n if (tooltipRef.current?.contains(target)) return;\n if (triggerRef.current?.contains(target)) return;\n\n // Small delay so the browser finalises the selection\n requestAnimationFrame(() => {\n const sel = window.getSelection();\n const text = sel?.toString().trim() ?? \"\";\n if (text.length < 2) {\n setSelectionTooltip(null);\n return;\n }\n\n const range = sel?.getRangeAt(0);\n if (!range) return;\n const rect = range.getBoundingClientRect();\n setSelectionTooltip({\n text,\n x: rect.left + rect.width / 2,\n y: rect.top - 8,\n });\n });\n }, []);\n\n const handleSelectionChange = useCallback(() => {\n const text = window.getSelection()?.toString().trim() ?? \"\";\n if (text.length < 2) setSelectionTooltip(null);\n }, []);\n\n useEffect(() => {\n document.addEventListener(\"mouseup\", handleMouseUp);\n document.addEventListener(\"selectionchange\", handleSelectionChange);\n return () => {\n document.removeEventListener(\"mouseup\", handleMouseUp);\n document.removeEventListener(\"selectionchange\", handleSelectionChange);\n };\n }, [handleMouseUp, handleSelectionChange]);\n\n const openWithSelection = (text: string) => {\n pendingSelection.current = text;\n setSelectionTooltip(null);\n setOpen(true);\n onOpen?.();\n };\n\n // ── Collectors ─────────────────────────────────────────────────────────────\n // If Flint.init() was called, read from the global singleton.\n // Otherwise, create local collectors (backward compat).\n const globalInit = Flint.isInitialized();\n const global = Flint.getInstance();\n\n const consoleCollector = useRef<ReturnType<typeof createConsoleCollector> | null>(null);\n const networkCollector = useRef<ReturnType<typeof createNetworkCollector> | null>(null);\n const replayEvents = useRef<eventWithTime[]>([]);\n const stopReplay = useRef<(() => void) | null>(null);\n const formErrorCollector = useRef<ReturnType<typeof createFormErrorCollector> | null>(null);\n const frustrationCollector = useRef<ReturnType<typeof createFrustrationCollector> | null>(null);\n\n if (!globalInit) {\n if (enableConsole && !consoleCollector.current) {\n consoleCollector.current = createConsoleCollector();\n consoleCollector.current.start();\n }\n if (enableNetwork && !networkCollector.current) {\n const flintHost = (() => {\n try {\n return new URL(serverUrl).hostname;\n } catch {\n return \"\";\n }\n })();\n networkCollector.current = createNetworkCollector(flintHost ? [flintHost] : []);\n networkCollector.current.start();\n }\n if (enableFormErrors && !formErrorCollector.current) {\n formErrorCollector.current = createFormErrorCollector();\n formErrorCollector.current.start();\n _setFormErrorCollector(formErrorCollector.current);\n }\n if (enableFrustration && !frustrationCollector.current) {\n frustrationCollector.current = createFrustrationCollector();\n frustrationCollector.current.start();\n }\n }\n\n useEffect(() => {\n if (globalInit) return;\n let cancelled = false;\n\n if (enableReplay) {\n import(\"rrweb\").then(({ record }) => {\n if (cancelled) return;\n const stopFn = record({\n emit(event) {\n replayEvents.current.push(event);\n const cutoff = Date.now() - REPLAY_WINDOW_MS;\n while (replayEvents.current.length > 0 && replayEvents.current[0].timestamp < cutoff) {\n replayEvents.current.shift();\n }\n },\n });\n stopReplay.current = stopFn ?? null;\n });\n }\n\n return () => {\n cancelled = true;\n consoleCollector.current?.stop();\n networkCollector.current?.stop();\n formErrorCollector.current?.stop();\n _setFormErrorCollector(null);\n frustrationCollector.current?.stop();\n stopReplay.current?.();\n };\n }, [enableReplay, globalInit]);\n\n // ── Auto-report frustration events (only for local collectors) ───────────\n useEffect(() => {\n if (globalInit) return;\n if (!enableFrustration || !autoReportFrustration || !frustrationCollector.current) return;\n\n const unsubscribe = frustrationCollector.current.onFrustration(async (event) => {\n const user = resolvedUser;\n await submitReport(serverUrl, projectKey, {\n reporterId: user?.id ?? \"anonymous\",\n reporterName: user?.name ?? \"Anonymous\",\n reporterEmail: user?.email,\n description: `[Auto-detected] ${event.type.replace(/_/g, \" \")}: ${event.details}`,\n severity: event.type === \"error_loop\" ? \"P1\" : event.type === \"rage_click\" ? \"P2\" : \"P3\",\n url: event.url,\n meta: {\n environment: collectEnvironment(),\n consoleLogs: consoleCollector.current?.getEntries() ?? [],\n networkErrors: networkCollector.current?.getEntries() ?? [],\n formErrors: formErrorCollector.current?.getEntries() ?? [],\n frustrationEvent: event,\n },\n }).catch(() => {});\n });\n\n return unsubscribe;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [enableFrustration, autoReportFrustration, globalInit]);\n\n const label = buttonLabel ?? t(\"buttonLabel\");\n\n return (\n <>\n {/* Floating trigger button */}\n <button\n ref={triggerRef}\n onMouseDown={() => {\n pendingSelection.current = window.getSelection()?.toString().trim() ?? \"\";\n }}\n onClick={() => {\n setOpen(true);\n onOpen?.();\n }}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n aria-label={label}\n style={{\n position: \"fixed\",\n bottom: \"40px\",\n right: \"20px\",\n zIndex: zIndex - 1,\n display: \"flex\",\n alignItems: \"center\",\n gap: \"8px\",\n padding: \"10px 18px\",\n borderRadius: \"24px\",\n border: \"none\",\n background: `linear-gradient(135deg, ${colors.accent}, ${colors.accentHover})`,\n color: colors.buttonText,\n fontSize: \"13px\",\n fontWeight: 600,\n cursor: \"pointer\",\n boxShadow: hovered\n ? `0 0 28px ${colors.accent}55, 0 8px 24px rgba(0,0,0,0.3)`\n : `0 0 16px ${colors.accent}33, 0 4px 16px rgba(0,0,0,0.2)`,\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif',\n transform: hovered ? \"translateY(-2px)\" : \"translateY(0)\",\n transition: \"transform 0.15s ease, box-shadow 0.15s ease\",\n letterSpacing: \"0.01em\",\n }}\n >\n <SparkIcon />\n {label}\n </button>\n\n {/* Selection tooltip */}\n {enableTextIssues && selectionTooltip && !open && (\n <button\n ref={tooltipRef}\n onClick={() => openWithSelection(selectionTooltip.text)}\n style={{\n position: \"fixed\",\n left: Math.max(8, Math.min(selectionTooltip.x - 70, window.innerWidth - 148)),\n top: Math.max(8, selectionTooltip.y - 36),\n zIndex: zIndex + 1,\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n padding: \"6px 12px\",\n borderRadius: 10,\n border: \"none\",\n background: `linear-gradient(135deg, ${colors.accent}, ${colors.accentHover})`,\n color: colors.buttonText,\n fontSize: 12,\n fontWeight: 600,\n cursor: \"pointer\",\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif',\n boxShadow: `0 4px 20px rgba(0,0,0,0.25), 0 0 12px ${colors.accent}40`,\n animation: \"flint-tooltip-in 0.15s ease-out\",\n whiteSpace: \"nowrap\",\n }}\n >\n <TextIcon />\n Report text issue\n </button>\n )}\n\n {/* Tooltip animation */}\n <style>{`\n @keyframes flint-tooltip-in {\n from { opacity: 0; transform: translateY(4px); }\n to { opacity: 1; transform: translateY(0); }\n }\n `}</style>\n\n {/* Modal */}\n {open && (\n <FlintModal\n projectKey={projectKey}\n serverUrl={serverUrl}\n user={resolvedUser}\n meta={meta}\n theme={theme}\n zIndex={zIndex}\n onClose={() => {\n setOpen(false);\n onClose?.();\n pendingSelection.current = \"\";\n }}\n getEnvironment={collectEnvironment}\n getConsoleLogs={() =>\n globalInit ? (global?.console?.getEntries() ?? []) : (consoleCollector.current?.getEntries() ?? [])\n }\n getNetworkErrors={() =>\n globalInit ? (global?.network?.getEntries() ?? []) : (networkCollector.current?.getEntries() ?? [])\n }\n getFormErrors={() =>\n globalInit ? (global?.formErrors?.getEntries() ?? []) : (formErrorCollector.current?.getEntries() ?? [])\n }\n getReplayEvents={() =>\n globalInit ? (Flint.getReplayEvents() as eventWithTime[]) : [...replayEvents.current]\n }\n getExternalReplayUrl={getExternalReplayUrl}\n initialSelection={pendingSelection.current}\n enableScreenshot={enableScreenshot}\n enableTextIssues={enableTextIssues}\n statusPageUrl={statusPageUrl}\n onBeforeSubmit={onBeforeSubmit}\n onSuccess={onSuccess}\n onError={onError}\n />\n )}\n </>\n );\n}\n\nfunction TextIcon() {\n return (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M17 10H3\" />\n <path d=\"M21 6H3\" />\n <path d=\"M21 14H3\" />\n <path d=\"M17 18H3\" />\n </svg>\n );\n}\n\nfunction SparkIcon() {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M13 2L3 14h9l-1 8 10-12h-9l1-8z\" />\n </svg>\n );\n}\n","export { createConsoleCollector } from \"@diegotsi/flint-core\";\n","export { collectEnvironment } from \"@diegotsi/flint-core\";\n","export { createFormErrorCollector } from \"@diegotsi/flint-core\";\n","export { createFrustrationCollector } from \"@diegotsi/flint-core\";\n","export { createNetworkCollector } from \"@diegotsi/flint-core\";\n","import i18next, { createInstance } from \"i18next\";\nimport { initReactI18next } from \"react-i18next\";\nimport en from \"./locales/en.json\";\n\nexport const widgetI18n: ReturnType<typeof createInstance> = createInstance();\n\nwidgetI18n.use(initReactI18next).init({\n lng: \"en-US\",\n fallbackLng: \"en-US\",\n resources: { \"en-US\": { translation: en } },\n interpolation: { escapeValue: false },\n initImmediate: false,\n});\n\nexport default widgetI18n;\n","{\n \"buttonLabel\": \"Report bug\",\n \"modalTitle\": \"Report an issue\",\n \"severityLabel\": \"Severity\",\n \"severity_P1_hint\": \"Critical — system down\",\n \"severity_P2_hint\": \"High — core feature broken\",\n \"severity_P3_hint\": \"Medium — noticeable but workable\",\n \"severity_P4_hint\": \"Low — cosmetic or improvement\",\n \"severity_P1_label\": \"Critical\",\n \"severity_P2_label\": \"High\",\n \"severity_P3_label\": \"Medium\",\n \"severity_P4_label\": \"Low\",\n \"whatIsBrokenLabel\": \"What Is Broken\",\n \"whatIsBrokenPlaceholder\": \"1–2 sentences: what is currently happening that should NOT happen.\",\n \"expectedBehaviorLabel\": \"Expected Behavior (optional)\",\n \"expectedBehaviorPlaceholder\": \"Describe exactly what the user should see or receive after the fix.\",\n \"screenshotLabel\": \"Screenshot (optional)\",\n \"screenshotPlaceholder\": \"Click to attach...\",\n \"screenshotAttachFile\": \"Attach file\",\n \"screenshotMarkOnScreen\": \"Mark on screen\",\n \"submitLabel\": \"Submit\",\n \"close\": \"Close\",\n \"successTitle\": \"Bug reported!\",\n \"successDuplicate\": \"Looks like a duplicate of an existing bug.\",\n \"successGitHub\": \"View GitHub issue\",\n \"successSlack\": \"View Slack message\",\n \"replayInfo\": \"No need to record your screen — we automatically capture a session replay when you submit.\",\n \"errorLabel\": \"Failed to submit. Please try again.\",\n \"cancel\": \"Cancel\",\n \"sending\": \"Sending report\",\n \"capturingContext\": \"Capturing context\"\n}\n","import { getSnapshot, subscribe } from \"@diegotsi/flint-core\";\nimport { useSyncExternalStore } from \"react\";\n\nexport { _setFormErrorCollector, Flint, flint } from \"@diegotsi/flint-core\";\n\nexport function useFlintStore() {\n return useSyncExternalStore(subscribe, getSnapshot);\n}\n"],"mappings":"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","names":["useEffect","useRef","useState","jsx","jsxs","useState","useRef","useEffect","Flint","useCallback","useEffect","useRef","useState","useTranslation","Fragment","jsx","jsxs","useEffect","useTranslation","useState","useRef","useCallback","Flint","user","SparkIcon"]}
1
+ {"version":3,"sources":["../src/FlintModal.tsx","../src/api.ts","../src/ScreenAnnotator.tsx","../src/theme.ts","../src/FlintWidget.tsx","../src/collectors/console.ts","../src/collectors/environment.ts","../src/collectors/formErrors.ts","../src/collectors/frustration.ts","../src/collectors/network.ts","../src/i18n/index.ts","../src/i18n/locales/en.json","../src/store.ts"],"sourcesContent":["import type {\n ConsoleEntry,\n EnvironmentInfo,\n FlintUser,\n FormErrorEntry,\n NetworkEntry,\n ReportPayload,\n ReportResult,\n Severity,\n Theme,\n} from \"@diegotsi/flint-core\";\nimport type { eventWithTime } from \"@rrweb/types\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { submitReplay, submitReport } from \"./api.js\";\nimport { ScreenAnnotator } from \"./ScreenAnnotator.js\";\nimport { resolveTheme } from \"./theme.js\";\n\ninterface Props {\n projectKey: string;\n serverUrl: string;\n user?: FlintUser;\n meta?: Record<string, unknown>;\n theme: Theme;\n zIndex: number;\n onClose: () => void;\n getEnvironment: () => EnvironmentInfo;\n getConsoleLogs: () => ConsoleEntry[];\n getNetworkErrors: () => NetworkEntry[];\n getFormErrors: () => FormErrorEntry[];\n getReplayEvents: () => eventWithTime[];\n getExternalReplayUrl: () => string | undefined;\n initialSelection?: string;\n enableScreenshot?: boolean;\n enableTextIssues?: boolean;\n statusPageUrl?: string;\n onBeforeSubmit?: (payload: ReportPayload) => boolean | Promise<boolean>;\n onSuccess?: (result: ReportResult) => void;\n onError?: (error: Error) => void;\n}\n\nconst SEVERITIES: Severity[] = [\"P1\", \"P2\", \"P3\", \"P4\"];\nconst SEV_COLOR: Record<Severity, string> = {\n P1: \"#ef4444\",\n P2: \"#f97316\",\n P3: \"#eab308\",\n P4: \"#22c55e\",\n};\n\ntype Status = \"idle\" | \"submitting\" | \"success\" | \"error\";\n\n// Inject CSS keyframes once — animations can't be done with inline styles alone\nfunction injectKeyframes() {\n if (typeof document === \"undefined\") return;\n if (document.getElementById(\"_flint_kf\")) return;\n const s = document.createElement(\"style\");\n s.id = \"_flint_kf\";\n s.textContent = `\n @keyframes _flint_in {\n from { opacity: 0; transform: scale(0.93) translateY(10px); }\n to { opacity: 1; transform: scale(1) translateY(0); }\n }\n @keyframes _flint_overlay_in {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n @keyframes _flint_spin {\n to { transform: rotate(360deg); }\n }\n @keyframes _flint_pulse {\n 0%, 100% { opacity: 0.5; transform: scale(0.88); }\n 50% { opacity: 1; transform: scale(1.08); }\n }\n @keyframes _flint_ripple {\n 0% { opacity: 0.5; transform: scale(0.75); }\n 100% { opacity: 0; transform: scale(1.55); }\n }\n @keyframes _flint_sending_dot {\n 0%, 80%, 100% { opacity: 0.2; transform: scale(0.8); }\n 40% { opacity: 1; transform: scale(1); }\n }\n @keyframes _flint_success_up {\n from { opacity: 0; transform: translateY(8px); }\n to { opacity: 1; transform: translateY(0); }\n }\n `;\n document.head.appendChild(s);\n}\n\nexport function FlintModal({\n projectKey,\n serverUrl,\n user,\n meta,\n theme,\n zIndex,\n onClose,\n getEnvironment,\n getConsoleLogs,\n getNetworkErrors,\n getFormErrors,\n getReplayEvents,\n getExternalReplayUrl,\n initialSelection = \"\",\n enableScreenshot = true,\n enableTextIssues = true,\n statusPageUrl,\n onBeforeSubmit,\n onSuccess,\n onError,\n}: Props) {\n const { t } = useTranslation();\n const colors = resolveTheme(theme);\n const isDark = theme === \"dark\";\n\n const [severity, setSeverity] = useState<Severity>(\"P2\");\n const [description, setDescription] = useState(\"\");\n const [expectedBehavior, setExpectedBehavior] = useState(\"\");\n const [screenshot, setScreenshot] = useState<File | null>(null);\n const [annotating, setAnnotating] = useState(false);\n const [status, setStatus] = useState<Status>(\"idle\");\n const [result, setResult] = useState<ReportResult | null>(null);\n const [errorMsg, setErrorMsg] = useState(\"\");\n\n // Text issue mode\n const [mode, setMode] = useState<\"bug\" | \"text\">(enableTextIssues && initialSelection ? \"text\" : \"bug\");\n const [textOriginal, setTextOriginal] = useState(initialSelection);\n const [textSuggested, setTextSuggested] = useState(\"\");\n const [textLang, setTextLang] = useState(\n typeof document !== \"undefined\" ? document.documentElement.lang?.split(\"-\")[0] || \"en\" : \"en\",\n );\n\n const fileRef = useRef<HTMLInputElement>(null);\n const overlayRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n injectKeyframes();\n }, []);\n\n useEffect(() => {\n const handler = (e: KeyboardEvent) => {\n if (e.key === \"Escape\" && status !== \"submitting\") onClose();\n };\n window.addEventListener(\"keydown\", handler);\n return () => window.removeEventListener(\"keydown\", handler);\n }, [onClose, status]);\n\n const handleOverlayClick = useCallback(\n (e: React.MouseEvent) => {\n if (e.target === overlayRef.current && status !== \"submitting\") onClose();\n },\n [onClose, status],\n );\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n const isText = mode === \"text\";\n if (isText) {\n if (!textOriginal.trim() || !textSuggested.trim()) return;\n } else {\n if (!description.trim()) return;\n }\n\n setStatus(\"submitting\");\n setErrorMsg(\"\");\n\n const collectedMeta: Record<string, unknown> = {\n ...meta,\n environment: getEnvironment(),\n consoleLogs: getConsoleLogs(),\n networkErrors: getNetworkErrors(),\n formErrors: getFormErrors(),\n };\n\n if (isText) {\n collectedMeta.textIssue = {\n original: textOriginal.trim(),\n suggested: textSuggested.trim(),\n lang: textLang,\n };\n }\n\n const payload: ReportPayload = {\n reporterId: user?.id ?? \"anonymous\",\n reporterName: user?.name ?? \"Anonymous\",\n reporterEmail: user?.email,\n description: isText ? `[Text issue] \"${textOriginal.trim()}\" → \"${textSuggested.trim()}\"` : description.trim(),\n expectedBehavior: !isText ? expectedBehavior.trim() || undefined : undefined,\n externalReplayUrl: getExternalReplayUrl() || undefined,\n severity: isText ? \"P3\" : severity,\n url: window.location.href,\n meta: collectedMeta,\n label: isText ? \"TEXT\" : undefined,\n };\n\n if (onBeforeSubmit) {\n const proceed = await onBeforeSubmit(payload);\n if (!proceed) {\n setStatus(\"idle\");\n return;\n }\n }\n\n try {\n const res = await submitReport(serverUrl, projectKey, payload, !isText ? (screenshot ?? undefined) : undefined);\n setResult(res);\n setStatus(\"success\");\n onSuccess?.(res);\n\n const events = getReplayEvents();\n if (events.length > 0) {\n submitReplay(serverUrl, projectKey, res.id, events).catch(() => {});\n }\n } catch (err) {\n const error = err instanceof Error ? err : new Error(t(\"errorLabel\"));\n setErrorMsg(error.message);\n setStatus(\"error\");\n onError?.(error);\n }\n };\n\n // ── Shared style tokens ────────────────────────────────────────────────────\n const inputBorder = isDark ? \"rgba(255,255,255,0.1)\" : \"rgba(0,0,0,0.1)\";\n const accentGlow = `0 0 20px ${colors.accent}40, 0 4px 16px rgba(0,0,0,0.2)`;\n\n const overlayStyle: React.CSSProperties = {\n position: \"fixed\",\n inset: 0,\n background: \"rgba(0,0,0,0.5)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n zIndex,\n padding: \"16px\",\n backdropFilter: \"blur(10px)\",\n WebkitBackdropFilter: \"blur(10px)\",\n animation: \"_flint_overlay_in 0.2s ease\",\n };\n\n const modalStyle: React.CSSProperties = {\n background: colors.background,\n backdropFilter: colors.backdropFilter,\n WebkitBackdropFilter: colors.backdropFilter,\n borderRadius: \"20px\",\n boxShadow: colors.shadow,\n border: `1px solid ${colors.border}`,\n width: \"100%\",\n maxWidth: \"600px\",\n maxHeight: \"92vh\",\n overflowY: \"auto\",\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif',\n color: colors.text,\n animation: \"_flint_in 0.28s cubic-bezier(0.16, 1, 0.3, 1)\",\n };\n\n const inputStyle: React.CSSProperties = {\n width: \"100%\",\n padding: \"11px 13px\",\n borderRadius: \"10px\",\n border: `1px solid ${inputBorder}`,\n background: colors.backgroundSecondary,\n color: colors.text,\n fontSize: \"16px\",\n outline: \"none\",\n boxSizing: \"border-box\",\n fontFamily: \"inherit\",\n transition: \"border-color 0.15s\",\n };\n\n // ── Loading + Success (unified animated state) ────────────────────────────\n if (status === \"submitting\" || status === \"success\") {\n const isSuccess = status === \"success\";\n const ringBorder = isSuccess\n ? \"3px solid #22c55e\"\n : `3px solid ${isDark ? \"rgba(255,255,255,0.08)\" : \"rgba(0,0,0,0.08)\"}`;\n const ringTopColor = isSuccess ? \"#22c55e\" : colors.accent;\n\n return (\n <div style={overlayStyle}>\n <div\n style={modalStyle}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={isSuccess ? t(\"successTitle\") : t(\"sending\")}\n >\n <ModalHeader colors={colors} inputBorder={inputBorder} showClose={false} onClose={onClose} />\n\n <div\n style={{\n padding: \"40px 32px 48px\",\n textAlign: \"center\",\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n }}\n >\n {/* Animated rings */}\n <div style={{ position: \"relative\", width: 80, height: 80, marginBottom: 28 }}>\n {/* Ripple 1 — fade out on success */}\n <div\n style={{\n position: \"absolute\",\n inset: -10,\n borderRadius: \"50%\",\n border: `1.5px solid ${colors.accent}`,\n animation: \"_flint_ripple 1.8s ease-out infinite\",\n opacity: isSuccess ? 0 : 1,\n transition: \"opacity 0.3s ease\",\n }}\n />\n {/* Ripple 2 (delayed) */}\n <div\n style={{\n position: \"absolute\",\n inset: -10,\n borderRadius: \"50%\",\n border: `1.5px solid ${colors.accent}`,\n animation: \"_flint_ripple 1.8s ease-out infinite 0.6s\",\n opacity: isSuccess ? 0 : 1,\n transition: \"opacity 0.3s ease\",\n }}\n />\n {/* Spinning ring — transitions to solid green on success */}\n <div\n style={{\n position: \"absolute\",\n inset: 0,\n borderRadius: \"50%\",\n border: ringBorder,\n borderTopColor: ringTopColor,\n animation: isSuccess ? \"none\" : \"_flint_spin 0.85s linear infinite\",\n transition: \"border-color 0.45s ease, border-top-color 0.45s ease\",\n }}\n />\n {/* Center: spark fades out, check fades in */}\n <div style={{ position: \"absolute\", inset: 14, borderRadius: \"50%\" }}>\n {/* Spark */}\n <div\n style={{\n position: \"absolute\",\n inset: 0,\n borderRadius: \"50%\",\n background: `linear-gradient(135deg, ${colors.accent}30, ${colors.accentHover}50)`,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n animation: isSuccess ? \"none\" : \"_flint_pulse 2s ease-in-out infinite\",\n opacity: isSuccess ? 0 : 1,\n transition: \"opacity 0.3s ease\",\n }}\n >\n <SparkIcon color={colors.accent} size={20} />\n </div>\n {/* Checkmark */}\n <div\n style={{\n position: \"absolute\",\n inset: 0,\n borderRadius: \"50%\",\n background: \"rgba(34,197,94,0.15)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n opacity: isSuccess ? 1 : 0,\n transform: isSuccess ? \"scale(1)\" : \"scale(0.65)\",\n transition: \"opacity 0.35s ease 0.2s, transform 0.4s cubic-bezier(0.16,1,0.3,1) 0.2s\",\n }}\n >\n <CheckIcon size={20} />\n </div>\n </div>\n </div>\n\n {/* Title crossfade */}\n <div style={{ position: \"relative\", height: 26, width: \"100%\", marginBottom: 10 }}>\n <div\n style={{\n position: \"absolute\",\n inset: 0,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n fontSize: 19,\n fontWeight: 700,\n color: colors.text,\n letterSpacing: \"-0.02em\",\n opacity: isSuccess ? 0 : 1,\n transition: \"opacity 0.25s ease\",\n pointerEvents: \"none\",\n }}\n >\n {t(\"sending\")}\n </div>\n <div\n style={{\n position: \"absolute\",\n inset: 0,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n fontSize: 19,\n fontWeight: 700,\n color: colors.text,\n letterSpacing: \"-0.02em\",\n opacity: isSuccess ? 1 : 0,\n transform: isSuccess ? \"translateY(0)\" : \"translateY(6px)\",\n transition: \"opacity 0.35s ease 0.25s, transform 0.35s ease 0.25s\",\n pointerEvents: isSuccess ? \"auto\" : \"none\",\n }}\n >\n {t(\"successTitle\")}\n </div>\n </div>\n\n {/* Subtitle crossfade */}\n <div style={{ position: \"relative\", minHeight: 76, width: \"100%\" }}>\n {/* Loading subtitle */}\n <div\n style={{\n position: \"absolute\",\n inset: 0,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 6,\n color: colors.textMuted,\n fontSize: 15,\n opacity: isSuccess ? 0 : 1,\n transition: \"opacity 0.2s ease\",\n pointerEvents: \"none\",\n }}\n >\n <span>{t(\"capturingContext\")}</span>\n <SendingDots color={colors.accent} />\n </div>\n {/* Success subtitle */}\n <div\n style={{\n position: \"absolute\",\n inset: 0,\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n gap: 10,\n opacity: isSuccess ? 1 : 0,\n transform: isSuccess ? \"translateY(0)\" : \"translateY(8px)\",\n transition: \"opacity 0.35s ease 0.35s, transform 0.35s ease 0.35s\",\n pointerEvents: isSuccess ? \"auto\" : \"none\",\n }}\n >\n <p style={{ fontSize: 15, color: colors.textMuted, margin: 0 }}>{result ? `ID: ${result.id}` : \"\"}</p>\n {statusPageUrl && user?.id && (\n <a\n href={`${statusPageUrl}/status?project_key=${encodeURIComponent(projectKey)}&reporter_id=${encodeURIComponent(user.id)}&server_url=${encodeURIComponent(serverUrl)}`}\n target=\"_blank\"\n rel=\"noreferrer\"\n style={{\n fontSize: 14,\n color: colors.accent,\n textDecoration: \"none\",\n fontWeight: 600,\n animation: \"_flint_success_up 0.35s ease 0.4s both\",\n }}\n >\n {\"\\ud83d\\udccb\"} Track your bugs {\"\\u2192\"}\n </a>\n )}\n {/*\n {result?.slackMessageUrl && (\n <a\n href={result.slackMessageUrl}\n target=\"_blank\"\n rel=\"noreferrer\"\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 6,\n padding: \"9px 18px\",\n borderRadius: \"10px\",\n background: `linear-gradient(135deg, ${colors.accent}, ${colors.accentHover})`,\n color: colors.buttonText,\n textDecoration: \"none\",\n fontSize: \"15px\",\n fontWeight: 600,\n boxShadow: accentGlow,\n }}\n >\n {t(\"successSlack\")} ↗\n </a>\n )} */}\n <button\n onClick={onClose}\n style={{\n width: \"100%\",\n padding: \"13px 20px\",\n borderRadius: 12,\n border: \"none\",\n background: `linear-gradient(135deg, ${colors.accent}, ${colors.accentHover})`,\n color: colors.buttonText,\n fontSize: 17,\n fontWeight: 700,\n cursor: \"pointer\",\n letterSpacing: \"-0.01em\",\n boxShadow: accentGlow,\n fontFamily: \"inherit\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 8,\n }}\n >\n {t(\"close\")}\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n );\n }\n\n // ── Form ──────────────────────────────────────────────────────────────────\n return (\n <>\n {enableScreenshot && annotating && (\n <ScreenAnnotator\n zIndex={zIndex + 1}\n onCapture={(file) => {\n setScreenshot(file);\n setAnnotating(false);\n }}\n onCancel={() => setAnnotating(false)}\n />\n )}\n {!annotating && (\n <div ref={overlayRef} style={overlayStyle} onClick={handleOverlayClick}>\n <div style={modalStyle} role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"flint-modal-title\">\n <ModalHeader\n colors={colors}\n inputBorder={inputBorder}\n showClose\n onClose={onClose}\n titleId=\"flint-modal-title\"\n title={t(\"modalTitle\")}\n />\n\n <form onSubmit={handleSubmit} style={{ padding: \"20px 24px 24px\" }}>\n {/* Mode toggle */}\n {enableTextIssues && (\n <div\n style={{\n display: \"flex\",\n gap: 4,\n marginBottom: 20,\n background: colors.backgroundSecondary,\n borderRadius: 12,\n padding: 4,\n border: `1px solid ${inputBorder}`,\n }}\n >\n {([\"bug\", \"text\"] as const).map((m) => (\n <button\n key={m}\n type=\"button\"\n onClick={() => setMode(m)}\n style={{\n flex: 1,\n padding: \"8px 10px\",\n borderRadius: 9,\n border: \"none\",\n cursor: \"pointer\",\n fontSize: 13,\n fontWeight: mode === m ? 700 : 500,\n fontFamily: \"inherit\",\n transition: \"background 0.15s, color 0.15s\",\n background:\n mode === m\n ? `linear-gradient(135deg, ${colors.accent}, ${colors.accentHover})`\n : \"transparent\",\n color: mode === m ? colors.buttonText : colors.textMuted,\n boxShadow: mode === m ? `0 2px 8px ${colors.accent}30` : \"none\",\n }}\n >\n {m === \"bug\" ? \"🐛 Bug\" : \"🔤 Text / Translation\"}\n </button>\n ))}\n </div>\n )}\n\n {/* Text issue fields */}\n {mode === \"text\" && (\n <>\n <div style={{ marginBottom: 14 }}>\n <FieldLabel colors={colors} htmlFor=\"flint-text-original\">\n Original text\n </FieldLabel>\n <textarea\n id=\"flint-text-original\"\n style={{ ...inputStyle, resize: \"vertical\", minHeight: 60 }}\n value={textOriginal}\n onChange={(e) => setTextOriginal(e.target.value)}\n placeholder=\"Text that is wrong on screen…\"\n required\n />\n </div>\n <div style={{ marginBottom: 14 }}>\n <FieldLabel colors={colors} htmlFor=\"flint-text-suggested\">\n Suggested correction\n </FieldLabel>\n <textarea\n id=\"flint-text-suggested\"\n style={{ ...inputStyle, resize: \"vertical\", minHeight: 60 }}\n value={textSuggested}\n onChange={(e) => setTextSuggested(e.target.value)}\n placeholder=\"How it should read…\"\n required\n />\n </div>\n <div style={{ marginBottom: 20 }}>\n <FieldLabel colors={colors} htmlFor=\"flint-text-lang\">\n Language\n </FieldLabel>\n <select\n id=\"flint-text-lang\"\n value={textLang}\n onChange={(e) => setTextLang(e.target.value)}\n style={{\n ...inputStyle,\n appearance: \"none\",\n cursor: \"pointer\",\n }}\n >\n <option value=\"en\">English (en)</option>\n <option value=\"he\">עברית (he)</option>\n </select>\n </div>\n </>\n )}\n\n {/* Severity */}\n <div style={{ marginBottom: 18, display: mode === \"text\" ? \"none\" : undefined }}>\n <FieldLabel colors={colors}>{t(\"severityLabel\")}</FieldLabel>\n <div style={{ display: \"grid\", gridTemplateColumns: \"repeat(4,1fr)\", gap: 8 }}>\n {SEVERITIES.map((sev) => (\n <SeverityButton\n key={sev}\n sev={sev}\n label={t(`severity_${sev}_label`)}\n selected={severity === sev}\n hint={t(`severity_${sev}_hint`)}\n color={SEV_COLOR[sev]}\n accent={colors.accent}\n border={inputBorder}\n bg={colors.backgroundSecondary}\n text={colors.text}\n onClick={() => setSeverity(sev)}\n />\n ))}\n </div>\n </div>\n\n {/* What Is Broken */}\n {mode === \"bug\" && (\n <div style={{ marginBottom: 14 }}>\n <FieldLabel colors={colors} htmlFor=\"flint-description\">\n {t(\"whatIsBrokenLabel\")}\n </FieldLabel>\n <textarea\n id=\"flint-description\"\n style={{ ...inputStyle, resize: \"vertical\", minHeight: 80 }}\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n placeholder={t(\"whatIsBrokenPlaceholder\")}\n required\n />\n </div>\n )}\n\n {/* Expected Behavior (optional) */}\n {mode === \"bug\" && (\n <div style={{ marginBottom: 14 }}>\n <FieldLabel colors={colors} htmlFor=\"flint-expected\">\n {t(\"expectedBehaviorLabel\")}\n </FieldLabel>\n <textarea\n id=\"flint-expected\"\n style={{ ...inputStyle, resize: \"vertical\", minHeight: 72 }}\n value={expectedBehavior}\n onChange={(e) => setExpectedBehavior(e.target.value)}\n placeholder={t(\"expectedBehaviorPlaceholder\")}\n />\n </div>\n )}\n\n {/* Screenshot */}\n <div style={{ marginBottom: 20, display: mode === \"text\" || !enableScreenshot ? \"none\" : undefined }}>\n <FieldLabel colors={colors}>{t(\"screenshotLabel\")}</FieldLabel>\n {screenshot ? (\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 10 }}>\n <img\n src={URL.createObjectURL(screenshot)}\n alt=\"Screenshot preview\"\n style={{ height: 60, borderRadius: 8, objectFit: \"cover\", border: `1px solid ${inputBorder}` }}\n />\n <span\n style={{\n fontSize: 13,\n color: colors.textMuted,\n flex: 1,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {screenshot.name}\n </span>\n <button\n type=\"button\"\n onClick={() => setScreenshot(null)}\n aria-label=\"Remove screenshot\"\n style={{\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n fontSize: 18,\n color: colors.textMuted,\n lineHeight: 1,\n padding: \"2px 6px\",\n borderRadius: 6,\n fontFamily: \"inherit\",\n }}\n >\n ×\n </button>\n </div>\n ) : (\n <div style={{ display: \"flex\", gap: 8 }}>\n <button\n type=\"button\"\n onClick={() => fileRef.current?.click()}\n style={{\n flex: 1,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 6,\n padding: \"10px 13px\",\n borderRadius: 10,\n border: `1px dashed ${inputBorder}`,\n cursor: \"pointer\",\n fontSize: 14,\n color: colors.textMuted,\n background: colors.backgroundSecondary,\n fontFamily: \"inherit\",\n }}\n >\n 📎 {t(\"screenshotAttachFile\")}\n </button>\n <button\n type=\"button\"\n onClick={() => setAnnotating(true)}\n style={{\n flex: 1,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 6,\n padding: \"10px 13px\",\n borderRadius: 10,\n border: `1px dashed ${inputBorder}`,\n cursor: \"pointer\",\n fontSize: 14,\n color: colors.textMuted,\n background: colors.backgroundSecondary,\n fontFamily: \"inherit\",\n }}\n >\n 🔲 {t(\"screenshotMarkOnScreen\")}\n </button>\n </div>\n )}\n <input\n id=\"flint-screenshot\"\n ref={fileRef}\n type=\"file\"\n accept=\"image/*\"\n style={{ display: \"none\" }}\n onChange={(e) => setScreenshot(e.target.files?.[0] ?? null)}\n />\n </div>\n\n {/* Session replay info */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n padding: \"9px 12px\",\n borderRadius: 10,\n background: isDark ? \"rgba(255,255,255,0.04)\" : \"rgba(0,77,240,0.04)\",\n border: `1px solid ${isDark ? \"rgba(255,255,255,0.08)\" : \"rgba(0,77,240,0.1)\"}`,\n marginBottom: 16,\n }}\n >\n <span style={{ fontSize: 16 }}>🎥</span>\n <span style={{ fontSize: 14, color: colors.textMuted, lineHeight: 1.4 }}>{t(\"replayInfo\")}</span>\n </div>\n\n {/* Error */}\n {status === \"error\" && (\n <div\n style={{\n padding: \"10px 13px\",\n borderRadius: 10,\n background: \"rgba(239,68,68,0.08)\",\n border: \"1px solid rgba(239,68,68,0.2)\",\n color: \"#f87171\",\n fontSize: 14,\n marginBottom: 16,\n }}\n >\n ⚠️ {errorMsg || t(\"errorLabel\")}\n </div>\n )}\n\n {/* Submit */}\n <button\n type=\"submit\"\n style={{\n width: \"100%\",\n padding: \"13px 20px\",\n borderRadius: 12,\n border: \"none\",\n background: `linear-gradient(135deg, ${colors.accent}, ${colors.accentHover})`,\n color: colors.buttonText,\n fontSize: 17,\n fontWeight: 700,\n cursor: \"pointer\",\n letterSpacing: \"-0.01em\",\n boxShadow: accentGlow,\n fontFamily: \"inherit\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 8,\n }}\n >\n <SparkIcon color={colors.buttonText} size={15} />\n {t(\"submitLabel\")}\n </button>\n\n {/* Cancel */}\n <button\n type=\"button\"\n onClick={onClose}\n style={{\n width: \"100%\",\n padding: \"10px\",\n marginTop: 8,\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n fontSize: 15,\n color: colors.textMuted,\n fontFamily: \"inherit\",\n borderRadius: 8,\n }}\n >\n {t(\"cancel\")}\n </button>\n </form>\n </div>\n </div>\n )}\n </>\n );\n}\n\n// ─── Sub-components ──────────────────────────────────────────────────────────\n\nfunction ModalHeader({\n colors,\n inputBorder,\n showClose,\n onClose,\n titleId,\n title,\n}: {\n colors: ReturnType<typeof resolveTheme>;\n inputBorder: string;\n showClose: boolean;\n onClose: () => void;\n titleId?: string;\n title?: string;\n}) {\n return (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 10,\n padding: \"16px 20px 14px\",\n borderBottom: `1px solid ${inputBorder}`,\n }}\n >\n {/* Brand chip */}\n <div\n style={{\n width: 28,\n height: 28,\n borderRadius: 8,\n background: `linear-gradient(135deg, ${colors.accent}20, ${colors.accentHover}35)`,\n border: `1px solid ${colors.accent}30`,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n flexShrink: 0,\n }}\n >\n <SparkIcon color={colors.accent} size={13} />\n </div>\n\n {titleId && title ? (\n <h2\n id={titleId}\n style={{ margin: 0, fontSize: 16, fontWeight: 600, color: colors.text, letterSpacing: \"-0.01em\", flex: 1 }}\n >\n {title}\n </h2>\n ) : (\n <span style={{ flex: 1, fontSize: 15, fontWeight: 600, color: colors.textMuted }}>Flint</span>\n )}\n\n {showClose && (\n <button\n onClick={onClose}\n aria-label=\"Close\"\n style={{\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n padding: 4,\n color: colors.textMuted,\n fontSize: 22,\n lineHeight: 1,\n borderRadius: 6,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n opacity: 0.6,\n fontFamily: \"inherit\",\n }}\n >\n ×\n </button>\n )}\n </div>\n );\n}\n\nfunction FieldLabel({\n children,\n colors,\n htmlFor,\n}: {\n children: React.ReactNode;\n colors: ReturnType<typeof resolveTheme>;\n htmlFor?: string;\n}) {\n return (\n <label\n htmlFor={htmlFor}\n style={{\n display: \"block\",\n fontSize: \"12px\",\n fontWeight: 700,\n color: colors.textMuted,\n marginBottom: 6,\n textTransform: \"uppercase\" as const,\n letterSpacing: \"0.07em\",\n }}\n >\n {children}\n </label>\n );\n}\n\nfunction SendingDots({ color }: { color: string }) {\n return (\n <span style={{ display: \"inline-flex\", gap: 3, alignItems: \"center\" }}>\n {[0, 1, 2].map((i) => (\n <span\n key={i}\n style={{\n width: 4,\n height: 4,\n borderRadius: \"50%\",\n background: color,\n display: \"inline-block\",\n animation: `_flint_sending_dot 1.4s ease-in-out infinite ${i * 0.2}s`,\n }}\n />\n ))}\n </span>\n );\n}\n\ninterface SevBtnProps {\n sev: Severity;\n label: string;\n selected: boolean;\n hint: string;\n color: string;\n accent: string;\n border: string;\n bg: string;\n text: string;\n onClick: () => void;\n}\n\nfunction SeverityButton({ sev, label, selected, hint, color, accent, border, bg, text, onClick }: SevBtnProps) {\n return (\n <button\n type=\"button\"\n title={hint}\n onClick={onClick}\n style={{\n padding: \"9px 6px 8px\",\n borderRadius: 10,\n border: selected ? `2px solid ${accent}` : `1.5px solid ${border}`,\n background: selected ? `${accent}15` : bg,\n cursor: \"pointer\",\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n gap: 5,\n transition: \"border-color 0.12s, background 0.12s\",\n fontFamily: \"inherit\",\n }}\n >\n <span style={{ width: 8, height: 8, borderRadius: \"50%\", background: color, display: \"block\" }} />\n <span\n style={{\n fontSize: 13,\n fontWeight: selected ? 700 : 500,\n color: selected ? accent : text,\n letterSpacing: \"0.02em\",\n }}\n >\n {sev}\n </span>\n <span style={{ fontSize: 11, color: selected ? accent : text, opacity: 0.6, letterSpacing: \"0.02em\" }}>\n {label}\n </span>\n </button>\n );\n}\n\nfunction SparkIcon({ color = \"currentColor\", size = 14 }: { color?: string; size?: number }) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke={color}\n strokeWidth=\"2.2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M13 2L3 14h9l-1 8 10-12h-9l1-8z\" />\n </svg>\n );\n}\n\nfunction CheckIcon({ size = 20 }: { size?: number }) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"#22c55e\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n );\n}\n","export { submitReplay, submitReport } from \"@diegotsi/flint-core\";\n","import { domToCanvas } from \"modern-screenshot\";\nimport { useEffect, useRef, useState } from \"react\";\n\ninterface Props {\n zIndex: number;\n onCapture: (file: File) => void;\n onCancel: () => void;\n}\n\ntype Phase = \"idle\" | \"selecting\" | \"capturing\";\n\ninterface Rect {\n x: number;\n y: number;\n w: number;\n h: number;\n}\n\nfunction normalizeRect(startX: number, startY: number, endX: number, endY: number): Rect {\n return {\n x: Math.min(startX, endX),\n y: Math.min(startY, endY),\n w: Math.abs(endX - startX),\n h: Math.abs(endY - startY),\n };\n}\n\nexport function ScreenAnnotator({ zIndex, onCapture, onCancel }: Props) {\n const [phase, setPhase] = useState<Phase>(\"idle\");\n const [rect, setRect] = useState<Rect | null>(null);\n const startRef = useRef<{ x: number; y: number } | null>(null);\n const overlayRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") onCancel();\n };\n window.addEventListener(\"keydown\", onKey);\n return () => window.removeEventListener(\"keydown\", onKey);\n }, [onCancel]);\n\n const onMouseDown = (e: React.MouseEvent) => {\n e.preventDefault();\n startRef.current = { x: e.clientX, y: e.clientY };\n setPhase(\"selecting\");\n setRect({ x: e.clientX, y: e.clientY, w: 0, h: 0 });\n };\n\n const onMouseMove = (e: React.MouseEvent) => {\n if (phase !== \"selecting\" || !startRef.current) return;\n setRect(normalizeRect(startRef.current.x, startRef.current.y, e.clientX, e.clientY));\n };\n\n const onMouseUp = async (e: React.MouseEvent) => {\n if (phase !== \"selecting\" || !startRef.current) return;\n const finalRect = normalizeRect(startRef.current.x, startRef.current.y, e.clientX, e.clientY);\n startRef.current = null;\n\n if (finalRect.w < 5 || finalRect.h < 5) {\n setPhase(\"idle\");\n setRect(null);\n return;\n }\n\n setPhase(\"capturing\");\n\n const dpr = window.devicePixelRatio ?? 1;\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n\n // Wait for React to re-render + browser to paint so the overlay disappears\n await new Promise<void>((resolve) => requestAnimationFrame(() => requestAnimationFrame(() => resolve())));\n\n try {\n // Capture the visible viewport using modern-screenshot.\n // It clones only the visible area when width/height match the viewport.\n const fullCanvas = await domToCanvas(document.documentElement, {\n scale: dpr,\n width: vw,\n height: vh,\n style: {\n transform: `translate(-${window.scrollX}px, -${window.scrollY}px)`,\n },\n filter: (el) => el !== overlayRef.current,\n });\n\n // Crop canvas to viewport size (domToCanvas may produce a larger canvas)\n const canvas = document.createElement(\"canvas\");\n canvas.width = vw * dpr;\n canvas.height = vh * dpr;\n const ctx = canvas.getContext(\"2d\")!;\n ctx.drawImage(fullCanvas, 0, 0, vw * dpr, vh * dpr, 0, 0, vw * dpr, vh * dpr);\n\n // Draw annotation highlight — clientX/Y are viewport-relative\n ctx.fillStyle = \"rgba(255,200,0,0.25)\";\n ctx.fillRect(finalRect.x * dpr, finalRect.y * dpr, finalRect.w * dpr, finalRect.h * dpr);\n ctx.strokeStyle = \"#f97316\";\n ctx.lineWidth = 3 * dpr;\n ctx.strokeRect(finalRect.x * dpr, finalRect.y * dpr, finalRect.w * dpr, finalRect.h * dpr);\n\n canvas.toBlob((blob: Blob | null) => {\n if (blob) {\n onCapture(new File([blob], \"annotation.png\", { type: \"image/png\" }));\n } else {\n onCancel();\n }\n }, \"image/png\");\n } catch (err) {\n console.error(\"[Flint] ScreenAnnotator capture failed:\", err);\n onCancel();\n }\n };\n\n const isCapturing = phase === \"capturing\";\n\n return (\n <div\n ref={overlayRef}\n onMouseDown={onMouseDown}\n onMouseMove={onMouseMove}\n onMouseUp={onMouseUp}\n style={{\n position: \"fixed\",\n inset: 0,\n zIndex,\n cursor: isCapturing ? \"default\" : \"crosshair\",\n userSelect: \"none\",\n background: phase === \"selecting\" ? \"rgba(0,0,0,0.15)\" : \"rgba(0,0,0,0.05)\",\n transition: \"background 0.1s\",\n opacity: isCapturing ? 0 : 1,\n pointerEvents: isCapturing ? \"none\" : \"auto\",\n }}\n >\n {!isCapturing && (\n <div\n style={{\n position: \"absolute\",\n top: 16,\n left: \"50%\",\n transform: \"translateX(-50%)\",\n background: \"rgba(0,0,0,0.75)\",\n color: \"#fff\",\n padding: \"8px 18px\",\n borderRadius: 8,\n fontSize: 14,\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif',\n pointerEvents: \"none\",\n whiteSpace: \"nowrap\",\n backdropFilter: \"blur(4px)\",\n }}\n >\n Drag to highlight the problem area &nbsp;·&nbsp; Esc to cancel\n </div>\n )}\n\n {rect && phase === \"selecting\" && (\n <div\n style={{\n position: \"absolute\",\n left: rect.x,\n top: rect.y,\n width: rect.w,\n height: rect.h,\n background: \"rgba(255,200,0,0.2)\",\n border: \"2px dashed #f97316\",\n boxSizing: \"border-box\",\n pointerEvents: \"none\",\n }}\n />\n )}\n </div>\n );\n}\n","export { resolveTheme } from \"@diegotsi/flint-core\";\n","import { Flint, type FlintWidgetProps } from \"@diegotsi/flint-core\";\nimport type { eventWithTime } from \"@rrweb/types\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { I18nextProvider, useTranslation } from \"react-i18next\";\nimport { submitReport } from \"./api.js\";\nimport { createConsoleCollector } from \"./collectors/console.js\";\nimport { collectEnvironment } from \"./collectors/environment.js\";\nimport { createFormErrorCollector } from \"./collectors/formErrors.js\";\nimport { createFrustrationCollector } from \"./collectors/frustration.js\";\nimport { createNetworkCollector } from \"./collectors/network.js\";\nimport { FlintModal } from \"./FlintModal.js\";\nimport widgetI18n from \"./i18n/index.js\";\nimport { _setFormErrorCollector, useFlintStore } from \"./store.js\";\nimport { resolveTheme } from \"./theme.js\";\n\nconst REPLAY_WINDOW_MS = 60_000; // rolling 60s replay buffer\n\nexport function FlintWidget(props: FlintWidgetProps) {\n const { locale = \"en-US\" } = props;\n\n useEffect(() => {\n widgetI18n.changeLanguage(locale);\n }, [locale]);\n\n return (\n <I18nextProvider i18n={widgetI18n}>\n <WidgetContent {...props} />\n </I18nextProvider>\n );\n}\n\nfunction WidgetContent({\n projectKey,\n serverUrl,\n user,\n meta,\n extraFields,\n buttonLabel,\n theme = \"dark\",\n zIndex = 9999,\n statusPageUrl,\n datadogSite,\n enableReplay = true,\n enableScreenshot = true,\n enableConsole = true,\n enableNetwork = true,\n enableTextIssues = true,\n enableFormErrors = true,\n enableFrustration = false,\n autoReportFrustration = false,\n onBeforeSubmit,\n onSuccess,\n onError,\n onOpen,\n onClose,\n}: FlintWidgetProps) {\n const globalState = useFlintStore();\n const resolvedUser = user ?? globalState.user;\n const resolvedSessionReplay = extraFields?.sessionReplay ?? globalState.sessionReplay;\n const getExternalReplayUrl = () => {\n // 1. Explicit sessionReplay prop takes priority\n const src = resolvedSessionReplay;\n const explicit = typeof src === \"function\" ? src() : src;\n if (explicit) return explicit;\n\n // 2. Auto-detect Datadog RUM if datadogSite is configured\n if (datadogSite) {\n try {\n const ddRum = (window as unknown as Record<string, unknown>).DD_RUM as\n | { getInternalContext?: () => { session_id?: string } | undefined }\n | undefined;\n const ctx = ddRum?.getInternalContext?.();\n if (ctx?.session_id) {\n const now = Math.floor(Date.now() / 1000);\n const fromTs = now - 30; // 30s before bug report\n const toTs = now + 5; // 5s buffer\n return `https://${datadogSite}/rum/replay/sessions/${ctx.session_id}?from_ts=${fromTs}&to_ts=${toTs}&tab=replay&live=false`;\n }\n } catch {\n // DD_RUM not available or threw — silently skip\n }\n }\n\n return undefined;\n };\n const { t } = useTranslation();\n const [open, setOpen] = useState(false);\n const [hovered, setHovered] = useState(false);\n const pendingSelection = useRef(\"\");\n const colors = resolveTheme(theme);\n\n // ── Selection tooltip ────────────────────────────────────────────────────\n const [selectionTooltip, setSelectionTooltip] = useState<{\n text: string;\n x: number;\n y: number;\n } | null>(null);\n const tooltipRef = useRef<HTMLButtonElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n\n const handleMouseUp = useCallback((e: MouseEvent) => {\n const target = e.target as Node;\n // Ignore clicks inside our own tooltip/trigger or when modal is open\n if (tooltipRef.current?.contains(target)) return;\n if (triggerRef.current?.contains(target)) return;\n\n // Small delay so the browser finalises the selection\n requestAnimationFrame(() => {\n const sel = window.getSelection();\n const text = sel?.toString().trim() ?? \"\";\n if (text.length < 2) {\n setSelectionTooltip(null);\n return;\n }\n\n const range = sel?.getRangeAt(0);\n if (!range) return;\n const rect = range.getBoundingClientRect();\n setSelectionTooltip({\n text,\n x: rect.left + rect.width / 2,\n y: rect.top - 8,\n });\n });\n }, []);\n\n const handleSelectionChange = useCallback(() => {\n const text = window.getSelection()?.toString().trim() ?? \"\";\n if (text.length < 2) setSelectionTooltip(null);\n }, []);\n\n useEffect(() => {\n document.addEventListener(\"mouseup\", handleMouseUp);\n document.addEventListener(\"selectionchange\", handleSelectionChange);\n return () => {\n document.removeEventListener(\"mouseup\", handleMouseUp);\n document.removeEventListener(\"selectionchange\", handleSelectionChange);\n };\n }, [handleMouseUp, handleSelectionChange]);\n\n const openWithSelection = (text: string) => {\n pendingSelection.current = text;\n setSelectionTooltip(null);\n setOpen(true);\n onOpen?.();\n };\n\n // ── Collectors ─────────────────────────────────────────────────────────────\n // If Flint.init() was called, read from the global singleton.\n // Otherwise, create local collectors (backward compat).\n const globalInit = Flint.isInitialized();\n const global = Flint.getInstance();\n\n const consoleCollector = useRef<ReturnType<typeof createConsoleCollector> | null>(null);\n const networkCollector = useRef<ReturnType<typeof createNetworkCollector> | null>(null);\n const replayEvents = useRef<eventWithTime[]>([]);\n const stopReplay = useRef<(() => void) | null>(null);\n const formErrorCollector = useRef<ReturnType<typeof createFormErrorCollector> | null>(null);\n const frustrationCollector = useRef<ReturnType<typeof createFrustrationCollector> | null>(null);\n\n if (!globalInit) {\n if (enableConsole && !consoleCollector.current) {\n consoleCollector.current = createConsoleCollector();\n consoleCollector.current.start();\n }\n if (enableNetwork && !networkCollector.current) {\n const flintHost = (() => {\n try {\n return new URL(serverUrl).hostname;\n } catch {\n return \"\";\n }\n })();\n networkCollector.current = createNetworkCollector(flintHost ? [flintHost] : []);\n networkCollector.current.start();\n }\n if (enableFormErrors && !formErrorCollector.current) {\n formErrorCollector.current = createFormErrorCollector();\n formErrorCollector.current.start();\n _setFormErrorCollector(formErrorCollector.current);\n }\n if (enableFrustration && !frustrationCollector.current) {\n frustrationCollector.current = createFrustrationCollector();\n frustrationCollector.current.start();\n }\n }\n\n useEffect(() => {\n if (globalInit) return;\n let cancelled = false;\n\n if (enableReplay) {\n import(\"rrweb\").then(({ record }) => {\n if (cancelled) return;\n const stopFn = record({\n emit(event) {\n replayEvents.current.push(event);\n const cutoff = Date.now() - REPLAY_WINDOW_MS;\n while (replayEvents.current.length > 0 && replayEvents.current[0].timestamp < cutoff) {\n replayEvents.current.shift();\n }\n },\n });\n stopReplay.current = stopFn ?? null;\n });\n }\n\n return () => {\n cancelled = true;\n consoleCollector.current?.stop();\n networkCollector.current?.stop();\n formErrorCollector.current?.stop();\n _setFormErrorCollector(null);\n frustrationCollector.current?.stop();\n stopReplay.current?.();\n };\n }, [enableReplay, globalInit]);\n\n // ── Auto-report frustration events (only for local collectors) ───────────\n useEffect(() => {\n if (globalInit) return;\n if (!enableFrustration || !autoReportFrustration || !frustrationCollector.current) return;\n\n const unsubscribe = frustrationCollector.current.onFrustration(async (event) => {\n const user = resolvedUser;\n await submitReport(serverUrl, projectKey, {\n reporterId: user?.id ?? \"anonymous\",\n reporterName: user?.name ?? \"Anonymous\",\n reporterEmail: user?.email,\n description: `[Auto-detected] ${event.type.replace(/_/g, \" \")}: ${event.details}`,\n severity: event.type === \"error_loop\" ? \"P1\" : event.type === \"rage_click\" ? \"P2\" : \"P3\",\n url: event.url,\n meta: {\n environment: collectEnvironment(),\n consoleLogs: consoleCollector.current?.getEntries() ?? [],\n networkErrors: networkCollector.current?.getEntries() ?? [],\n formErrors: formErrorCollector.current?.getEntries() ?? [],\n frustrationEvent: event,\n },\n }).catch(() => {});\n });\n\n return unsubscribe;\n }, [enableFrustration, autoReportFrustration, globalInit, projectKey, resolvedUser, serverUrl]);\n\n const label = buttonLabel ?? t(\"buttonLabel\");\n\n return (\n <>\n {/* Floating trigger button */}\n <button\n ref={triggerRef}\n onMouseDown={() => {\n pendingSelection.current = window.getSelection()?.toString().trim() ?? \"\";\n }}\n onClick={() => {\n setOpen(true);\n onOpen?.();\n }}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n aria-label={label}\n style={{\n position: \"fixed\",\n bottom: \"40px\",\n right: \"20px\",\n zIndex: zIndex - 1,\n display: \"flex\",\n alignItems: \"center\",\n gap: \"8px\",\n padding: \"10px 18px\",\n borderRadius: \"24px\",\n border: \"none\",\n background: `linear-gradient(135deg, ${colors.accent}, ${colors.accentHover})`,\n color: colors.buttonText,\n fontSize: \"13px\",\n fontWeight: 600,\n cursor: \"pointer\",\n boxShadow: hovered\n ? `0 0 28px ${colors.accent}55, 0 8px 24px rgba(0,0,0,0.3)`\n : `0 0 16px ${colors.accent}33, 0 4px 16px rgba(0,0,0,0.2)`,\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif',\n transform: hovered ? \"translateY(-2px)\" : \"translateY(0)\",\n transition: \"transform 0.15s ease, box-shadow 0.15s ease\",\n letterSpacing: \"0.01em\",\n }}\n >\n <SparkIcon />\n {label}\n </button>\n\n {/* Selection tooltip */}\n {enableTextIssues && selectionTooltip && !open && (\n <button\n ref={tooltipRef}\n onClick={() => openWithSelection(selectionTooltip.text)}\n style={{\n position: \"fixed\",\n left: Math.max(8, Math.min(selectionTooltip.x - 70, window.innerWidth - 148)),\n top: Math.max(8, selectionTooltip.y - 36),\n zIndex: zIndex + 1,\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n padding: \"6px 12px\",\n borderRadius: 10,\n border: \"none\",\n background: `linear-gradient(135deg, ${colors.accent}, ${colors.accentHover})`,\n color: colors.buttonText,\n fontSize: 12,\n fontWeight: 600,\n cursor: \"pointer\",\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif',\n boxShadow: `0 4px 20px rgba(0,0,0,0.25), 0 0 12px ${colors.accent}40`,\n animation: \"flint-tooltip-in 0.15s ease-out\",\n whiteSpace: \"nowrap\",\n }}\n >\n <TextIcon />\n Report text issue\n </button>\n )}\n\n {/* Tooltip animation */}\n <style>{`\n @keyframes flint-tooltip-in {\n from { opacity: 0; transform: translateY(4px); }\n to { opacity: 1; transform: translateY(0); }\n }\n `}</style>\n\n {/* Modal */}\n {open && (\n <FlintModal\n projectKey={projectKey}\n serverUrl={serverUrl}\n user={resolvedUser}\n meta={meta}\n theme={theme}\n zIndex={zIndex}\n onClose={() => {\n setOpen(false);\n onClose?.();\n pendingSelection.current = \"\";\n }}\n getEnvironment={collectEnvironment}\n getConsoleLogs={() =>\n globalInit ? (global?.console?.getEntries() ?? []) : (consoleCollector.current?.getEntries() ?? [])\n }\n getNetworkErrors={() =>\n globalInit ? (global?.network?.getEntries() ?? []) : (networkCollector.current?.getEntries() ?? [])\n }\n getFormErrors={() =>\n globalInit ? (global?.formErrors?.getEntries() ?? []) : (formErrorCollector.current?.getEntries() ?? [])\n }\n getReplayEvents={() =>\n globalInit ? (Flint.getReplayEvents() as eventWithTime[]) : [...replayEvents.current]\n }\n getExternalReplayUrl={getExternalReplayUrl}\n initialSelection={pendingSelection.current}\n enableScreenshot={enableScreenshot}\n enableTextIssues={enableTextIssues}\n statusPageUrl={statusPageUrl}\n onBeforeSubmit={onBeforeSubmit}\n onSuccess={onSuccess}\n onError={onError}\n />\n )}\n </>\n );\n}\n\nfunction TextIcon() {\n return (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M17 10H3\" />\n <path d=\"M21 6H3\" />\n <path d=\"M21 14H3\" />\n <path d=\"M17 18H3\" />\n </svg>\n );\n}\n\nfunction SparkIcon() {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M13 2L3 14h9l-1 8 10-12h-9l1-8z\" />\n </svg>\n );\n}\n","export { createConsoleCollector } from \"@diegotsi/flint-core\";\n","export { collectEnvironment } from \"@diegotsi/flint-core\";\n","export { createFormErrorCollector } from \"@diegotsi/flint-core\";\n","export { createFrustrationCollector } from \"@diegotsi/flint-core\";\n","export { createNetworkCollector } from \"@diegotsi/flint-core\";\n","import { createInstance } from \"i18next\";\nimport { initReactI18next } from \"react-i18next\";\nimport en from \"./locales/en.json\";\n\nexport const widgetI18n: ReturnType<typeof createInstance> = createInstance();\n\nwidgetI18n.use(initReactI18next).init({\n lng: \"en-US\",\n fallbackLng: \"en-US\",\n resources: { \"en-US\": { translation: en } },\n interpolation: { escapeValue: false },\n initImmediate: false,\n});\n\nexport default widgetI18n;\n","{\n \"buttonLabel\": \"Report bug\",\n \"modalTitle\": \"Report an issue\",\n \"severityLabel\": \"Severity\",\n \"severity_P1_hint\": \"Critical — system down\",\n \"severity_P2_hint\": \"High — core feature broken\",\n \"severity_P3_hint\": \"Medium — noticeable but workable\",\n \"severity_P4_hint\": \"Low — cosmetic or improvement\",\n \"severity_P1_label\": \"Critical\",\n \"severity_P2_label\": \"High\",\n \"severity_P3_label\": \"Medium\",\n \"severity_P4_label\": \"Low\",\n \"whatIsBrokenLabel\": \"What Is Broken\",\n \"whatIsBrokenPlaceholder\": \"1–2 sentences: what is currently happening that should NOT happen.\",\n \"expectedBehaviorLabel\": \"Expected Behavior (optional)\",\n \"expectedBehaviorPlaceholder\": \"Describe exactly what the user should see or receive after the fix.\",\n \"screenshotLabel\": \"Screenshot (optional)\",\n \"screenshotPlaceholder\": \"Click to attach...\",\n \"screenshotAttachFile\": \"Attach file\",\n \"screenshotMarkOnScreen\": \"Mark on screen\",\n \"submitLabel\": \"Submit\",\n \"close\": \"Close\",\n \"successTitle\": \"Bug reported!\",\n \"successDuplicate\": \"Looks like a duplicate of an existing bug.\",\n \"successGitHub\": \"View GitHub issue\",\n \"successSlack\": \"View Slack message\",\n \"replayInfo\": \"No need to record your screen — we automatically capture a session replay when you submit.\",\n \"errorLabel\": \"Failed to submit. Please try again.\",\n \"cancel\": \"Cancel\",\n \"sending\": \"Sending report\",\n \"capturingContext\": \"Capturing context\"\n}\n","import { getSnapshot, subscribe } from \"@diegotsi/flint-core\";\nimport { useSyncExternalStore } from \"react\";\n\nexport { _setFormErrorCollector, Flint, flint } from \"@diegotsi/flint-core\";\n\nexport function useFlintStore() {\n return useSyncExternalStore(subscribe, getSnapshot);\n}\n"],"mappings":"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","names":["useEffect","useRef","useState","jsx","jsxs","useState","useRef","useEffect","Flint","useCallback","useEffect","useRef","useState","useTranslation","Fragment","jsx","jsxs","useEffect","useTranslation","useState","useRef","useCallback","Flint","user","SparkIcon"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@diegotsi/flint-react",
3
- "version": "2.0.1",
3
+ "version": "2.0.2",
4
4
  "description": "Self-contained bug report widget for any React project",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -25,7 +25,7 @@
25
25
  "typecheck": "tsc --noEmit"
26
26
  },
27
27
  "dependencies": {
28
- "@diegotsi/flint-core": "^0.2.0",
28
+ "@diegotsi/flint-core": "workspace:*",
29
29
  "fflate": "^0.8.2",
30
30
  "i18next": "^25.8.13",
31
31
  "modern-screenshot": "^4.6.8",