@diegotsi/flint-react 1.0.1 → 1.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 +443 -31
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +14 -5
- package/dist/index.d.ts +14 -5
- package/dist/index.js +432 -20
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.cjs.map
CHANGED
|
@@ -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/frustration.ts","../src/collectors/network.ts","../src/i18n/index.ts","../src/i18n/locales/en.json","../src/store.ts"],"sourcesContent":["export type {\n FlintUser,\n FlintWidgetProps,\n Locale,\n ReportPayload,\n ReportResult,\n Severity,\n Theme,\n ThemeOverride,\n} from \"@flint/types\";\nexport { FlintModal } from \"./FlintModal.js\";\nexport { FlintWidget } from \"./FlintWidget.js\";\nexport { flint } from \"./store.js\";\n","import type {\n ConsoleEntry,\n EnvironmentInfo,\n FlintUser,\n NetworkEntry,\n ReportPayload,\n ReportResult,\n Severity,\n Theme,\n} from \"@flint/types\";\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 getReplayEvents: () => eventWithTime[];\n getExternalReplayUrl: () => string | undefined;\n initialSelection?: string;\n enableScreenshot?: 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 getReplayEvents,\n getExternalReplayUrl,\n initialSelection = \"\",\n enableScreenshot = 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\">(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 };\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 <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 {/* 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 \"@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 · 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 \"@flint/core\";\n","import type { FlintWidgetProps } from \"@flint/types\";\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 { createFrustrationCollector } from \"./collectors/frustration.js\";\nimport { createNetworkCollector } from \"./collectors/network.js\";\nimport { FlintModal } from \"./FlintModal.js\";\nimport widgetI18n from \"./i18n/index.js\";\nimport { 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 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 // Start synchronously so window.fetch is patched before React effects run,\n // ensuring the admin's initial API requests are captured.\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\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\n const frustrationCollector = useRef<ReturnType<typeof createFrustrationCollector> | null>(null);\n\n if (enableFrustration && !frustrationCollector.current) {\n frustrationCollector.current = createFrustrationCollector();\n frustrationCollector.current.start();\n }\n\n useEffect(() => {\n let cancelled = false;\n\n if (enableReplay) {\n // Lazy-load rrweb only when replay is enabled\n import(\"rrweb\").then(({ record }) => {\n if (cancelled) return;\n const stopFn = record({\n emit(event) {\n replayEvents.current.push(event);\n // Trim to rolling window\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 frustrationCollector.current?.stop();\n stopReplay.current?.();\n };\n }, [enableReplay]);\n\n // ── Auto-report frustration events ────────────────────────────────────────\n useEffect(() => {\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 frustrationEvent: event,\n },\n }).catch(() => {});\n });\n\n return unsubscribe;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [enableFrustration, autoReportFrustration]);\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 {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={() => consoleCollector.current?.getEntries() ?? []}\n getNetworkErrors={() => networkCollector.current?.getEntries() ?? []}\n getReplayEvents={() => [...replayEvents.current]}\n getExternalReplayUrl={getExternalReplayUrl}\n initialSelection={pendingSelection.current}\n enableScreenshot={enableScreenshot}\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 \"@flint/core\";\n","export { collectEnvironment } from \"@flint/core\";\n","export { createFrustrationCollector } from \"@flint/core\";\n","export { createNetworkCollector } from \"@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 { flint, getSnapshot, subscribe } from \"@flint/core\";\nimport { useSyncExternalStore } from \"react\";\n\nexport { flint } from \"@flint/core\";\n\nexport function useFlintStore() {\n return useSyncExternalStore(subscribe, getSnapshot);\n}\n"],"mappings":"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","names":["import_react","import_core","import_jsx_runtime","import_react","import_react_i18next","import_core","import_core","import_core","import_core","import_react_i18next","import_core","import_react","import_jsx_runtime","user","SparkIcon"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/FlintModal.tsx","../../core/src/api.ts","../../core/src/collectors/console.ts","../../core/src/collectors/environment.ts","../../core/src/collectors/frustration.ts","../../core/src/collectors/network.ts","../../core/src/store.ts","../../core/src/theme.ts","../src/ScreenAnnotator.tsx","../src/FlintWidget.tsx","../src/i18n/index.ts","../src/i18n/locales/en.json","../src/store.ts"],"sourcesContent":["export type {\n FlintUser,\n FlintWidgetProps,\n Locale,\n ReportPayload,\n ReportResult,\n Severity,\n Theme,\n ThemeOverride,\n} from \"@flint/types\";\nexport { FlintModal } from \"./FlintModal.js\";\nexport { FlintWidget } from \"./FlintWidget.js\";\nexport { flint } from \"./store.js\";\n","import type {\n ConsoleEntry,\n EnvironmentInfo,\n FlintUser,\n NetworkEntry,\n ReportPayload,\n ReportResult,\n Severity,\n Theme,\n} from \"@flint/types\";\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 getReplayEvents: () => eventWithTime[];\n getExternalReplayUrl: () => string | undefined;\n initialSelection?: string;\n enableScreenshot?: 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 getReplayEvents,\n getExternalReplayUrl,\n initialSelection = \"\",\n enableScreenshot = 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\">(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 };\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 <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 {/* 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","import type { ReportPayload, ReportResult } from \"./types.js\";\nimport { gzipSync } from \"fflate\";\n\nasync function fetchWithRetry(url: string, init: RequestInit, retries = 3, baseDelay = 1000): Promise<Response> {\n for (let attempt = 0; attempt <= retries; attempt++) {\n try {\n const res = await fetch(url, init);\n if (res.ok || attempt === retries) return res;\n // Don't retry client errors (4xx) except 429\n if (res.status >= 400 && res.status < 500 && res.status !== 429) return res;\n } catch (err) {\n if (attempt === retries) throw err;\n }\n await new Promise((r) => setTimeout(r, baseDelay * 2 ** attempt));\n }\n throw new Error(\"Max retries exceeded\");\n}\n\nexport async function submitReport(\n serverUrl: string,\n projectKey: string,\n payload: ReportPayload,\n screenshot?: File,\n): Promise<ReportResult> {\n const url = `${serverUrl.replace(/\\/$/, \"\")}/api/v1/bug-reports`;\n\n let body: BodyInit;\n const headers: Record<string, string> = {\n \"x-project-key\": projectKey,\n };\n\n if (screenshot) {\n const form = new FormData();\n form.append(\"reporterId\", payload.reporterId);\n form.append(\"reporterName\", payload.reporterName);\n if (payload.reporterEmail) form.append(\"reporterEmail\", payload.reporterEmail);\n form.append(\"description\", payload.description);\n if (payload.expectedBehavior) form.append(\"expectedBehavior\", payload.expectedBehavior);\n if (payload.stepsToReproduce) form.append(\"stepsToReproduce\", JSON.stringify(payload.stepsToReproduce));\n if (payload.externalReplayUrl) form.append(\"externalReplayUrl\", payload.externalReplayUrl);\n if (payload.additionalContext) form.append(\"additionalContext\", payload.additionalContext);\n form.append(\"severity\", payload.severity);\n if (payload.url) form.append(\"url\", payload.url);\n if (payload.meta) form.append(\"meta\", JSON.stringify(payload.meta));\n form.append(\"screenshot\", screenshot);\n body = form;\n } else {\n body = JSON.stringify(payload);\n headers[\"Content-Type\"] = \"application/json\";\n }\n\n const res = await fetchWithRetry(url, { method: \"POST\", headers, body });\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({ error: \"Unknown error\" }));\n throw new Error((err as { error?: string }).error ?? `HTTP ${res.status}`);\n }\n\n return res.json() as Promise<ReportResult>;\n}\n\nexport async function submitReplay(\n serverUrl: string,\n projectKey: string,\n reportId: string,\n events: unknown[],\n): Promise<void> {\n const json = JSON.stringify(events);\n const encoded = new TextEncoder().encode(json);\n const compressed = gzipSync(encoded);\n\n const url = `${serverUrl.replace(/\\/$/, \"\")}/api/v1/bug-reports/${reportId}/replay`;\n await fetch(url, {\n method: \"POST\",\n headers: {\n \"x-project-key\": projectKey,\n \"Content-Type\": \"application/octet-stream\",\n },\n body: compressed.buffer as ArrayBuffer,\n });\n}\n","import type { ConsoleEntry } from \"../types.js\";\n\nconst MAX_ENTRIES = 50;\n\nexport interface ConsoleCollector {\n start(): void;\n stop(): void;\n getEntries(): ConsoleEntry[];\n}\n\nexport function createConsoleCollector(): ConsoleCollector {\n const entries: ConsoleEntry[] = [];\n let active = false;\n\n const originals = {\n log: console.log.bind(console),\n warn: console.warn.bind(console),\n error: console.error.bind(console),\n };\n\n let origOnerror: typeof window.onerror = null;\n let origUnhandled: typeof window.onunhandledrejection = null;\n\n function push(level: ConsoleEntry[\"level\"], args: unknown[]) {\n let str: string;\n try {\n str = args.map((a) => (typeof a === \"string\" ? a : JSON.stringify(a))).join(\" \");\n } catch {\n str = String(args[0]);\n }\n if (str.length > 500) str = str.slice(0, 500) + \"\\u2026\";\n entries.push({ level, args: str, timestamp: Date.now() });\n if (entries.length > MAX_ENTRIES) entries.shift();\n }\n\n return {\n start() {\n if (active) return;\n active = true;\n\n console.log = (...args: unknown[]) => {\n push(\"log\", args);\n originals.log(...args);\n };\n console.warn = (...args: unknown[]) => {\n push(\"warn\", args);\n originals.warn(...args);\n };\n console.error = (...args: unknown[]) => {\n push(\"error\", args);\n originals.error(...args);\n };\n\n origOnerror = window.onerror;\n window.onerror = (msg, src, line, col, err) => {\n push(\"error\", [err?.message ?? String(msg), `${src}:${line}:${col}`]);\n if (typeof origOnerror === \"function\") return origOnerror(msg, src, line, col, err);\n return false;\n };\n\n origUnhandled = window.onunhandledrejection;\n window.onunhandledrejection = (event) => {\n const reason = event.reason instanceof Error ? event.reason.message : JSON.stringify(event.reason);\n push(\"error\", [\"UnhandledRejection:\", reason]);\n if (typeof origUnhandled === \"function\") origUnhandled.call(window, event);\n };\n },\n\n stop() {\n if (!active) return;\n active = false;\n console.log = originals.log;\n console.warn = originals.warn;\n console.error = originals.error;\n window.onerror = origOnerror;\n window.onunhandledrejection = origUnhandled;\n },\n\n getEntries() {\n return [...entries];\n },\n };\n}\n","import type { EnvironmentInfo } from \"../types.js\";\n\nexport function collectEnvironment(): EnvironmentInfo {\n const ua = navigator.userAgent;\n\n // -- Browser --\n let browser = \"Unknown\";\n const chromeM = ua.match(/Chrome\\/(\\d+)/);\n const firefoxM = ua.match(/Firefox\\/(\\d+)/);\n const edgeM = ua.match(/Edg\\/(\\d+)/);\n const safariM = ua.match(/Version\\/(\\d+)/);\n const operaM = ua.match(/OPR\\/(\\d+)/);\n\n if (operaM) {\n browser = `Opera ${operaM[1]}`;\n } else if (edgeM) {\n browser = `Edge ${edgeM[1]}`;\n } else if (chromeM && !/Edg|OPR/.test(ua)) {\n browser = `Chrome ${chromeM[1]}`;\n } else if (firefoxM) {\n browser = `Firefox ${firefoxM[1]}`;\n } else if (safariM && /Safari\\//.test(ua)) {\n browser = `Safari ${safariM[1]}`;\n }\n\n // -- OS --\n let os = \"Unknown\";\n const macM = ua.match(/Mac OS X (\\d+[._]\\d+)/);\n const winM = ua.match(/Windows NT (\\d+\\.\\d+)/);\n const androidM = ua.match(/Android (\\d+)/);\n const iosM = ua.match(/iPhone OS (\\d+[._]\\d+)/);\n\n if (macM) {\n os = `macOS ${macM[1].replace(\"_\", \".\")}`;\n } else if (winM) {\n const winMap: Record<string, string> = {\n \"10.0\": \"10/11\",\n \"6.3\": \"8.1\",\n \"6.2\": \"8\",\n \"6.1\": \"7\",\n };\n os = `Windows ${winMap[winM[1]] ?? winM[1]}`;\n } else if (androidM) {\n os = `Android ${androidM[1]}`;\n } else if (iosM) {\n os = `iOS ${iosM[1].replace(/_/g, \".\")}`;\n } else if (/Linux/.test(ua)) {\n os = \"Linux\";\n }\n\n return {\n browser,\n os,\n viewport: `${window.innerWidth}x${window.innerHeight}`,\n screen: `${screen.width}x${screen.height}`,\n language: navigator.language,\n timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n online: navigator.onLine,\n };\n}\n","export interface FrustrationEvent {\n type: \"rage_click\" | \"dead_click\" | \"error_loop\";\n timestamp: number;\n target: string;\n details: string;\n url: string;\n}\n\nexport interface FrustrationCollector {\n start(): void;\n stop(): void;\n getEvents(): FrustrationEvent[];\n onFrustration(callback: (event: FrustrationEvent) => void): () => void;\n}\n\nexport function createFrustrationCollector(opts?: {\n rageClickThreshold?: number;\n rageClickWindow?: number;\n errorLoopThreshold?: number;\n errorLoopWindow?: number;\n enableDeadClicks?: boolean;\n}): FrustrationCollector {\n const threshold = opts?.rageClickThreshold ?? 3;\n const window = opts?.rageClickWindow ?? 500;\n const errorThreshold = opts?.errorLoopThreshold ?? 3;\n const errorWindow = opts?.errorLoopWindow ?? 30_000;\n const deadClicksEnabled = opts?.enableDeadClicks ?? true;\n\n const events: FrustrationEvent[] = [];\n const listeners = new Set<(event: FrustrationEvent) => void>();\n const clickHistory: { target: EventTarget | null; time: number }[] = [];\n const errorCounts = new Map<string, { count: number; firstSeen: number }>();\n let clickHandler: ((e: MouseEvent) => void) | null = null;\n let origConsoleError: typeof console.error | null = null;\n\n function emit(event: FrustrationEvent) {\n events.push(event);\n if (events.length > 50) events.shift();\n for (const cb of listeners) cb(event);\n }\n\n function getCSSSelector(el: Element): string {\n if (el.id) return `#${el.id}`;\n const tag = el.tagName.toLowerCase();\n const cls = [...el.classList].slice(0, 3).join(\".\");\n if (cls) return `${tag}.${cls}`;\n return tag;\n }\n\n function isInteractive(el: HTMLElement): boolean {\n const tag = el.tagName.toLowerCase();\n if ([\"a\", \"button\", \"input\", \"select\", \"textarea\", \"label\", \"summary\"].includes(tag)) return true;\n if (el.getAttribute(\"role\") === \"button\" || el.getAttribute(\"tabindex\")) return true;\n if (el.onclick || el.getAttribute(\"onclick\")) return true;\n if (el.closest(\"a, button, [role=button], [onclick]\")) return true;\n try {\n if (getComputedStyle(el).cursor === \"pointer\") return true;\n } catch {\n /* getComputedStyle may throw */\n }\n return false;\n }\n\n function handleClick(e: MouseEvent) {\n const target = e.target as HTMLElement;\n if (!target) return;\n const now = Date.now();\n\n // --- Rage click detection ---\n clickHistory.push({ target, time: now });\n // Remove old clicks\n while (clickHistory.length > 0 && now - clickHistory[0].time > 1000) {\n clickHistory.shift();\n }\n const recentOnSame = clickHistory.filter((c) => c.target === target && now - c.time < window);\n if (recentOnSame.length >= threshold) {\n emit({\n type: \"rage_click\",\n timestamp: now,\n target: getCSSSelector(target),\n details: `${recentOnSame.length} clicks in ${now - recentOnSame[0].time}ms`,\n url: globalThis.location?.href ?? \"\",\n });\n clickHistory.length = 0;\n }\n\n // --- Dead click detection ---\n if (deadClicksEnabled && !isInteractive(target)) {\n emit({\n type: \"dead_click\",\n timestamp: now,\n target: getCSSSelector(target),\n details: `Click on non-interactive <${target.tagName.toLowerCase()}>`,\n url: globalThis.location?.href ?? \"\",\n });\n }\n }\n\n function patchConsoleError() {\n origConsoleError = console.error;\n console.error = (...args: unknown[]) => {\n origConsoleError?.apply(console, args);\n // Check for error loop\n const key = String(args[0]).slice(0, 100);\n const now = Date.now();\n const existing = errorCounts.get(key);\n if (existing && now - existing.firstSeen < errorWindow) {\n existing.count++;\n if (existing.count >= errorThreshold) {\n emit({\n type: \"error_loop\",\n timestamp: now,\n target: \"console\",\n details: `Same error ${existing.count}x in ${Math.round((now - existing.firstSeen) / 1000)}s: ${key}`,\n url: globalThis.location?.href ?? \"\",\n });\n errorCounts.delete(key);\n }\n } else {\n errorCounts.set(key, { count: 1, firstSeen: now });\n }\n };\n }\n\n return {\n start() {\n clickHandler = handleClick;\n document.addEventListener(\"click\", clickHandler, true);\n patchConsoleError();\n },\n stop() {\n if (clickHandler) document.removeEventListener(\"click\", clickHandler, true);\n if (origConsoleError) console.error = origConsoleError;\n clickHistory.length = 0;\n errorCounts.clear();\n },\n getEvents() {\n return [...events];\n },\n onFrustration(callback) {\n listeners.add(callback);\n return () => listeners.delete(callback);\n },\n };\n}\n","import type { NetworkEntry } from \"../types.js\";\n\nconst MAX_ENTRIES = 50;\n\nconst BLOCKED_HOSTS = new Set([\n \"browser-intake-datadoghq.com\",\n \"rum.browser-intake-datadoghq.com\",\n \"logs.browser-intake-datadoghq.com\",\n \"session-replay.browser-intake-datadoghq.com\",\n]);\n\nfunction isBlockedUrl(url: string, extra: Set<string>): boolean {\n try {\n const host = new URL(url, location.href).hostname;\n const all = [...BLOCKED_HOSTS, ...extra];\n return all.some((b) => host === b || host.endsWith(\".\" + b));\n } catch {\n return false;\n }\n}\n\nexport interface NetworkCollector {\n start(): void;\n stop(): void;\n getEntries(): NetworkEntry[];\n}\n\nfunction truncateUrl(url: string): string {\n try {\n const u = new URL(url, location.href);\n const base = `${u.origin}${u.pathname}`;\n return base.length > 200 ? base.slice(0, 200) + \"\\u2026\" : base;\n } catch {\n return url.length > 200 ? url.slice(0, 200) + \"\\u2026\" : url;\n }\n}\n\nexport function createNetworkCollector(extraBlockedHosts: string[] = []): NetworkCollector {\n const entries: NetworkEntry[] = [];\n const blocked = new Set(extraBlockedHosts);\n let origFetch: typeof window.fetch | null = null;\n let origXHROpen: typeof XMLHttpRequest.prototype.open | null = null;\n let active = false;\n\n function push(entry: NetworkEntry) {\n entries.push(entry);\n if (entries.length > MAX_ENTRIES) entries.shift();\n }\n\n return {\n start() {\n if (active) return;\n active = true;\n\n // -- Patch fetch --\n origFetch = window.fetch;\n window.fetch = async (input: RequestInfo | URL, init?: RequestInit): Promise<Response> => {\n const method = ((init?.method ?? \"GET\") as string).toUpperCase();\n const url = typeof input === \"string\" ? input : input instanceof URL ? input.href : (input as Request).url;\n const startTime = Date.now();\n const res = await origFetch!.call(window, input, init);\n if (res.status >= 400 && !isBlockedUrl(url, blocked)) {\n push({\n method,\n url: truncateUrl(url),\n status: res.status,\n duration: Date.now() - startTime,\n timestamp: startTime,\n });\n }\n return res;\n };\n\n // -- Patch XHR --\n origXHROpen = XMLHttpRequest.prototype.open;\n XMLHttpRequest.prototype.open = function (\n method: string,\n url: string | URL,\n async?: boolean,\n username?: string | null,\n password?: string | null,\n ) {\n const startTime = Date.now();\n const urlStr = typeof url === \"string\" ? url : (url as URL).href;\n\n this.addEventListener(\"load\", () => {\n if (this.status >= 400 && !isBlockedUrl(urlStr, blocked)) {\n push({\n method: method.toUpperCase(),\n url: truncateUrl(urlStr),\n status: this.status,\n duration: Date.now() - startTime,\n timestamp: startTime,\n });\n }\n });\n\n return origXHROpen!.apply(this, [method, url, async ?? true, username, password] as Parameters<\n typeof XMLHttpRequest.prototype.open\n >);\n };\n },\n\n stop() {\n if (!active) return;\n active = false;\n if (origFetch) window.fetch = origFetch;\n if (origXHROpen) XMLHttpRequest.prototype.open = origXHROpen;\n },\n\n getEntries() {\n return [...entries];\n },\n };\n}\n","import type { FlintUser } from \"./types.js\";\n\nexport interface FlintState {\n user: FlintUser | undefined;\n sessionReplay: string | (() => string) | undefined;\n}\n\nlet state: FlintState = { user: undefined, sessionReplay: undefined };\nconst listeners = new Set<() => void>();\n\nfunction emit() {\n for (const l of listeners) l();\n}\n\nexport function subscribe(listener: () => void) {\n listeners.add(listener);\n return () => listeners.delete(listener);\n}\n\nexport function getSnapshot(): FlintState {\n return state;\n}\n\nexport const flint = {\n setUser(user: FlintUser | null) {\n state = { ...state, user: user ?? undefined };\n emit();\n },\n setSessionReplay(url: string | (() => string) | null) {\n state = { ...state, sessionReplay: url ?? undefined };\n emit();\n },\n};\n","import type { Theme, ThemeOverride } from \"./types.js\";\n\nexport interface ResolvedTheme {\n background: string;\n backgroundSecondary: string;\n accent: string;\n accentHover: string;\n text: string;\n textMuted: string;\n border: string;\n shadow: string;\n buttonText: string;\n backdropFilter: string;\n}\n\nconst light: ResolvedTheme = {\n background: \"rgba(255,255,255,0.90)\",\n backgroundSecondary: \"rgba(249,250,251,0.75)\",\n accent: \"#2563eb\",\n accentHover: \"#1d4ed8\",\n text: \"#111827\",\n textMuted: \"#6b7280\",\n border: \"rgba(255,255,255,0.9)\",\n shadow: \"0 32px 80px rgba(0,0,0,0.18), 0 8px 32px rgba(0,0,0,0.1), 0 0 0 1px rgba(0,0,0,0.04)\",\n buttonText: \"#ffffff\",\n backdropFilter: \"blur(32px) saturate(1.8)\",\n};\n\nconst dark: ResolvedTheme = {\n background: \"rgba(15,20,35,0.88)\",\n backgroundSecondary: \"rgba(5,8,18,0.65)\",\n accent: \"#4d8aff\",\n accentHover: \"#3b6fdb\",\n text: \"#dde3ef\",\n textMuted: \"#6b7a93\",\n border: \"rgba(255,255,255,0.08)\",\n shadow: \"0 24px 60px rgba(0,0,0,0.6), 0 0 0 1px rgba(255,255,255,0.04)\",\n buttonText: \"#ffffff\",\n backdropFilter: \"blur(32px) saturate(1.6)\",\n};\n\nexport function resolveTheme(theme: Theme): ResolvedTheme {\n if (theme === \"dark\") return dark;\n if (theme === \"light\") return light;\n // ThemeOverride — merge over light base\n const override = theme as ThemeOverride;\n return {\n ...light,\n background: override.background ?? light.background,\n accent: override.accent ?? light.accent,\n accentHover: override.accent ?? light.accentHover,\n text: override.text ?? light.text,\n border: override.border ?? light.border,\n };\n}\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 · 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","import type { FlintWidgetProps } from \"@flint/types\";\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 { createFrustrationCollector } from \"./collectors/frustration.js\";\nimport { createNetworkCollector } from \"./collectors/network.js\";\nimport { FlintModal } from \"./FlintModal.js\";\nimport widgetI18n from \"./i18n/index.js\";\nimport { 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 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 // Start synchronously so window.fetch is patched before React effects run,\n // ensuring the admin's initial API requests are captured.\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\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\n const frustrationCollector = useRef<ReturnType<typeof createFrustrationCollector> | null>(null);\n\n if (enableFrustration && !frustrationCollector.current) {\n frustrationCollector.current = createFrustrationCollector();\n frustrationCollector.current.start();\n }\n\n useEffect(() => {\n let cancelled = false;\n\n if (enableReplay) {\n // Lazy-load rrweb only when replay is enabled\n import(\"rrweb\").then(({ record }) => {\n if (cancelled) return;\n const stopFn = record({\n emit(event) {\n replayEvents.current.push(event);\n // Trim to rolling window\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 frustrationCollector.current?.stop();\n stopReplay.current?.();\n };\n }, [enableReplay]);\n\n // ── Auto-report frustration events ────────────────────────────────────────\n useEffect(() => {\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 frustrationEvent: event,\n },\n }).catch(() => {});\n });\n\n return unsubscribe;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [enableFrustration, autoReportFrustration]);\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 {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={() => consoleCollector.current?.getEntries() ?? []}\n getNetworkErrors={() => networkCollector.current?.getEntries() ?? []}\n getReplayEvents={() => [...replayEvents.current]}\n getExternalReplayUrl={getExternalReplayUrl}\n initialSelection={pendingSelection.current}\n enableScreenshot={enableScreenshot}\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","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 { flint, getSnapshot, subscribe } from \"@flint/core\";\nimport { useSyncExternalStore } from \"react\";\n\nexport { flint } from \"@flint/core\";\n\nexport function useFlintStore() {\n return useSyncExternalStore(subscribe, getSnapshot);\n}\n"],"mappings":"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","names":["import_react","window","listeners","emit","MAX_ENTRIES","import_jsx_runtime","import_react","import_react_i18next","import_react_i18next","import_react","import_jsx_runtime","user","SparkIcon"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
-
export { flint } from '@flint/core';
|
|
3
2
|
|
|
4
3
|
type Severity = "P1" | "P2" | "P3" | "P4";
|
|
5
4
|
interface EnvironmentInfo {
|
|
@@ -31,7 +30,7 @@ interface ThemeOverride {
|
|
|
31
30
|
text?: string;
|
|
32
31
|
border?: string;
|
|
33
32
|
}
|
|
34
|
-
interface FlintUser {
|
|
33
|
+
interface FlintUser$1 {
|
|
35
34
|
id: string;
|
|
36
35
|
name: string;
|
|
37
36
|
email?: string;
|
|
@@ -47,7 +46,7 @@ interface FlintWidgetProps {
|
|
|
47
46
|
/** Full URL of the flint-server, e.g. "https://bugs.example.com" */
|
|
48
47
|
serverUrl: string;
|
|
49
48
|
/** Authenticated user info (optional) */
|
|
50
|
-
user?: FlintUser;
|
|
49
|
+
user?: FlintUser$1;
|
|
51
50
|
/** Arbitrary metadata to attach to every report */
|
|
52
51
|
meta?: Record<string, unknown>;
|
|
53
52
|
/** Extra fields for developer use (e.g. external session replay URL) */
|
|
@@ -538,7 +537,7 @@ declare global {
|
|
|
538
537
|
interface Props {
|
|
539
538
|
projectKey: string;
|
|
540
539
|
serverUrl: string;
|
|
541
|
-
user?: FlintUser;
|
|
540
|
+
user?: FlintUser$1;
|
|
542
541
|
meta?: Record<string, unknown>;
|
|
543
542
|
theme: Theme;
|
|
544
543
|
zIndex: number;
|
|
@@ -559,4 +558,14 @@ declare function FlintModal({ projectKey, serverUrl, user, meta, theme, zIndex,
|
|
|
559
558
|
|
|
560
559
|
declare function FlintWidget(props: FlintWidgetProps): react_jsx_runtime.JSX.Element;
|
|
561
560
|
|
|
562
|
-
|
|
561
|
+
interface FlintUser {
|
|
562
|
+
id: string;
|
|
563
|
+
name: string;
|
|
564
|
+
email?: string;
|
|
565
|
+
}
|
|
566
|
+
declare const flint: {
|
|
567
|
+
setUser(user: FlintUser | null): void;
|
|
568
|
+
setSessionReplay(url: string | (() => string) | null): void;
|
|
569
|
+
};
|
|
570
|
+
|
|
571
|
+
export { FlintModal, type FlintUser$1 as FlintUser, FlintWidget, type FlintWidgetProps, type Locale, type ReportPayload, type ReportResult, type Severity, type Theme, type ThemeOverride, flint };
|