@diegotsi/flint-react 2.9.0 → 2.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -71,6 +71,52 @@ Pass a `ThemeOverride` object to fine-tune colors:
71
71
  | P3 | Medium — noticeable but workable |
72
72
  | P4 | Low — cosmetic or improvement |
73
73
 
74
+ ## Error monitoring
75
+
76
+ When you initialize the SDK, uncaught errors and unhandled promise rejections are
77
+ captured automatically and grouped by fingerprint on the server. They show up in
78
+ the admin's **Errors** page with occurrence trends, breadcrumbs (recent console
79
+ logs + failed requests), and resolve/ignore triage.
80
+
81
+ ```tsx
82
+ import { Flint } from "@diegotsi/flint-react"
83
+
84
+ Flint.init({
85
+ projectKey: "your-project-api-key",
86
+ serverUrl: "https://your-flint-server.com",
87
+ release: "v1.2.3", // enables regression detection and source maps
88
+ })
89
+ ```
90
+
91
+ Capture is on by default and storm-safe: per-error throttling (10/min),
92
+ in-batch dedup, a per-page cap, secret redaction, and a built-in ignore list
93
+ (`Script error.`, ResizeObserver noise, browser-extension frames). Events are
94
+ flushed in batches and via `sendBeacon` on page unload.
95
+
96
+ | Option | Default | Description |
97
+ |--------|---------|-------------|
98
+ | `enableErrorMonitoring` | `true` | Turn automatic capture off entirely |
99
+ | `errorMonitoring.sampleRate` | `1.0` | Fraction of captured errors to report (0–1) |
100
+ | `errorMonitoring.ignoreErrors` | — | `(string \| RegExp)[]` matched against the message; matches are dropped |
101
+ | `errorMonitoring.beforeSend` | — | `(event) => event \| null` — scrub fields or drop the event |
102
+
103
+ Server-side, projects can also define ignore rules (Errors page → "Ignore
104
+ rules") that drop matching events at ingest.
105
+
106
+ ### Source maps
107
+
108
+ Errors arrive with minified stacks. Upload each bundle's source map after a
109
+ deploy and the admin shows the original frames (with a raw toggle):
110
+
111
+ ```bash
112
+ curl -X POST -H "X-Project-Key: $FLINT_KEY" \
113
+ --data-binary @dist/assets/index-9f3a.js.map \
114
+ "https://your-flint-server.com/api/v1/sourcemaps?release=v1.2.3&file=index-9f3a.js"
115
+ ```
116
+
117
+ `release` must match the value passed to `Flint.init`; `file` is the bundle's
118
+ basename, which is how stack frames are matched to their map.
119
+
74
120
  ## Development
75
121
 
76
122
  ```bash
package/dist/index.cjs CHANGED
@@ -377,6 +377,12 @@ function FlintModal({
377
377
  setResult(res);
378
378
  setStatus("success");
379
379
  onSuccess?.(res);
380
+ (0, import_flint_core3.trackDatadogBugReported)({
381
+ bugId: res.id,
382
+ severity: payload.severity,
383
+ url: payload.url,
384
+ title: payload.description.slice(0, 120)
385
+ });
380
386
  const events = getReplayEvents();
381
387
  if (events.length > 0) {
382
388
  (0, import_flint_core.submitReplay)(serverUrl, projectKey, res.id, events).catch(() => {
@@ -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/environment.ts","../src/i18n/index.ts","../src/i18n/locales/en.json","../src/store.ts"],"sourcesContent":["export type {\n FlintConfig,\n FlintUser,\n FlintWidgetProps,\n Locale,\n ReportPayload,\n ReportResult,\n Severity,\n Theme,\n ThemeOverride,\n} from \"@diegotsi/flint-core\";\nexport { FlintModal } from \"./FlintModal.js\";\nexport { FlintWidget } from \"./FlintWidget.js\";\nexport { Flint } from \"./store.js\";\n","import {\n type ConsoleEntry,\n type EnvironmentInfo,\n Flint,\n type FlintUser,\n type FormErrorEntry,\n type NetworkEntry,\n type ReportPayload,\n type ReportResult,\n type Severity,\n type Theme,\n} from \"@diegotsi/flint-core\";\nimport type { eventWithTime } from \"@rrweb/types\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { submitReplay, submitReport } from \"./api.js\";\nimport { ScreenAnnotator } from \"./ScreenAnnotator.js\";\nimport { resolveTheme } from \"./theme.js\";\n\ninterface Props {\n user?: FlintUser;\n meta?: Record<string, unknown>;\n theme: Theme;\n zIndex: number;\n onClose: () => void;\n getEnvironment: () => EnvironmentInfo;\n getConsoleLogs: () => ConsoleEntry[];\n getNetworkErrors: () => NetworkEntry[];\n getFormErrors: () => FormErrorEntry[];\n getReplayEvents: () => eventWithTime[];\n getExternalReplayUrl: () => string | undefined;\n initialSelection?: string;\n enableScreenshot?: boolean;\n enableTextIssues?: boolean;\n enableFeatureRequests?: 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 user,\n meta,\n theme,\n zIndex,\n onClose,\n getEnvironment,\n getConsoleLogs,\n getNetworkErrors,\n getFormErrors,\n getReplayEvents,\n getExternalReplayUrl,\n initialSelection = \"\",\n enableScreenshot = true,\n enableTextIssues = true,\n enableFeatureRequests = false,\n statusPageUrl,\n onBeforeSubmit,\n onSuccess,\n onError,\n}: Props) {\n const config = Flint.getConfig()!;\n const { projectKey, serverUrl } = config;\n const { t } = useTranslation();\n const colors = resolveTheme(theme);\n const isDark = theme === \"dark\";\n\n // Reporter identity: prop > localStorage > empty\n const needsIdentity = !user;\n const [reporterName, setReporterName] = useState(() => {\n if (user?.name) return user.name;\n try {\n return localStorage.getItem(\"flint_reporter_name\") ?? \"\";\n } catch {\n return \"\";\n }\n });\n const [reporterEmail, setReporterEmail] = useState(() => {\n if (user?.email) return user.email;\n try {\n return localStorage.getItem(\"flint_reporter_email\") ?? \"\";\n } catch {\n return \"\";\n }\n });\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 // Wizard step: selector screen → form screen\n // Skip selector if: text issue with initial selection, or no alternative modes enabled\n const hasInitialSelection = enableTextIssues && !!initialSelection;\n const hasMultipleModes = enableTextIssues || enableFeatureRequests;\n const [step, setStep] = useState<\"selector\" | \"form\">(hasInitialSelection || !hasMultipleModes ? \"form\" : \"selector\");\n const [mode, setMode] = useState<\"bug\" | \"text\" | \"feature\">(hasInitialSelection ? \"text\" : \"bug\");\n const [textOriginal, setTextOriginal] = useState(initialSelection);\n const [textSuggested, setTextSuggested] = useState(\"\");\n\n // Feature request mode\n const [featureDescription, setFeatureDescription] = useState(\"\");\n const [featureUseCase, setFeatureUseCase] = 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 const isFeature = mode === \"feature\";\n if (isText) {\n if (!textOriginal.trim() || !textSuggested.trim()) return;\n } else if (isFeature) {\n if (!featureDescription.trim()) return;\n } else {\n if (!description.trim()) return;\n }\n\n setStatus(\"submitting\");\n setErrorMsg(\"\");\n\n const collectedMeta: Record<string, unknown> = {\n ...meta,\n environment: getEnvironment(),\n consoleLogs: getConsoleLogs(),\n networkErrors: getNetworkErrors(),\n formErrors: getFormErrors(),\n };\n\n if (isText) {\n collectedMeta.textIssue = {\n original: textOriginal.trim(),\n suggested: textSuggested.trim(),\n lang: textLang,\n };\n }\n\n if (isFeature) {\n collectedMeta.featureRequest = {\n useCase: featureUseCase.trim(),\n };\n }\n\n // Save reporter identity to localStorage for next time\n if (needsIdentity) {\n try {\n if (reporterName.trim()) localStorage.setItem(\"flint_reporter_name\", reporterName.trim());\n if (reporterEmail.trim()) localStorage.setItem(\"flint_reporter_email\", reporterEmail.trim());\n } catch {\n /* localStorage unavailable */\n }\n }\n\n const payload: ReportPayload = {\n reporterId: user?.id ?? (reporterEmail.trim() || \"anonymous\"),\n reporterName: user?.name ?? (reporterName.trim() || \"Anonymous\"),\n reporterEmail: user?.email ?? (reporterEmail.trim() || undefined),\n reporterExtraAttributes: user?.extraAttributes,\n description: isFeature\n ? featureDescription.trim()\n : isText\n ? `[Text issue] \"${textOriginal.trim()}\" → \"${textSuggested.trim()}\"`\n : description.trim(),\n expectedBehavior: !isText && !isFeature ? expectedBehavior.trim() || undefined : undefined,\n externalReplayUrl: getExternalReplayUrl() || undefined,\n severity: isText || isFeature ? \"P3\" : severity,\n url: window.location.href,\n meta: collectedMeta,\n label: isText ? \"TEXT\" : isFeature ? \"FEATURE\" : undefined,\n source: isFeature ? \"feature_request\" : isText ? \"text_issue\" : \"widget\",\n type: isFeature ? \"FEATURE_REQUEST\" : \"BUG\",\n appVersion: config.appVersion,\n release: config.release,\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(\n serverUrl,\n projectKey,\n payload,\n !isText && !isFeature ? (screenshot ?? undefined) : undefined,\n );\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 {/* ── Step 1: Selector screen ──────────────────────────────── */}\n {step === \"selector\" && (\n <>\n {/* Reporter identity */}\n {needsIdentity && (\n <div style={{ display: \"flex\", gap: 10, marginBottom: 18 }}>\n <div style={{ flex: 1 }}>\n <FieldLabel colors={colors} htmlFor=\"flint-reporter-name\">\n {t(\"nameLabel\", \"Your name\")}\n </FieldLabel>\n <input\n id=\"flint-reporter-name\"\n type=\"text\"\n style={inputStyle}\n value={reporterName}\n onChange={(e) => setReporterName(e.target.value)}\n placeholder=\"Jane Doe\"\n />\n </div>\n <div style={{ flex: 1 }}>\n <FieldLabel colors={colors} htmlFor=\"flint-reporter-email\">\n {t(\"emailLabel\", \"Email\")}\n </FieldLabel>\n <input\n id=\"flint-reporter-email\"\n type=\"email\"\n style={inputStyle}\n value={reporterEmail}\n onChange={(e) => setReporterEmail(e.target.value)}\n placeholder=\"jane@company.com\"\n />\n </div>\n </div>\n )}\n\n {/* Type selector buttons */}\n <FieldLabel colors={colors}>What would you like to report?</FieldLabel>\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 8, marginBottom: 16 }}>\n <TypeSelectorButton\n emoji=\"🐛\"\n title=\"Bug Report\"\n subtitle=\"Something isn't working\"\n colors={colors}\n inputBorder={inputBorder}\n onClick={() => {\n setMode(\"bug\");\n setStep(\"form\");\n }}\n />\n {enableFeatureRequests && (\n <TypeSelectorButton\n emoji=\"💡\"\n title=\"Feature Request / Improvement\"\n subtitle=\"I have an idea or suggestion\"\n colors={colors}\n inputBorder={inputBorder}\n onClick={() => {\n setMode(\"feature\");\n setStep(\"form\");\n }}\n />\n )}\n {enableTextIssues && (\n <TypeSelectorButton\n emoji=\"✏️\"\n title=\"Text Issue\"\n subtitle=\"There's a text or translation problem\"\n colors={colors}\n inputBorder={inputBorder}\n onClick={() => {\n setMode(\"text\");\n setStep(\"form\");\n }}\n />\n )}\n </div>\n\n {/* Cancel */}\n <button\n type=\"button\"\n onClick={onClose}\n style={{\n width: \"100%\",\n padding: \"10px\",\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 </>\n )}\n\n {/* ── Step 2: Form screen ──────────────────────────────────── */}\n {step === \"form\" && (\n <>\n {/* Back button */}\n {!hasInitialSelection && (\n <button\n type=\"button\"\n onClick={() => setStep(\"selector\")}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 4,\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n fontSize: 13,\n fontWeight: 600,\n color: colors.textMuted,\n fontFamily: \"inherit\",\n padding: \"0 0 12px\",\n marginBottom: 4,\n }}\n >\n ← {mode === \"bug\" ? \"🐛 Bug Report\" : mode === \"feature\" ? \"💡 Feature Request\" : \"✏️ Text Issue\"}\n </button>\n )}\n\n {/* Text issue fields */}\n {mode === \"text\" && (\n <>\n <div style={{ marginBottom: 14 }}>\n <FieldLabel colors={colors} htmlFor=\"flint-text-original\">\n Original text\n </FieldLabel>\n <textarea\n id=\"flint-text-original\"\n style={{ ...inputStyle, resize: \"vertical\", minHeight: 60 }}\n value={textOriginal}\n onChange={(e) => setTextOriginal(e.target.value)}\n placeholder=\"Text that is wrong on screen…\"\n required\n />\n </div>\n <div style={{ marginBottom: 14 }}>\n <FieldLabel colors={colors} htmlFor=\"flint-text-suggested\">\n Suggested correction\n </FieldLabel>\n <textarea\n id=\"flint-text-suggested\"\n style={{ ...inputStyle, resize: \"vertical\", minHeight: 60 }}\n value={textSuggested}\n onChange={(e) => setTextSuggested(e.target.value)}\n placeholder=\"How it should read…\"\n required\n />\n </div>\n <div style={{ marginBottom: 20 }}>\n <FieldLabel colors={colors} htmlFor=\"flint-text-lang\">\n Language\n </FieldLabel>\n <select\n id=\"flint-text-lang\"\n value={textLang}\n onChange={(e) => setTextLang(e.target.value)}\n style={{\n ...inputStyle,\n appearance: \"none\",\n cursor: \"pointer\",\n }}\n >\n <option value=\"en\">English (en)</option>\n <option value=\"he\">עברית (he)</option>\n </select>\n </div>\n </>\n )}\n\n {/* Feature request fields */}\n {mode === \"feature\" && (\n <>\n <div style={{ marginBottom: 14 }}>\n <FieldLabel colors={colors} htmlFor=\"flint-feature-description\">\n Description\n </FieldLabel>\n <textarea\n id=\"flint-feature-description\"\n style={{ ...inputStyle, resize: \"vertical\", minHeight: 80 }}\n value={featureDescription}\n onChange={(e) => setFeatureDescription(e.target.value)}\n placeholder=\"Describe the feature you'd like to see...\"\n required\n />\n </div>\n <div style={{ marginBottom: 20 }}>\n <FieldLabel colors={colors} htmlFor=\"flint-feature-usecase\">\n Use case\n </FieldLabel>\n <textarea\n id=\"flint-feature-usecase\"\n style={{ ...inputStyle, resize: \"vertical\", minHeight: 72 }}\n value={featureUseCase}\n onChange={(e) => setFeatureUseCase(e.target.value)}\n placeholder=\"What problem would this solve for you?\"\n />\n </div>\n </>\n )}\n\n {/* Severity */}\n <div\n style={{ marginBottom: 18, display: mode === \"text\" || mode === \"feature\" ? \"none\" : undefined }}\n >\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\n style={{\n marginBottom: 20,\n display: mode === \"text\" || mode === \"feature\" || !enableScreenshot ? \"none\" : undefined,\n }}\n >\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={{\n height: 60,\n borderRadius: 8,\n objectFit: \"cover\",\n border: `1px solid ${inputBorder}`,\n }}\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 </>\n )}\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 TypeSelectorButton({\n emoji,\n title,\n subtitle,\n colors,\n inputBorder,\n onClick,\n}: {\n emoji: string;\n title: string;\n subtitle: string;\n colors: { backgroundSecondary: string; text: string; textMuted: string; accent: string };\n inputBorder: string;\n onClick: () => void;\n}) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 14,\n padding: \"14px 16px\",\n borderRadius: 12,\n border: `1px solid ${inputBorder}`,\n background: colors.backgroundSecondary,\n cursor: \"pointer\",\n fontFamily: \"inherit\",\n textAlign: \"left\",\n transition: \"border-color 0.15s, box-shadow 0.15s\",\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.borderColor = colors.accent;\n e.currentTarget.style.boxShadow = `0 0 0 1px ${colors.accent}40`;\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.borderColor = inputBorder;\n e.currentTarget.style.boxShadow = \"none\";\n }}\n >\n <span style={{ fontSize: 24, lineHeight: 1, flexShrink: 0 }}>{emoji}</span>\n <div>\n <div style={{ fontSize: 14, fontWeight: 600, color: colors.text, marginBottom: 2 }}>{title}</div>\n <div style={{ fontSize: 12, color: colors.textMuted }}>{subtitle}</div>\n </div>\n <span style={{ marginLeft: \"auto\", fontSize: 16, color: colors.textMuted, flexShrink: 0 }}>→</span>\n </button>\n );\n}\n\nfunction SeverityButton({ sev, label, selected, hint, color, accent, border, bg, text, onClick }: SevBtnProps) {\n return (\n <button\n type=\"button\"\n title={hint}\n onClick={onClick}\n style={{\n padding: \"9px 6px 8px\",\n borderRadius: 10,\n border: selected ? `2px solid ${accent}` : `1.5px solid ${border}`,\n background: selected ? `${accent}15` : bg,\n cursor: \"pointer\",\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n gap: 5,\n transition: \"border-color 0.12s, background 0.12s\",\n fontFamily: \"inherit\",\n }}\n >\n <span style={{ width: 8, height: 8, borderRadius: \"50%\", background: color, display: \"block\" }} />\n <span\n style={{\n fontSize: 13,\n fontWeight: selected ? 700 : 500,\n color: selected ? accent : text,\n letterSpacing: \"0.02em\",\n }}\n >\n {sev}\n </span>\n <span style={{ fontSize: 11, color: selected ? accent : text, opacity: 0.6, letterSpacing: \"0.02em\" }}>\n {label}\n </span>\n </button>\n );\n}\n\nfunction SparkIcon({ color = \"currentColor\", size = 14 }: { color?: string; size?: number }) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke={color}\n strokeWidth=\"2.2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M13 2L3 14h9l-1 8 10-12h-9l1-8z\" />\n </svg>\n );\n}\n\nfunction CheckIcon({ size = 20 }: { size?: number }) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"#22c55e\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n );\n}\n","export { submitReplay, submitReport } from \"@diegotsi/flint-core\";\n","import { domToCanvas } from \"modern-screenshot\";\nimport { useEffect, useRef, useState } from \"react\";\n\ninterface Props {\n zIndex: number;\n onCapture: (file: File) => void;\n onCancel: () => void;\n}\n\ntype Phase = \"idle\" | \"selecting\" | \"capturing\";\n\ninterface Rect {\n x: number;\n y: number;\n w: number;\n h: number;\n}\n\nfunction normalizeRect(startX: number, startY: number, endX: number, endY: number): Rect {\n return {\n x: Math.min(startX, endX),\n y: Math.min(startY, endY),\n w: Math.abs(endX - startX),\n h: Math.abs(endY - startY),\n };\n}\n\nexport function ScreenAnnotator({ zIndex, onCapture, onCancel }: Props) {\n const [phase, setPhase] = useState<Phase>(\"idle\");\n const [rect, setRect] = useState<Rect | null>(null);\n const startRef = useRef<{ x: number; y: number } | null>(null);\n const overlayRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") onCancel();\n };\n window.addEventListener(\"keydown\", onKey);\n return () => window.removeEventListener(\"keydown\", onKey);\n }, [onCancel]);\n\n const onMouseDown = (e: React.MouseEvent) => {\n e.preventDefault();\n startRef.current = { x: e.clientX, y: e.clientY };\n setPhase(\"selecting\");\n setRect({ x: e.clientX, y: e.clientY, w: 0, h: 0 });\n };\n\n const onMouseMove = (e: React.MouseEvent) => {\n if (phase !== \"selecting\" || !startRef.current) return;\n setRect(normalizeRect(startRef.current.x, startRef.current.y, e.clientX, e.clientY));\n };\n\n const onMouseUp = async (e: React.MouseEvent) => {\n if (phase !== \"selecting\" || !startRef.current) return;\n const finalRect = normalizeRect(startRef.current.x, startRef.current.y, e.clientX, e.clientY);\n startRef.current = null;\n\n if (finalRect.w < 5 || finalRect.h < 5) {\n setPhase(\"idle\");\n setRect(null);\n return;\n }\n\n setPhase(\"capturing\");\n\n const dpr = window.devicePixelRatio ?? 1;\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n\n // Wait for React to re-render + browser to paint so the overlay disappears\n await new Promise<void>((resolve) => requestAnimationFrame(() => requestAnimationFrame(() => resolve())));\n\n try {\n // Capture the visible viewport using modern-screenshot.\n // It clones only the visible area when width/height match the viewport.\n const fullCanvas = await domToCanvas(document.documentElement, {\n scale: dpr,\n width: vw,\n height: vh,\n style: {\n transform: `translate(-${window.scrollX}px, -${window.scrollY}px)`,\n },\n filter: (el) => el !== overlayRef.current,\n });\n\n // Crop canvas to viewport size (domToCanvas may produce a larger canvas)\n const canvas = document.createElement(\"canvas\");\n canvas.width = vw * dpr;\n canvas.height = vh * dpr;\n const ctx = canvas.getContext(\"2d\")!;\n ctx.drawImage(fullCanvas, 0, 0, vw * dpr, vh * dpr, 0, 0, vw * dpr, vh * dpr);\n\n // Draw annotation highlight — clientX/Y are viewport-relative\n ctx.fillStyle = \"rgba(255,200,0,0.25)\";\n ctx.fillRect(finalRect.x * dpr, finalRect.y * dpr, finalRect.w * dpr, finalRect.h * dpr);\n ctx.strokeStyle = \"#f97316\";\n ctx.lineWidth = 3 * dpr;\n ctx.strokeRect(finalRect.x * dpr, finalRect.y * dpr, finalRect.w * dpr, finalRect.h * dpr);\n\n canvas.toBlob((blob: Blob | null) => {\n if (blob) {\n onCapture(new File([blob], \"annotation.png\", { type: \"image/png\" }));\n } else {\n onCancel();\n }\n }, \"image/png\");\n } catch (err) {\n console.error(\"[Flint] ScreenAnnotator capture failed:\", err);\n onCancel();\n }\n };\n\n const isCapturing = phase === \"capturing\";\n\n return (\n <div\n ref={overlayRef}\n onMouseDown={onMouseDown}\n onMouseMove={onMouseMove}\n onMouseUp={onMouseUp}\n style={{\n position: \"fixed\",\n inset: 0,\n zIndex,\n cursor: isCapturing ? \"default\" : \"crosshair\",\n userSelect: \"none\",\n background: phase === \"selecting\" ? \"rgba(0,0,0,0.15)\" : \"rgba(0,0,0,0.05)\",\n transition: \"background 0.1s\",\n opacity: isCapturing ? 0 : 1,\n pointerEvents: isCapturing ? \"none\" : \"auto\",\n }}\n >\n {!isCapturing && (\n <div\n style={{\n position: \"absolute\",\n top: 16,\n left: \"50%\",\n transform: \"translateX(-50%)\",\n background: \"rgba(0,0,0,0.75)\",\n color: \"#fff\",\n padding: \"8px 18px\",\n borderRadius: 8,\n fontSize: 14,\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif',\n pointerEvents: \"none\",\n whiteSpace: \"nowrap\",\n backdropFilter: \"blur(4px)\",\n }}\n >\n Drag to highlight the problem area &nbsp;·&nbsp; Esc to cancel\n </div>\n )}\n\n {rect && phase === \"selecting\" && (\n <div\n style={{\n position: \"absolute\",\n left: rect.x,\n top: rect.y,\n width: rect.w,\n height: rect.h,\n background: \"rgba(255,200,0,0.2)\",\n border: \"2px dashed #f97316\",\n boxSizing: \"border-box\",\n pointerEvents: \"none\",\n }}\n />\n )}\n </div>\n );\n}\n","export { resolveTheme } from \"@diegotsi/flint-core\";\n","import { Flint, type FlintWidgetProps } from \"@diegotsi/flint-core\";\nimport type { eventWithTime } from \"@rrweb/types\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { I18nextProvider, useTranslation } from \"react-i18next\";\nimport { collectEnvironment } from \"./collectors/environment.js\";\nimport { FlintModal } from \"./FlintModal.js\";\nimport widgetI18n from \"./i18n/index.js\";\nimport { useFlintStore } from \"./store.js\";\nimport { resolveTheme } from \"./theme.js\";\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 buttonLabel,\n theme = \"dark\",\n zIndex = 9999,\n statusPageUrl,\n enableScreenshot = true,\n enableTextIssues = true,\n enableFeatureRequests = false,\n onBeforeSubmit,\n onSuccess,\n onError,\n onOpen,\n onClose,\n}: FlintWidgetProps) {\n // Flint.init() must be called before mounting the widget\n if (!Flint.isInitialized()) {\n throw new Error(\"[Flint] Call Flint.init() before mounting <FlintWidget />.\");\n }\n\n const config = Flint.getConfig()!;\n const globalState = useFlintStore();\n const resolvedUser = globalState.user ?? config.user;\n\n const { t } = useTranslation();\n const bugTimestamp = useRef(0);\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 bugTimestamp.current = Date.now();\n setOpen(true);\n onOpen?.();\n };\n\n // ── Inject rrweb replay recorder if not already initialized ─────────────\n const didInjectReplay = useRef(false);\n if (!didInjectReplay.current && config.enableReplay && !Flint.getInstance()?.stopReplay) {\n // The widget auto-injects the rrweb recorder when enableReplay is configured\n // but no _replayRecorder was provided (e.g. user called Flint.init without it)\n didInjectReplay.current = true;\n }\n\n const global = Flint.getInstance();\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 bugTimestamp.current = Date.now();\n setOpen(true);\n onOpen?.();\n }}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n aria-label={label}\n style={{\n position: \"fixed\",\n bottom: \"40px\",\n right: \"20px\",\n zIndex: zIndex - 1,\n display: \"flex\",\n alignItems: \"center\",\n gap: \"8px\",\n padding: \"10px 18px\",\n borderRadius: \"24px\",\n border: \"none\",\n background: `linear-gradient(135deg, ${colors.accent}, ${colors.accentHover})`,\n color: colors.buttonText,\n fontSize: \"13px\",\n fontWeight: 600,\n cursor: \"pointer\",\n boxShadow: hovered\n ? `0 0 28px ${colors.accent}55, 0 8px 24px rgba(0,0,0,0.3)`\n : `0 0 16px ${colors.accent}33, 0 4px 16px rgba(0,0,0,0.2)`,\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif',\n transform: hovered ? \"translateY(-2px)\" : \"translateY(0)\",\n transition: \"transform 0.15s ease, box-shadow 0.15s ease\",\n letterSpacing: \"0.01em\",\n }}\n >\n <SparkIcon />\n {label}\n </button>\n\n {/* Selection tooltip */}\n {enableTextIssues && selectionTooltip && !open && (\n <button\n ref={tooltipRef}\n onClick={() => openWithSelection(selectionTooltip.text)}\n style={{\n position: \"fixed\",\n left: Math.max(8, Math.min(selectionTooltip.x - 70, window.innerWidth - 148)),\n top: Math.max(8, selectionTooltip.y - 36),\n zIndex: zIndex + 1,\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n padding: \"6px 12px\",\n borderRadius: 10,\n border: \"none\",\n background: `linear-gradient(135deg, ${colors.accent}, ${colors.accentHover})`,\n color: colors.buttonText,\n fontSize: 12,\n fontWeight: 600,\n cursor: \"pointer\",\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif',\n boxShadow: `0 4px 20px rgba(0,0,0,0.25), 0 0 12px ${colors.accent}40`,\n animation: \"flint-tooltip-in 0.15s ease-out\",\n whiteSpace: \"nowrap\",\n }}\n >\n <TextIcon />\n Report text issue\n </button>\n )}\n\n {/* Tooltip animation */}\n <style>{`\n @keyframes flint-tooltip-in {\n from { opacity: 0; transform: translateY(4px); }\n to { opacity: 1; transform: translateY(0); }\n }\n `}</style>\n\n {/* Modal */}\n {open && (\n <FlintModal\n user={resolvedUser}\n meta={config.meta}\n theme={theme}\n zIndex={zIndex}\n onClose={() => {\n setOpen(false);\n onClose?.();\n pendingSelection.current = \"\";\n }}\n getEnvironment={collectEnvironment}\n getConsoleLogs={() => global?.console?.getEntries() ?? []}\n getNetworkErrors={() => global?.network?.getEntries() ?? []}\n getFormErrors={() => global?.formErrors?.getEntries() ?? []}\n getReplayEvents={() => Flint.getReplayEvents() as eventWithTime[]}\n getExternalReplayUrl={() => Flint.getExternalReplayUrl()}\n initialSelection={pendingSelection.current}\n enableScreenshot={enableScreenshot}\n enableTextIssues={enableTextIssues}\n enableFeatureRequests={enableFeatureRequests}\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 { collectEnvironment } from \"@diegotsi/flint-core\";\n","import { createInstance } from \"i18next\";\nimport { initReactI18next } from \"react-i18next\";\nimport en from \"./locales/en.json\";\n\nexport const widgetI18n: ReturnType<typeof createInstance> = createInstance();\n\nwidgetI18n.use(initReactI18next).init({\n lng: \"en-US\",\n fallbackLng: \"en-US\",\n resources: { \"en-US\": { translation: en } },\n interpolation: { escapeValue: false },\n initImmediate: false,\n showSupportNotice: false,\n});\n\nexport default widgetI18n;\n","{\n \"buttonLabel\": \"Report bug\",\n \"modalTitle\": \"Report an issue\",\n \"severityLabel\": \"Severity\",\n \"severity_P1_hint\": \"Critical — system down\",\n \"severity_P2_hint\": \"High — core feature broken\",\n \"severity_P3_hint\": \"Medium — noticeable but workable\",\n \"severity_P4_hint\": \"Low — cosmetic or improvement\",\n \"severity_P1_label\": \"Critical\",\n \"severity_P2_label\": \"High\",\n \"severity_P3_label\": \"Medium\",\n \"severity_P4_label\": \"Low\",\n \"whatIsBrokenLabel\": \"What Is Broken\",\n \"whatIsBrokenPlaceholder\": \"1–2 sentences: what is currently happening that should NOT happen.\",\n \"expectedBehaviorLabel\": \"Expected Behavior (optional)\",\n \"expectedBehaviorPlaceholder\": \"Describe exactly what the user should see or receive after the fix.\",\n \"screenshotLabel\": \"Screenshot (optional)\",\n \"screenshotPlaceholder\": \"Click to attach...\",\n \"screenshotAttachFile\": \"Attach file\",\n \"screenshotMarkOnScreen\": \"Mark on screen\",\n \"submitLabel\": \"Submit\",\n \"close\": \"Close\",\n \"successTitle\": \"Bug reported!\",\n \"successDuplicate\": \"Looks like a duplicate of an existing bug.\",\n \"successGitHub\": \"View GitHub issue\",\n \"successSlack\": \"View Slack message\",\n \"replayInfo\": \"No need to record your screen — we automatically capture a session replay when you submit.\",\n \"errorLabel\": \"Failed to submit. Please try again.\",\n \"cancel\": \"Cancel\",\n \"sending\": \"Sending report\",\n \"capturingContext\": \"Capturing context\"\n}\n","import { getSnapshot, subscribe } from \"@diegotsi/flint-core\";\nimport { useSyncExternalStore } from \"react\";\n\nexport { _setFormErrorCollector, Flint } from \"@diegotsi/flint-core\";\n\nexport function useFlintStore() {\n return useSyncExternalStore(subscribe, getSnapshot);\n}\n"],"mappings":"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","names":["import_flint_core","import_react","import_flint_core","import_jsx_runtime","import_flint_core","import_react","import_react_i18next","import_flint_core","import_react_i18next","import_flint_core","import_react","import_jsx_runtime","SparkIcon"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/FlintModal.tsx","../src/api.ts","../src/ScreenAnnotator.tsx","../src/theme.ts","../src/FlintWidget.tsx","../src/collectors/environment.ts","../src/i18n/index.ts","../src/i18n/locales/en.json","../src/store.ts"],"sourcesContent":["export type {\n FlintConfig,\n FlintUser,\n FlintWidgetProps,\n Locale,\n ReportPayload,\n ReportResult,\n Severity,\n Theme,\n ThemeOverride,\n} from \"@diegotsi/flint-core\";\nexport { FlintModal } from \"./FlintModal.js\";\nexport { FlintWidget } from \"./FlintWidget.js\";\nexport { Flint } from \"./store.js\";\n","import {\n type ConsoleEntry,\n type EnvironmentInfo,\n Flint,\n type FlintUser,\n type FormErrorEntry,\n type NetworkEntry,\n type ReportPayload,\n type ReportResult,\n type Severity,\n type Theme,\n trackDatadogBugReported,\n} from \"@diegotsi/flint-core\";\nimport type { eventWithTime } from \"@rrweb/types\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { submitReplay, submitReport } from \"./api.js\";\nimport { ScreenAnnotator } from \"./ScreenAnnotator.js\";\nimport { resolveTheme } from \"./theme.js\";\n\ninterface Props {\n user?: FlintUser;\n meta?: Record<string, unknown>;\n theme: Theme;\n zIndex: number;\n onClose: () => void;\n getEnvironment: () => EnvironmentInfo;\n getConsoleLogs: () => ConsoleEntry[];\n getNetworkErrors: () => NetworkEntry[];\n getFormErrors: () => FormErrorEntry[];\n getReplayEvents: () => eventWithTime[];\n getExternalReplayUrl: () => string | undefined;\n initialSelection?: string;\n enableScreenshot?: boolean;\n enableTextIssues?: boolean;\n enableFeatureRequests?: 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 user,\n meta,\n theme,\n zIndex,\n onClose,\n getEnvironment,\n getConsoleLogs,\n getNetworkErrors,\n getFormErrors,\n getReplayEvents,\n getExternalReplayUrl,\n initialSelection = \"\",\n enableScreenshot = true,\n enableTextIssues = true,\n enableFeatureRequests = false,\n statusPageUrl,\n onBeforeSubmit,\n onSuccess,\n onError,\n}: Props) {\n const config = Flint.getConfig()!;\n const { projectKey, serverUrl } = config;\n const { t } = useTranslation();\n const colors = resolveTheme(theme);\n const isDark = theme === \"dark\";\n\n // Reporter identity: prop > localStorage > empty\n const needsIdentity = !user;\n const [reporterName, setReporterName] = useState(() => {\n if (user?.name) return user.name;\n try {\n return localStorage.getItem(\"flint_reporter_name\") ?? \"\";\n } catch {\n return \"\";\n }\n });\n const [reporterEmail, setReporterEmail] = useState(() => {\n if (user?.email) return user.email;\n try {\n return localStorage.getItem(\"flint_reporter_email\") ?? \"\";\n } catch {\n return \"\";\n }\n });\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 // Wizard step: selector screen → form screen\n // Skip selector if: text issue with initial selection, or no alternative modes enabled\n const hasInitialSelection = enableTextIssues && !!initialSelection;\n const hasMultipleModes = enableTextIssues || enableFeatureRequests;\n const [step, setStep] = useState<\"selector\" | \"form\">(hasInitialSelection || !hasMultipleModes ? \"form\" : \"selector\");\n const [mode, setMode] = useState<\"bug\" | \"text\" | \"feature\">(hasInitialSelection ? \"text\" : \"bug\");\n const [textOriginal, setTextOriginal] = useState(initialSelection);\n const [textSuggested, setTextSuggested] = useState(\"\");\n\n // Feature request mode\n const [featureDescription, setFeatureDescription] = useState(\"\");\n const [featureUseCase, setFeatureUseCase] = 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 const isFeature = mode === \"feature\";\n if (isText) {\n if (!textOriginal.trim() || !textSuggested.trim()) return;\n } else if (isFeature) {\n if (!featureDescription.trim()) return;\n } else {\n if (!description.trim()) return;\n }\n\n setStatus(\"submitting\");\n setErrorMsg(\"\");\n\n const collectedMeta: Record<string, unknown> = {\n ...meta,\n environment: getEnvironment(),\n consoleLogs: getConsoleLogs(),\n networkErrors: getNetworkErrors(),\n formErrors: getFormErrors(),\n };\n\n if (isText) {\n collectedMeta.textIssue = {\n original: textOriginal.trim(),\n suggested: textSuggested.trim(),\n lang: textLang,\n };\n }\n\n if (isFeature) {\n collectedMeta.featureRequest = {\n useCase: featureUseCase.trim(),\n };\n }\n\n // Save reporter identity to localStorage for next time\n if (needsIdentity) {\n try {\n if (reporterName.trim()) localStorage.setItem(\"flint_reporter_name\", reporterName.trim());\n if (reporterEmail.trim()) localStorage.setItem(\"flint_reporter_email\", reporterEmail.trim());\n } catch {\n /* localStorage unavailable */\n }\n }\n\n const payload: ReportPayload = {\n reporterId: user?.id ?? (reporterEmail.trim() || \"anonymous\"),\n reporterName: user?.name ?? (reporterName.trim() || \"Anonymous\"),\n reporterEmail: user?.email ?? (reporterEmail.trim() || undefined),\n reporterExtraAttributes: user?.extraAttributes,\n description: isFeature\n ? featureDescription.trim()\n : isText\n ? `[Text issue] \"${textOriginal.trim()}\" → \"${textSuggested.trim()}\"`\n : description.trim(),\n expectedBehavior: !isText && !isFeature ? expectedBehavior.trim() || undefined : undefined,\n externalReplayUrl: getExternalReplayUrl() || undefined,\n severity: isText || isFeature ? \"P3\" : severity,\n url: window.location.href,\n meta: collectedMeta,\n label: isText ? \"TEXT\" : isFeature ? \"FEATURE\" : undefined,\n source: isFeature ? \"feature_request\" : isText ? \"text_issue\" : \"widget\",\n type: isFeature ? \"FEATURE_REQUEST\" : \"BUG\",\n appVersion: config.appVersion,\n release: config.release,\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(\n serverUrl,\n projectKey,\n payload,\n !isText && !isFeature ? (screenshot ?? undefined) : undefined,\n );\n setResult(res);\n setStatus(\"success\");\n onSuccess?.(res);\n\n // Drop a marker on the Datadog RUM Session Replay timeline at the report\n // moment (no-op when Datadog RUM isn't on the page).\n trackDatadogBugReported({\n bugId: res.id,\n severity: payload.severity,\n url: payload.url,\n title: payload.description.slice(0, 120),\n });\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 {/* ── Step 1: Selector screen ──────────────────────────────── */}\n {step === \"selector\" && (\n <>\n {/* Reporter identity */}\n {needsIdentity && (\n <div style={{ display: \"flex\", gap: 10, marginBottom: 18 }}>\n <div style={{ flex: 1 }}>\n <FieldLabel colors={colors} htmlFor=\"flint-reporter-name\">\n {t(\"nameLabel\", \"Your name\")}\n </FieldLabel>\n <input\n id=\"flint-reporter-name\"\n type=\"text\"\n style={inputStyle}\n value={reporterName}\n onChange={(e) => setReporterName(e.target.value)}\n placeholder=\"Jane Doe\"\n />\n </div>\n <div style={{ flex: 1 }}>\n <FieldLabel colors={colors} htmlFor=\"flint-reporter-email\">\n {t(\"emailLabel\", \"Email\")}\n </FieldLabel>\n <input\n id=\"flint-reporter-email\"\n type=\"email\"\n style={inputStyle}\n value={reporterEmail}\n onChange={(e) => setReporterEmail(e.target.value)}\n placeholder=\"jane@company.com\"\n />\n </div>\n </div>\n )}\n\n {/* Type selector buttons */}\n <FieldLabel colors={colors}>What would you like to report?</FieldLabel>\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 8, marginBottom: 16 }}>\n <TypeSelectorButton\n emoji=\"🐛\"\n title=\"Bug Report\"\n subtitle=\"Something isn't working\"\n colors={colors}\n inputBorder={inputBorder}\n onClick={() => {\n setMode(\"bug\");\n setStep(\"form\");\n }}\n />\n {enableFeatureRequests && (\n <TypeSelectorButton\n emoji=\"💡\"\n title=\"Feature Request / Improvement\"\n subtitle=\"I have an idea or suggestion\"\n colors={colors}\n inputBorder={inputBorder}\n onClick={() => {\n setMode(\"feature\");\n setStep(\"form\");\n }}\n />\n )}\n {enableTextIssues && (\n <TypeSelectorButton\n emoji=\"✏️\"\n title=\"Text Issue\"\n subtitle=\"There's a text or translation problem\"\n colors={colors}\n inputBorder={inputBorder}\n onClick={() => {\n setMode(\"text\");\n setStep(\"form\");\n }}\n />\n )}\n </div>\n\n {/* Cancel */}\n <button\n type=\"button\"\n onClick={onClose}\n style={{\n width: \"100%\",\n padding: \"10px\",\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 </>\n )}\n\n {/* ── Step 2: Form screen ──────────────────────────────────── */}\n {step === \"form\" && (\n <>\n {/* Back button */}\n {!hasInitialSelection && (\n <button\n type=\"button\"\n onClick={() => setStep(\"selector\")}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 4,\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n fontSize: 13,\n fontWeight: 600,\n color: colors.textMuted,\n fontFamily: \"inherit\",\n padding: \"0 0 12px\",\n marginBottom: 4,\n }}\n >\n ← {mode === \"bug\" ? \"🐛 Bug Report\" : mode === \"feature\" ? \"💡 Feature Request\" : \"✏️ Text Issue\"}\n </button>\n )}\n\n {/* Text issue fields */}\n {mode === \"text\" && (\n <>\n <div style={{ marginBottom: 14 }}>\n <FieldLabel colors={colors} htmlFor=\"flint-text-original\">\n Original text\n </FieldLabel>\n <textarea\n id=\"flint-text-original\"\n style={{ ...inputStyle, resize: \"vertical\", minHeight: 60 }}\n value={textOriginal}\n onChange={(e) => setTextOriginal(e.target.value)}\n placeholder=\"Text that is wrong on screen…\"\n required\n />\n </div>\n <div style={{ marginBottom: 14 }}>\n <FieldLabel colors={colors} htmlFor=\"flint-text-suggested\">\n Suggested correction\n </FieldLabel>\n <textarea\n id=\"flint-text-suggested\"\n style={{ ...inputStyle, resize: \"vertical\", minHeight: 60 }}\n value={textSuggested}\n onChange={(e) => setTextSuggested(e.target.value)}\n placeholder=\"How it should read…\"\n required\n />\n </div>\n <div style={{ marginBottom: 20 }}>\n <FieldLabel colors={colors} htmlFor=\"flint-text-lang\">\n Language\n </FieldLabel>\n <select\n id=\"flint-text-lang\"\n value={textLang}\n onChange={(e) => setTextLang(e.target.value)}\n style={{\n ...inputStyle,\n appearance: \"none\",\n cursor: \"pointer\",\n }}\n >\n <option value=\"en\">English (en)</option>\n <option value=\"he\">עברית (he)</option>\n </select>\n </div>\n </>\n )}\n\n {/* Feature request fields */}\n {mode === \"feature\" && (\n <>\n <div style={{ marginBottom: 14 }}>\n <FieldLabel colors={colors} htmlFor=\"flint-feature-description\">\n Description\n </FieldLabel>\n <textarea\n id=\"flint-feature-description\"\n style={{ ...inputStyle, resize: \"vertical\", minHeight: 80 }}\n value={featureDescription}\n onChange={(e) => setFeatureDescription(e.target.value)}\n placeholder=\"Describe the feature you'd like to see...\"\n required\n />\n </div>\n <div style={{ marginBottom: 20 }}>\n <FieldLabel colors={colors} htmlFor=\"flint-feature-usecase\">\n Use case\n </FieldLabel>\n <textarea\n id=\"flint-feature-usecase\"\n style={{ ...inputStyle, resize: \"vertical\", minHeight: 72 }}\n value={featureUseCase}\n onChange={(e) => setFeatureUseCase(e.target.value)}\n placeholder=\"What problem would this solve for you?\"\n />\n </div>\n </>\n )}\n\n {/* Severity */}\n <div\n style={{ marginBottom: 18, display: mode === \"text\" || mode === \"feature\" ? \"none\" : undefined }}\n >\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\n style={{\n marginBottom: 20,\n display: mode === \"text\" || mode === \"feature\" || !enableScreenshot ? \"none\" : undefined,\n }}\n >\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={{\n height: 60,\n borderRadius: 8,\n objectFit: \"cover\",\n border: `1px solid ${inputBorder}`,\n }}\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 </>\n )}\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 TypeSelectorButton({\n emoji,\n title,\n subtitle,\n colors,\n inputBorder,\n onClick,\n}: {\n emoji: string;\n title: string;\n subtitle: string;\n colors: { backgroundSecondary: string; text: string; textMuted: string; accent: string };\n inputBorder: string;\n onClick: () => void;\n}) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 14,\n padding: \"14px 16px\",\n borderRadius: 12,\n border: `1px solid ${inputBorder}`,\n background: colors.backgroundSecondary,\n cursor: \"pointer\",\n fontFamily: \"inherit\",\n textAlign: \"left\",\n transition: \"border-color 0.15s, box-shadow 0.15s\",\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.borderColor = colors.accent;\n e.currentTarget.style.boxShadow = `0 0 0 1px ${colors.accent}40`;\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.borderColor = inputBorder;\n e.currentTarget.style.boxShadow = \"none\";\n }}\n >\n <span style={{ fontSize: 24, lineHeight: 1, flexShrink: 0 }}>{emoji}</span>\n <div>\n <div style={{ fontSize: 14, fontWeight: 600, color: colors.text, marginBottom: 2 }}>{title}</div>\n <div style={{ fontSize: 12, color: colors.textMuted }}>{subtitle}</div>\n </div>\n <span style={{ marginLeft: \"auto\", fontSize: 16, color: colors.textMuted, flexShrink: 0 }}>→</span>\n </button>\n );\n}\n\nfunction SeverityButton({ sev, label, selected, hint, color, accent, border, bg, text, onClick }: SevBtnProps) {\n return (\n <button\n type=\"button\"\n title={hint}\n onClick={onClick}\n style={{\n padding: \"9px 6px 8px\",\n borderRadius: 10,\n border: selected ? `2px solid ${accent}` : `1.5px solid ${border}`,\n background: selected ? `${accent}15` : bg,\n cursor: \"pointer\",\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n gap: 5,\n transition: \"border-color 0.12s, background 0.12s\",\n fontFamily: \"inherit\",\n }}\n >\n <span style={{ width: 8, height: 8, borderRadius: \"50%\", background: color, display: \"block\" }} />\n <span\n style={{\n fontSize: 13,\n fontWeight: selected ? 700 : 500,\n color: selected ? accent : text,\n letterSpacing: \"0.02em\",\n }}\n >\n {sev}\n </span>\n <span style={{ fontSize: 11, color: selected ? accent : text, opacity: 0.6, letterSpacing: \"0.02em\" }}>\n {label}\n </span>\n </button>\n );\n}\n\nfunction SparkIcon({ color = \"currentColor\", size = 14 }: { color?: string; size?: number }) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke={color}\n strokeWidth=\"2.2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M13 2L3 14h9l-1 8 10-12h-9l1-8z\" />\n </svg>\n );\n}\n\nfunction CheckIcon({ size = 20 }: { size?: number }) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"#22c55e\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n );\n}\n","export { submitReplay, submitReport } from \"@diegotsi/flint-core\";\n","import { domToCanvas } from \"modern-screenshot\";\nimport { useEffect, useRef, useState } from \"react\";\n\ninterface Props {\n zIndex: number;\n onCapture: (file: File) => void;\n onCancel: () => void;\n}\n\ntype Phase = \"idle\" | \"selecting\" | \"capturing\";\n\ninterface Rect {\n x: number;\n y: number;\n w: number;\n h: number;\n}\n\nfunction normalizeRect(startX: number, startY: number, endX: number, endY: number): Rect {\n return {\n x: Math.min(startX, endX),\n y: Math.min(startY, endY),\n w: Math.abs(endX - startX),\n h: Math.abs(endY - startY),\n };\n}\n\nexport function ScreenAnnotator({ zIndex, onCapture, onCancel }: Props) {\n const [phase, setPhase] = useState<Phase>(\"idle\");\n const [rect, setRect] = useState<Rect | null>(null);\n const startRef = useRef<{ x: number; y: number } | null>(null);\n const overlayRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") onCancel();\n };\n window.addEventListener(\"keydown\", onKey);\n return () => window.removeEventListener(\"keydown\", onKey);\n }, [onCancel]);\n\n const onMouseDown = (e: React.MouseEvent) => {\n e.preventDefault();\n startRef.current = { x: e.clientX, y: e.clientY };\n setPhase(\"selecting\");\n setRect({ x: e.clientX, y: e.clientY, w: 0, h: 0 });\n };\n\n const onMouseMove = (e: React.MouseEvent) => {\n if (phase !== \"selecting\" || !startRef.current) return;\n setRect(normalizeRect(startRef.current.x, startRef.current.y, e.clientX, e.clientY));\n };\n\n const onMouseUp = async (e: React.MouseEvent) => {\n if (phase !== \"selecting\" || !startRef.current) return;\n const finalRect = normalizeRect(startRef.current.x, startRef.current.y, e.clientX, e.clientY);\n startRef.current = null;\n\n if (finalRect.w < 5 || finalRect.h < 5) {\n setPhase(\"idle\");\n setRect(null);\n return;\n }\n\n setPhase(\"capturing\");\n\n const dpr = window.devicePixelRatio ?? 1;\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n\n // Wait for React to re-render + browser to paint so the overlay disappears\n await new Promise<void>((resolve) => requestAnimationFrame(() => requestAnimationFrame(() => resolve())));\n\n try {\n // Capture the visible viewport using modern-screenshot.\n // It clones only the visible area when width/height match the viewport.\n const fullCanvas = await domToCanvas(document.documentElement, {\n scale: dpr,\n width: vw,\n height: vh,\n style: {\n transform: `translate(-${window.scrollX}px, -${window.scrollY}px)`,\n },\n filter: (el) => el !== overlayRef.current,\n });\n\n // Crop canvas to viewport size (domToCanvas may produce a larger canvas)\n const canvas = document.createElement(\"canvas\");\n canvas.width = vw * dpr;\n canvas.height = vh * dpr;\n const ctx = canvas.getContext(\"2d\")!;\n ctx.drawImage(fullCanvas, 0, 0, vw * dpr, vh * dpr, 0, 0, vw * dpr, vh * dpr);\n\n // Draw annotation highlight — clientX/Y are viewport-relative\n ctx.fillStyle = \"rgba(255,200,0,0.25)\";\n ctx.fillRect(finalRect.x * dpr, finalRect.y * dpr, finalRect.w * dpr, finalRect.h * dpr);\n ctx.strokeStyle = \"#f97316\";\n ctx.lineWidth = 3 * dpr;\n ctx.strokeRect(finalRect.x * dpr, finalRect.y * dpr, finalRect.w * dpr, finalRect.h * dpr);\n\n canvas.toBlob((blob: Blob | null) => {\n if (blob) {\n onCapture(new File([blob], \"annotation.png\", { type: \"image/png\" }));\n } else {\n onCancel();\n }\n }, \"image/png\");\n } catch (err) {\n console.error(\"[Flint] ScreenAnnotator capture failed:\", err);\n onCancel();\n }\n };\n\n const isCapturing = phase === \"capturing\";\n\n return (\n <div\n ref={overlayRef}\n onMouseDown={onMouseDown}\n onMouseMove={onMouseMove}\n onMouseUp={onMouseUp}\n style={{\n position: \"fixed\",\n inset: 0,\n zIndex,\n cursor: isCapturing ? \"default\" : \"crosshair\",\n userSelect: \"none\",\n background: phase === \"selecting\" ? \"rgba(0,0,0,0.15)\" : \"rgba(0,0,0,0.05)\",\n transition: \"background 0.1s\",\n opacity: isCapturing ? 0 : 1,\n pointerEvents: isCapturing ? \"none\" : \"auto\",\n }}\n >\n {!isCapturing && (\n <div\n style={{\n position: \"absolute\",\n top: 16,\n left: \"50%\",\n transform: \"translateX(-50%)\",\n background: \"rgba(0,0,0,0.75)\",\n color: \"#fff\",\n padding: \"8px 18px\",\n borderRadius: 8,\n fontSize: 14,\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif',\n pointerEvents: \"none\",\n whiteSpace: \"nowrap\",\n backdropFilter: \"blur(4px)\",\n }}\n >\n Drag to highlight the problem area &nbsp;·&nbsp; Esc to cancel\n </div>\n )}\n\n {rect && phase === \"selecting\" && (\n <div\n style={{\n position: \"absolute\",\n left: rect.x,\n top: rect.y,\n width: rect.w,\n height: rect.h,\n background: \"rgba(255,200,0,0.2)\",\n border: \"2px dashed #f97316\",\n boxSizing: \"border-box\",\n pointerEvents: \"none\",\n }}\n />\n )}\n </div>\n );\n}\n","export { resolveTheme } from \"@diegotsi/flint-core\";\n","import { Flint, type FlintWidgetProps } from \"@diegotsi/flint-core\";\nimport type { eventWithTime } from \"@rrweb/types\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { I18nextProvider, useTranslation } from \"react-i18next\";\nimport { collectEnvironment } from \"./collectors/environment.js\";\nimport { FlintModal } from \"./FlintModal.js\";\nimport widgetI18n from \"./i18n/index.js\";\nimport { useFlintStore } from \"./store.js\";\nimport { resolveTheme } from \"./theme.js\";\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 buttonLabel,\n theme = \"dark\",\n zIndex = 9999,\n statusPageUrl,\n enableScreenshot = true,\n enableTextIssues = true,\n enableFeatureRequests = false,\n onBeforeSubmit,\n onSuccess,\n onError,\n onOpen,\n onClose,\n}: FlintWidgetProps) {\n // Flint.init() must be called before mounting the widget\n if (!Flint.isInitialized()) {\n throw new Error(\"[Flint] Call Flint.init() before mounting <FlintWidget />.\");\n }\n\n const config = Flint.getConfig()!;\n const globalState = useFlintStore();\n const resolvedUser = globalState.user ?? config.user;\n\n const { t } = useTranslation();\n const bugTimestamp = useRef(0);\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 bugTimestamp.current = Date.now();\n setOpen(true);\n onOpen?.();\n };\n\n // ── Inject rrweb replay recorder if not already initialized ─────────────\n const didInjectReplay = useRef(false);\n if (!didInjectReplay.current && config.enableReplay && !Flint.getInstance()?.stopReplay) {\n // The widget auto-injects the rrweb recorder when enableReplay is configured\n // but no _replayRecorder was provided (e.g. user called Flint.init without it)\n didInjectReplay.current = true;\n }\n\n const global = Flint.getInstance();\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 bugTimestamp.current = Date.now();\n setOpen(true);\n onOpen?.();\n }}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n aria-label={label}\n style={{\n position: \"fixed\",\n bottom: \"40px\",\n right: \"20px\",\n zIndex: zIndex - 1,\n display: \"flex\",\n alignItems: \"center\",\n gap: \"8px\",\n padding: \"10px 18px\",\n borderRadius: \"24px\",\n border: \"none\",\n background: `linear-gradient(135deg, ${colors.accent}, ${colors.accentHover})`,\n color: colors.buttonText,\n fontSize: \"13px\",\n fontWeight: 600,\n cursor: \"pointer\",\n boxShadow: hovered\n ? `0 0 28px ${colors.accent}55, 0 8px 24px rgba(0,0,0,0.3)`\n : `0 0 16px ${colors.accent}33, 0 4px 16px rgba(0,0,0,0.2)`,\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif',\n transform: hovered ? \"translateY(-2px)\" : \"translateY(0)\",\n transition: \"transform 0.15s ease, box-shadow 0.15s ease\",\n letterSpacing: \"0.01em\",\n }}\n >\n <SparkIcon />\n {label}\n </button>\n\n {/* Selection tooltip */}\n {enableTextIssues && selectionTooltip && !open && (\n <button\n ref={tooltipRef}\n onClick={() => openWithSelection(selectionTooltip.text)}\n style={{\n position: \"fixed\",\n left: Math.max(8, Math.min(selectionTooltip.x - 70, window.innerWidth - 148)),\n top: Math.max(8, selectionTooltip.y - 36),\n zIndex: zIndex + 1,\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n padding: \"6px 12px\",\n borderRadius: 10,\n border: \"none\",\n background: `linear-gradient(135deg, ${colors.accent}, ${colors.accentHover})`,\n color: colors.buttonText,\n fontSize: 12,\n fontWeight: 600,\n cursor: \"pointer\",\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif',\n boxShadow: `0 4px 20px rgba(0,0,0,0.25), 0 0 12px ${colors.accent}40`,\n animation: \"flint-tooltip-in 0.15s ease-out\",\n whiteSpace: \"nowrap\",\n }}\n >\n <TextIcon />\n Report text issue\n </button>\n )}\n\n {/* Tooltip animation */}\n <style>{`\n @keyframes flint-tooltip-in {\n from { opacity: 0; transform: translateY(4px); }\n to { opacity: 1; transform: translateY(0); }\n }\n `}</style>\n\n {/* Modal */}\n {open && (\n <FlintModal\n user={resolvedUser}\n meta={config.meta}\n theme={theme}\n zIndex={zIndex}\n onClose={() => {\n setOpen(false);\n onClose?.();\n pendingSelection.current = \"\";\n }}\n getEnvironment={collectEnvironment}\n getConsoleLogs={() => global?.console?.getEntries() ?? []}\n getNetworkErrors={() => global?.network?.getEntries() ?? []}\n getFormErrors={() => global?.formErrors?.getEntries() ?? []}\n getReplayEvents={() => Flint.getReplayEvents() as eventWithTime[]}\n getExternalReplayUrl={() => Flint.getExternalReplayUrl()}\n initialSelection={pendingSelection.current}\n enableScreenshot={enableScreenshot}\n enableTextIssues={enableTextIssues}\n enableFeatureRequests={enableFeatureRequests}\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 { collectEnvironment } from \"@diegotsi/flint-core\";\n","import { createInstance } from \"i18next\";\nimport { initReactI18next } from \"react-i18next\";\nimport en from \"./locales/en.json\";\n\nexport const widgetI18n: ReturnType<typeof createInstance> = createInstance();\n\nwidgetI18n.use(initReactI18next).init({\n lng: \"en-US\",\n fallbackLng: \"en-US\",\n resources: { \"en-US\": { translation: en } },\n interpolation: { escapeValue: false },\n initImmediate: false,\n showSupportNotice: false,\n});\n\nexport default widgetI18n;\n","{\n \"buttonLabel\": \"Report bug\",\n \"modalTitle\": \"Report an issue\",\n \"severityLabel\": \"Severity\",\n \"severity_P1_hint\": \"Critical — system down\",\n \"severity_P2_hint\": \"High — core feature broken\",\n \"severity_P3_hint\": \"Medium — noticeable but workable\",\n \"severity_P4_hint\": \"Low — cosmetic or improvement\",\n \"severity_P1_label\": \"Critical\",\n \"severity_P2_label\": \"High\",\n \"severity_P3_label\": \"Medium\",\n \"severity_P4_label\": \"Low\",\n \"whatIsBrokenLabel\": \"What Is Broken\",\n \"whatIsBrokenPlaceholder\": \"1–2 sentences: what is currently happening that should NOT happen.\",\n \"expectedBehaviorLabel\": \"Expected Behavior (optional)\",\n \"expectedBehaviorPlaceholder\": \"Describe exactly what the user should see or receive after the fix.\",\n \"screenshotLabel\": \"Screenshot (optional)\",\n \"screenshotPlaceholder\": \"Click to attach...\",\n \"screenshotAttachFile\": \"Attach file\",\n \"screenshotMarkOnScreen\": \"Mark on screen\",\n \"submitLabel\": \"Submit\",\n \"close\": \"Close\",\n \"successTitle\": \"Bug reported!\",\n \"successDuplicate\": \"Looks like a duplicate of an existing bug.\",\n \"successGitHub\": \"View GitHub issue\",\n \"successSlack\": \"View Slack message\",\n \"replayInfo\": \"No need to record your screen — we automatically capture a session replay when you submit.\",\n \"errorLabel\": \"Failed to submit. Please try again.\",\n \"cancel\": \"Cancel\",\n \"sending\": \"Sending report\",\n \"capturingContext\": \"Capturing context\"\n}\n","import { getSnapshot, subscribe } from \"@diegotsi/flint-core\";\nimport { useSyncExternalStore } from \"react\";\n\nexport { _setFormErrorCollector, Flint } from \"@diegotsi/flint-core\";\n\nexport function useFlintStore() {\n return useSyncExternalStore(subscribe, getSnapshot);\n}\n"],"mappings":"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","names":["import_flint_core","import_react","import_flint_core","import_jsx_runtime","import_flint_core","import_react","import_react_i18next","import_flint_core","import_react_i18next","import_flint_core","import_react","import_jsx_runtime","SparkIcon"]}
package/dist/index.js CHANGED
@@ -1,6 +1,7 @@
1
1
  // src/FlintModal.tsx
2
2
  import {
3
- Flint
3
+ Flint,
4
+ trackDatadogBugReported
4
5
  } from "@diegotsi/flint-core";
5
6
  import { useCallback, useEffect as useEffect2, useRef as useRef2, useState as useState2 } from "react";
6
7
  import { useTranslation } from "react-i18next";
@@ -351,6 +352,12 @@ function FlintModal({
351
352
  setResult(res);
352
353
  setStatus("success");
353
354
  onSuccess?.(res);
355
+ trackDatadogBugReported({
356
+ bugId: res.id,
357
+ severity: payload.severity,
358
+ url: payload.url,
359
+ title: payload.description.slice(0, 120)
360
+ });
354
361
  const events = getReplayEvents();
355
362
  if (events.length > 0) {
356
363
  submitReplay(serverUrl, projectKey, res.id, events).catch(() => {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/FlintModal.tsx","../src/api.ts","../src/ScreenAnnotator.tsx","../src/theme.ts","../src/FlintWidget.tsx","../src/collectors/environment.ts","../src/i18n/index.ts","../src/i18n/locales/en.json","../src/store.ts"],"sourcesContent":["import {\n type ConsoleEntry,\n type EnvironmentInfo,\n Flint,\n type FlintUser,\n type FormErrorEntry,\n type NetworkEntry,\n type ReportPayload,\n type ReportResult,\n type Severity,\n type Theme,\n} from \"@diegotsi/flint-core\";\nimport type { eventWithTime } from \"@rrweb/types\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { submitReplay, submitReport } from \"./api.js\";\nimport { ScreenAnnotator } from \"./ScreenAnnotator.js\";\nimport { resolveTheme } from \"./theme.js\";\n\ninterface Props {\n user?: FlintUser;\n meta?: Record<string, unknown>;\n theme: Theme;\n zIndex: number;\n onClose: () => void;\n getEnvironment: () => EnvironmentInfo;\n getConsoleLogs: () => ConsoleEntry[];\n getNetworkErrors: () => NetworkEntry[];\n getFormErrors: () => FormErrorEntry[];\n getReplayEvents: () => eventWithTime[];\n getExternalReplayUrl: () => string | undefined;\n initialSelection?: string;\n enableScreenshot?: boolean;\n enableTextIssues?: boolean;\n enableFeatureRequests?: 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 user,\n meta,\n theme,\n zIndex,\n onClose,\n getEnvironment,\n getConsoleLogs,\n getNetworkErrors,\n getFormErrors,\n getReplayEvents,\n getExternalReplayUrl,\n initialSelection = \"\",\n enableScreenshot = true,\n enableTextIssues = true,\n enableFeatureRequests = false,\n statusPageUrl,\n onBeforeSubmit,\n onSuccess,\n onError,\n}: Props) {\n const config = Flint.getConfig()!;\n const { projectKey, serverUrl } = config;\n const { t } = useTranslation();\n const colors = resolveTheme(theme);\n const isDark = theme === \"dark\";\n\n // Reporter identity: prop > localStorage > empty\n const needsIdentity = !user;\n const [reporterName, setReporterName] = useState(() => {\n if (user?.name) return user.name;\n try {\n return localStorage.getItem(\"flint_reporter_name\") ?? \"\";\n } catch {\n return \"\";\n }\n });\n const [reporterEmail, setReporterEmail] = useState(() => {\n if (user?.email) return user.email;\n try {\n return localStorage.getItem(\"flint_reporter_email\") ?? \"\";\n } catch {\n return \"\";\n }\n });\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 // Wizard step: selector screen → form screen\n // Skip selector if: text issue with initial selection, or no alternative modes enabled\n const hasInitialSelection = enableTextIssues && !!initialSelection;\n const hasMultipleModes = enableTextIssues || enableFeatureRequests;\n const [step, setStep] = useState<\"selector\" | \"form\">(hasInitialSelection || !hasMultipleModes ? \"form\" : \"selector\");\n const [mode, setMode] = useState<\"bug\" | \"text\" | \"feature\">(hasInitialSelection ? \"text\" : \"bug\");\n const [textOriginal, setTextOriginal] = useState(initialSelection);\n const [textSuggested, setTextSuggested] = useState(\"\");\n\n // Feature request mode\n const [featureDescription, setFeatureDescription] = useState(\"\");\n const [featureUseCase, setFeatureUseCase] = 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 const isFeature = mode === \"feature\";\n if (isText) {\n if (!textOriginal.trim() || !textSuggested.trim()) return;\n } else if (isFeature) {\n if (!featureDescription.trim()) return;\n } else {\n if (!description.trim()) return;\n }\n\n setStatus(\"submitting\");\n setErrorMsg(\"\");\n\n const collectedMeta: Record<string, unknown> = {\n ...meta,\n environment: getEnvironment(),\n consoleLogs: getConsoleLogs(),\n networkErrors: getNetworkErrors(),\n formErrors: getFormErrors(),\n };\n\n if (isText) {\n collectedMeta.textIssue = {\n original: textOriginal.trim(),\n suggested: textSuggested.trim(),\n lang: textLang,\n };\n }\n\n if (isFeature) {\n collectedMeta.featureRequest = {\n useCase: featureUseCase.trim(),\n };\n }\n\n // Save reporter identity to localStorage for next time\n if (needsIdentity) {\n try {\n if (reporterName.trim()) localStorage.setItem(\"flint_reporter_name\", reporterName.trim());\n if (reporterEmail.trim()) localStorage.setItem(\"flint_reporter_email\", reporterEmail.trim());\n } catch {\n /* localStorage unavailable */\n }\n }\n\n const payload: ReportPayload = {\n reporterId: user?.id ?? (reporterEmail.trim() || \"anonymous\"),\n reporterName: user?.name ?? (reporterName.trim() || \"Anonymous\"),\n reporterEmail: user?.email ?? (reporterEmail.trim() || undefined),\n reporterExtraAttributes: user?.extraAttributes,\n description: isFeature\n ? featureDescription.trim()\n : isText\n ? `[Text issue] \"${textOriginal.trim()}\" → \"${textSuggested.trim()}\"`\n : description.trim(),\n expectedBehavior: !isText && !isFeature ? expectedBehavior.trim() || undefined : undefined,\n externalReplayUrl: getExternalReplayUrl() || undefined,\n severity: isText || isFeature ? \"P3\" : severity,\n url: window.location.href,\n meta: collectedMeta,\n label: isText ? \"TEXT\" : isFeature ? \"FEATURE\" : undefined,\n source: isFeature ? \"feature_request\" : isText ? \"text_issue\" : \"widget\",\n type: isFeature ? \"FEATURE_REQUEST\" : \"BUG\",\n appVersion: config.appVersion,\n release: config.release,\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(\n serverUrl,\n projectKey,\n payload,\n !isText && !isFeature ? (screenshot ?? undefined) : undefined,\n );\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 {/* ── Step 1: Selector screen ──────────────────────────────── */}\n {step === \"selector\" && (\n <>\n {/* Reporter identity */}\n {needsIdentity && (\n <div style={{ display: \"flex\", gap: 10, marginBottom: 18 }}>\n <div style={{ flex: 1 }}>\n <FieldLabel colors={colors} htmlFor=\"flint-reporter-name\">\n {t(\"nameLabel\", \"Your name\")}\n </FieldLabel>\n <input\n id=\"flint-reporter-name\"\n type=\"text\"\n style={inputStyle}\n value={reporterName}\n onChange={(e) => setReporterName(e.target.value)}\n placeholder=\"Jane Doe\"\n />\n </div>\n <div style={{ flex: 1 }}>\n <FieldLabel colors={colors} htmlFor=\"flint-reporter-email\">\n {t(\"emailLabel\", \"Email\")}\n </FieldLabel>\n <input\n id=\"flint-reporter-email\"\n type=\"email\"\n style={inputStyle}\n value={reporterEmail}\n onChange={(e) => setReporterEmail(e.target.value)}\n placeholder=\"jane@company.com\"\n />\n </div>\n </div>\n )}\n\n {/* Type selector buttons */}\n <FieldLabel colors={colors}>What would you like to report?</FieldLabel>\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 8, marginBottom: 16 }}>\n <TypeSelectorButton\n emoji=\"🐛\"\n title=\"Bug Report\"\n subtitle=\"Something isn't working\"\n colors={colors}\n inputBorder={inputBorder}\n onClick={() => {\n setMode(\"bug\");\n setStep(\"form\");\n }}\n />\n {enableFeatureRequests && (\n <TypeSelectorButton\n emoji=\"💡\"\n title=\"Feature Request / Improvement\"\n subtitle=\"I have an idea or suggestion\"\n colors={colors}\n inputBorder={inputBorder}\n onClick={() => {\n setMode(\"feature\");\n setStep(\"form\");\n }}\n />\n )}\n {enableTextIssues && (\n <TypeSelectorButton\n emoji=\"✏️\"\n title=\"Text Issue\"\n subtitle=\"There's a text or translation problem\"\n colors={colors}\n inputBorder={inputBorder}\n onClick={() => {\n setMode(\"text\");\n setStep(\"form\");\n }}\n />\n )}\n </div>\n\n {/* Cancel */}\n <button\n type=\"button\"\n onClick={onClose}\n style={{\n width: \"100%\",\n padding: \"10px\",\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 </>\n )}\n\n {/* ── Step 2: Form screen ──────────────────────────────────── */}\n {step === \"form\" && (\n <>\n {/* Back button */}\n {!hasInitialSelection && (\n <button\n type=\"button\"\n onClick={() => setStep(\"selector\")}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 4,\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n fontSize: 13,\n fontWeight: 600,\n color: colors.textMuted,\n fontFamily: \"inherit\",\n padding: \"0 0 12px\",\n marginBottom: 4,\n }}\n >\n ← {mode === \"bug\" ? \"🐛 Bug Report\" : mode === \"feature\" ? \"💡 Feature Request\" : \"✏️ Text Issue\"}\n </button>\n )}\n\n {/* Text issue fields */}\n {mode === \"text\" && (\n <>\n <div style={{ marginBottom: 14 }}>\n <FieldLabel colors={colors} htmlFor=\"flint-text-original\">\n Original text\n </FieldLabel>\n <textarea\n id=\"flint-text-original\"\n style={{ ...inputStyle, resize: \"vertical\", minHeight: 60 }}\n value={textOriginal}\n onChange={(e) => setTextOriginal(e.target.value)}\n placeholder=\"Text that is wrong on screen…\"\n required\n />\n </div>\n <div style={{ marginBottom: 14 }}>\n <FieldLabel colors={colors} htmlFor=\"flint-text-suggested\">\n Suggested correction\n </FieldLabel>\n <textarea\n id=\"flint-text-suggested\"\n style={{ ...inputStyle, resize: \"vertical\", minHeight: 60 }}\n value={textSuggested}\n onChange={(e) => setTextSuggested(e.target.value)}\n placeholder=\"How it should read…\"\n required\n />\n </div>\n <div style={{ marginBottom: 20 }}>\n <FieldLabel colors={colors} htmlFor=\"flint-text-lang\">\n Language\n </FieldLabel>\n <select\n id=\"flint-text-lang\"\n value={textLang}\n onChange={(e) => setTextLang(e.target.value)}\n style={{\n ...inputStyle,\n appearance: \"none\",\n cursor: \"pointer\",\n }}\n >\n <option value=\"en\">English (en)</option>\n <option value=\"he\">עברית (he)</option>\n </select>\n </div>\n </>\n )}\n\n {/* Feature request fields */}\n {mode === \"feature\" && (\n <>\n <div style={{ marginBottom: 14 }}>\n <FieldLabel colors={colors} htmlFor=\"flint-feature-description\">\n Description\n </FieldLabel>\n <textarea\n id=\"flint-feature-description\"\n style={{ ...inputStyle, resize: \"vertical\", minHeight: 80 }}\n value={featureDescription}\n onChange={(e) => setFeatureDescription(e.target.value)}\n placeholder=\"Describe the feature you'd like to see...\"\n required\n />\n </div>\n <div style={{ marginBottom: 20 }}>\n <FieldLabel colors={colors} htmlFor=\"flint-feature-usecase\">\n Use case\n </FieldLabel>\n <textarea\n id=\"flint-feature-usecase\"\n style={{ ...inputStyle, resize: \"vertical\", minHeight: 72 }}\n value={featureUseCase}\n onChange={(e) => setFeatureUseCase(e.target.value)}\n placeholder=\"What problem would this solve for you?\"\n />\n </div>\n </>\n )}\n\n {/* Severity */}\n <div\n style={{ marginBottom: 18, display: mode === \"text\" || mode === \"feature\" ? \"none\" : undefined }}\n >\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\n style={{\n marginBottom: 20,\n display: mode === \"text\" || mode === \"feature\" || !enableScreenshot ? \"none\" : undefined,\n }}\n >\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={{\n height: 60,\n borderRadius: 8,\n objectFit: \"cover\",\n border: `1px solid ${inputBorder}`,\n }}\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 </>\n )}\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 TypeSelectorButton({\n emoji,\n title,\n subtitle,\n colors,\n inputBorder,\n onClick,\n}: {\n emoji: string;\n title: string;\n subtitle: string;\n colors: { backgroundSecondary: string; text: string; textMuted: string; accent: string };\n inputBorder: string;\n onClick: () => void;\n}) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 14,\n padding: \"14px 16px\",\n borderRadius: 12,\n border: `1px solid ${inputBorder}`,\n background: colors.backgroundSecondary,\n cursor: \"pointer\",\n fontFamily: \"inherit\",\n textAlign: \"left\",\n transition: \"border-color 0.15s, box-shadow 0.15s\",\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.borderColor = colors.accent;\n e.currentTarget.style.boxShadow = `0 0 0 1px ${colors.accent}40`;\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.borderColor = inputBorder;\n e.currentTarget.style.boxShadow = \"none\";\n }}\n >\n <span style={{ fontSize: 24, lineHeight: 1, flexShrink: 0 }}>{emoji}</span>\n <div>\n <div style={{ fontSize: 14, fontWeight: 600, color: colors.text, marginBottom: 2 }}>{title}</div>\n <div style={{ fontSize: 12, color: colors.textMuted }}>{subtitle}</div>\n </div>\n <span style={{ marginLeft: \"auto\", fontSize: 16, color: colors.textMuted, flexShrink: 0 }}>→</span>\n </button>\n );\n}\n\nfunction SeverityButton({ sev, label, selected, hint, color, accent, border, bg, text, onClick }: SevBtnProps) {\n return (\n <button\n type=\"button\"\n title={hint}\n onClick={onClick}\n style={{\n padding: \"9px 6px 8px\",\n borderRadius: 10,\n border: selected ? `2px solid ${accent}` : `1.5px solid ${border}`,\n background: selected ? `${accent}15` : bg,\n cursor: \"pointer\",\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n gap: 5,\n transition: \"border-color 0.12s, background 0.12s\",\n fontFamily: \"inherit\",\n }}\n >\n <span style={{ width: 8, height: 8, borderRadius: \"50%\", background: color, display: \"block\" }} />\n <span\n style={{\n fontSize: 13,\n fontWeight: selected ? 700 : 500,\n color: selected ? accent : text,\n letterSpacing: \"0.02em\",\n }}\n >\n {sev}\n </span>\n <span style={{ fontSize: 11, color: selected ? accent : text, opacity: 0.6, letterSpacing: \"0.02em\" }}>\n {label}\n </span>\n </button>\n );\n}\n\nfunction SparkIcon({ color = \"currentColor\", size = 14 }: { color?: string; size?: number }) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke={color}\n strokeWidth=\"2.2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M13 2L3 14h9l-1 8 10-12h-9l1-8z\" />\n </svg>\n );\n}\n\nfunction CheckIcon({ size = 20 }: { size?: number }) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"#22c55e\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n );\n}\n","export { submitReplay, submitReport } from \"@diegotsi/flint-core\";\n","import { domToCanvas } from \"modern-screenshot\";\nimport { useEffect, useRef, useState } from \"react\";\n\ninterface Props {\n zIndex: number;\n onCapture: (file: File) => void;\n onCancel: () => void;\n}\n\ntype Phase = \"idle\" | \"selecting\" | \"capturing\";\n\ninterface Rect {\n x: number;\n y: number;\n w: number;\n h: number;\n}\n\nfunction normalizeRect(startX: number, startY: number, endX: number, endY: number): Rect {\n return {\n x: Math.min(startX, endX),\n y: Math.min(startY, endY),\n w: Math.abs(endX - startX),\n h: Math.abs(endY - startY),\n };\n}\n\nexport function ScreenAnnotator({ zIndex, onCapture, onCancel }: Props) {\n const [phase, setPhase] = useState<Phase>(\"idle\");\n const [rect, setRect] = useState<Rect | null>(null);\n const startRef = useRef<{ x: number; y: number } | null>(null);\n const overlayRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") onCancel();\n };\n window.addEventListener(\"keydown\", onKey);\n return () => window.removeEventListener(\"keydown\", onKey);\n }, [onCancel]);\n\n const onMouseDown = (e: React.MouseEvent) => {\n e.preventDefault();\n startRef.current = { x: e.clientX, y: e.clientY };\n setPhase(\"selecting\");\n setRect({ x: e.clientX, y: e.clientY, w: 0, h: 0 });\n };\n\n const onMouseMove = (e: React.MouseEvent) => {\n if (phase !== \"selecting\" || !startRef.current) return;\n setRect(normalizeRect(startRef.current.x, startRef.current.y, e.clientX, e.clientY));\n };\n\n const onMouseUp = async (e: React.MouseEvent) => {\n if (phase !== \"selecting\" || !startRef.current) return;\n const finalRect = normalizeRect(startRef.current.x, startRef.current.y, e.clientX, e.clientY);\n startRef.current = null;\n\n if (finalRect.w < 5 || finalRect.h < 5) {\n setPhase(\"idle\");\n setRect(null);\n return;\n }\n\n setPhase(\"capturing\");\n\n const dpr = window.devicePixelRatio ?? 1;\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n\n // Wait for React to re-render + browser to paint so the overlay disappears\n await new Promise<void>((resolve) => requestAnimationFrame(() => requestAnimationFrame(() => resolve())));\n\n try {\n // Capture the visible viewport using modern-screenshot.\n // It clones only the visible area when width/height match the viewport.\n const fullCanvas = await domToCanvas(document.documentElement, {\n scale: dpr,\n width: vw,\n height: vh,\n style: {\n transform: `translate(-${window.scrollX}px, -${window.scrollY}px)`,\n },\n filter: (el) => el !== overlayRef.current,\n });\n\n // Crop canvas to viewport size (domToCanvas may produce a larger canvas)\n const canvas = document.createElement(\"canvas\");\n canvas.width = vw * dpr;\n canvas.height = vh * dpr;\n const ctx = canvas.getContext(\"2d\")!;\n ctx.drawImage(fullCanvas, 0, 0, vw * dpr, vh * dpr, 0, 0, vw * dpr, vh * dpr);\n\n // Draw annotation highlight — clientX/Y are viewport-relative\n ctx.fillStyle = \"rgba(255,200,0,0.25)\";\n ctx.fillRect(finalRect.x * dpr, finalRect.y * dpr, finalRect.w * dpr, finalRect.h * dpr);\n ctx.strokeStyle = \"#f97316\";\n ctx.lineWidth = 3 * dpr;\n ctx.strokeRect(finalRect.x * dpr, finalRect.y * dpr, finalRect.w * dpr, finalRect.h * dpr);\n\n canvas.toBlob((blob: Blob | null) => {\n if (blob) {\n onCapture(new File([blob], \"annotation.png\", { type: \"image/png\" }));\n } else {\n onCancel();\n }\n }, \"image/png\");\n } catch (err) {\n console.error(\"[Flint] ScreenAnnotator capture failed:\", err);\n onCancel();\n }\n };\n\n const isCapturing = phase === \"capturing\";\n\n return (\n <div\n ref={overlayRef}\n onMouseDown={onMouseDown}\n onMouseMove={onMouseMove}\n onMouseUp={onMouseUp}\n style={{\n position: \"fixed\",\n inset: 0,\n zIndex,\n cursor: isCapturing ? \"default\" : \"crosshair\",\n userSelect: \"none\",\n background: phase === \"selecting\" ? \"rgba(0,0,0,0.15)\" : \"rgba(0,0,0,0.05)\",\n transition: \"background 0.1s\",\n opacity: isCapturing ? 0 : 1,\n pointerEvents: isCapturing ? \"none\" : \"auto\",\n }}\n >\n {!isCapturing && (\n <div\n style={{\n position: \"absolute\",\n top: 16,\n left: \"50%\",\n transform: \"translateX(-50%)\",\n background: \"rgba(0,0,0,0.75)\",\n color: \"#fff\",\n padding: \"8px 18px\",\n borderRadius: 8,\n fontSize: 14,\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif',\n pointerEvents: \"none\",\n whiteSpace: \"nowrap\",\n backdropFilter: \"blur(4px)\",\n }}\n >\n Drag to highlight the problem area &nbsp;·&nbsp; Esc to cancel\n </div>\n )}\n\n {rect && phase === \"selecting\" && (\n <div\n style={{\n position: \"absolute\",\n left: rect.x,\n top: rect.y,\n width: rect.w,\n height: rect.h,\n background: \"rgba(255,200,0,0.2)\",\n border: \"2px dashed #f97316\",\n boxSizing: \"border-box\",\n pointerEvents: \"none\",\n }}\n />\n )}\n </div>\n );\n}\n","export { resolveTheme } from \"@diegotsi/flint-core\";\n","import { Flint, type FlintWidgetProps } from \"@diegotsi/flint-core\";\nimport type { eventWithTime } from \"@rrweb/types\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { I18nextProvider, useTranslation } from \"react-i18next\";\nimport { collectEnvironment } from \"./collectors/environment.js\";\nimport { FlintModal } from \"./FlintModal.js\";\nimport widgetI18n from \"./i18n/index.js\";\nimport { useFlintStore } from \"./store.js\";\nimport { resolveTheme } from \"./theme.js\";\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 buttonLabel,\n theme = \"dark\",\n zIndex = 9999,\n statusPageUrl,\n enableScreenshot = true,\n enableTextIssues = true,\n enableFeatureRequests = false,\n onBeforeSubmit,\n onSuccess,\n onError,\n onOpen,\n onClose,\n}: FlintWidgetProps) {\n // Flint.init() must be called before mounting the widget\n if (!Flint.isInitialized()) {\n throw new Error(\"[Flint] Call Flint.init() before mounting <FlintWidget />.\");\n }\n\n const config = Flint.getConfig()!;\n const globalState = useFlintStore();\n const resolvedUser = globalState.user ?? config.user;\n\n const { t } = useTranslation();\n const bugTimestamp = useRef(0);\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 bugTimestamp.current = Date.now();\n setOpen(true);\n onOpen?.();\n };\n\n // ── Inject rrweb replay recorder if not already initialized ─────────────\n const didInjectReplay = useRef(false);\n if (!didInjectReplay.current && config.enableReplay && !Flint.getInstance()?.stopReplay) {\n // The widget auto-injects the rrweb recorder when enableReplay is configured\n // but no _replayRecorder was provided (e.g. user called Flint.init without it)\n didInjectReplay.current = true;\n }\n\n const global = Flint.getInstance();\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 bugTimestamp.current = Date.now();\n setOpen(true);\n onOpen?.();\n }}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n aria-label={label}\n style={{\n position: \"fixed\",\n bottom: \"40px\",\n right: \"20px\",\n zIndex: zIndex - 1,\n display: \"flex\",\n alignItems: \"center\",\n gap: \"8px\",\n padding: \"10px 18px\",\n borderRadius: \"24px\",\n border: \"none\",\n background: `linear-gradient(135deg, ${colors.accent}, ${colors.accentHover})`,\n color: colors.buttonText,\n fontSize: \"13px\",\n fontWeight: 600,\n cursor: \"pointer\",\n boxShadow: hovered\n ? `0 0 28px ${colors.accent}55, 0 8px 24px rgba(0,0,0,0.3)`\n : `0 0 16px ${colors.accent}33, 0 4px 16px rgba(0,0,0,0.2)`,\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif',\n transform: hovered ? \"translateY(-2px)\" : \"translateY(0)\",\n transition: \"transform 0.15s ease, box-shadow 0.15s ease\",\n letterSpacing: \"0.01em\",\n }}\n >\n <SparkIcon />\n {label}\n </button>\n\n {/* Selection tooltip */}\n {enableTextIssues && selectionTooltip && !open && (\n <button\n ref={tooltipRef}\n onClick={() => openWithSelection(selectionTooltip.text)}\n style={{\n position: \"fixed\",\n left: Math.max(8, Math.min(selectionTooltip.x - 70, window.innerWidth - 148)),\n top: Math.max(8, selectionTooltip.y - 36),\n zIndex: zIndex + 1,\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n padding: \"6px 12px\",\n borderRadius: 10,\n border: \"none\",\n background: `linear-gradient(135deg, ${colors.accent}, ${colors.accentHover})`,\n color: colors.buttonText,\n fontSize: 12,\n fontWeight: 600,\n cursor: \"pointer\",\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif',\n boxShadow: `0 4px 20px rgba(0,0,0,0.25), 0 0 12px ${colors.accent}40`,\n animation: \"flint-tooltip-in 0.15s ease-out\",\n whiteSpace: \"nowrap\",\n }}\n >\n <TextIcon />\n Report text issue\n </button>\n )}\n\n {/* Tooltip animation */}\n <style>{`\n @keyframes flint-tooltip-in {\n from { opacity: 0; transform: translateY(4px); }\n to { opacity: 1; transform: translateY(0); }\n }\n `}</style>\n\n {/* Modal */}\n {open && (\n <FlintModal\n user={resolvedUser}\n meta={config.meta}\n theme={theme}\n zIndex={zIndex}\n onClose={() => {\n setOpen(false);\n onClose?.();\n pendingSelection.current = \"\";\n }}\n getEnvironment={collectEnvironment}\n getConsoleLogs={() => global?.console?.getEntries() ?? []}\n getNetworkErrors={() => global?.network?.getEntries() ?? []}\n getFormErrors={() => global?.formErrors?.getEntries() ?? []}\n getReplayEvents={() => Flint.getReplayEvents() as eventWithTime[]}\n getExternalReplayUrl={() => Flint.getExternalReplayUrl()}\n initialSelection={pendingSelection.current}\n enableScreenshot={enableScreenshot}\n enableTextIssues={enableTextIssues}\n enableFeatureRequests={enableFeatureRequests}\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 { collectEnvironment } from \"@diegotsi/flint-core\";\n","import { createInstance } from \"i18next\";\nimport { initReactI18next } from \"react-i18next\";\nimport en from \"./locales/en.json\";\n\nexport const widgetI18n: ReturnType<typeof createInstance> = createInstance();\n\nwidgetI18n.use(initReactI18next).init({\n lng: \"en-US\",\n fallbackLng: \"en-US\",\n resources: { \"en-US\": { translation: en } },\n interpolation: { escapeValue: false },\n initImmediate: false,\n showSupportNotice: false,\n});\n\nexport default widgetI18n;\n","{\n \"buttonLabel\": \"Report bug\",\n \"modalTitle\": \"Report an issue\",\n \"severityLabel\": \"Severity\",\n \"severity_P1_hint\": \"Critical — system down\",\n \"severity_P2_hint\": \"High — core feature broken\",\n \"severity_P3_hint\": \"Medium — noticeable but workable\",\n \"severity_P4_hint\": \"Low — cosmetic or improvement\",\n \"severity_P1_label\": \"Critical\",\n \"severity_P2_label\": \"High\",\n \"severity_P3_label\": \"Medium\",\n \"severity_P4_label\": \"Low\",\n \"whatIsBrokenLabel\": \"What Is Broken\",\n \"whatIsBrokenPlaceholder\": \"1–2 sentences: what is currently happening that should NOT happen.\",\n \"expectedBehaviorLabel\": \"Expected Behavior (optional)\",\n \"expectedBehaviorPlaceholder\": \"Describe exactly what the user should see or receive after the fix.\",\n \"screenshotLabel\": \"Screenshot (optional)\",\n \"screenshotPlaceholder\": \"Click to attach...\",\n \"screenshotAttachFile\": \"Attach file\",\n \"screenshotMarkOnScreen\": \"Mark on screen\",\n \"submitLabel\": \"Submit\",\n \"close\": \"Close\",\n \"successTitle\": \"Bug reported!\",\n \"successDuplicate\": \"Looks like a duplicate of an existing bug.\",\n \"successGitHub\": \"View GitHub issue\",\n \"successSlack\": \"View Slack message\",\n \"replayInfo\": \"No need to record your screen — we automatically capture a session replay when you submit.\",\n \"errorLabel\": \"Failed to submit. Please try again.\",\n \"cancel\": \"Cancel\",\n \"sending\": \"Sending report\",\n \"capturingContext\": \"Capturing context\"\n}\n","import { getSnapshot, subscribe } from \"@diegotsi/flint-core\";\nimport { useSyncExternalStore } from \"react\";\n\nexport { _setFormErrorCollector, Flint } from \"@diegotsi/flint-core\";\n\nexport function useFlintStore() {\n return useSyncExternalStore(subscribe, getSnapshot);\n}\n"],"mappings":";AAAA;AAAA,EAGE;AAAA,OAQK;AAEP,SAAS,aAAa,aAAAA,YAAW,UAAAC,SAAQ,YAAAC,iBAAgB;AACzD,SAAS,sBAAsB;;;ACd/B,SAAS,cAAc,oBAAoB;;;ACA3C,SAAS,mBAAmB;AAC5B,SAAS,WAAW,QAAQ,gBAAgB;AAmHxC,SAkBI,KAlBJ;AAlGJ,SAAS,cAAc,QAAgB,QAAgB,MAAc,MAAoB;AACvF,SAAO;AAAA,IACL,GAAG,KAAK,IAAI,QAAQ,IAAI;AAAA,IACxB,GAAG,KAAK,IAAI,QAAQ,IAAI;AAAA,IACxB,GAAG,KAAK,IAAI,OAAO,MAAM;AAAA,IACzB,GAAG,KAAK,IAAI,OAAO,MAAM;AAAA,EAC3B;AACF;AAEO,SAAS,gBAAgB,EAAE,QAAQ,WAAW,SAAS,GAAU;AACtE,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAgB,MAAM;AAChD,QAAM,CAAC,MAAM,OAAO,IAAI,SAAsB,IAAI;AAClD,QAAM,WAAW,OAAwC,IAAI;AAC7D,QAAM,aAAa,OAAuB,IAAI;AAE9C,YAAU,MAAM;AACd,UAAM,QAAQ,CAAC,MAAqB;AAClC,UAAI,EAAE,QAAQ,SAAU,UAAS;AAAA,IACnC;AACA,WAAO,iBAAiB,WAAW,KAAK;AACxC,WAAO,MAAM,OAAO,oBAAoB,WAAW,KAAK;AAAA,EAC1D,GAAG,CAAC,QAAQ,CAAC;AAEb,QAAM,cAAc,CAAC,MAAwB;AAC3C,MAAE,eAAe;AACjB,aAAS,UAAU,EAAE,GAAG,EAAE,SAAS,GAAG,EAAE,QAAQ;AAChD,aAAS,WAAW;AACpB,YAAQ,EAAE,GAAG,EAAE,SAAS,GAAG,EAAE,SAAS,GAAG,GAAG,GAAG,EAAE,CAAC;AAAA,EACpD;AAEA,QAAM,cAAc,CAAC,MAAwB;AAC3C,QAAI,UAAU,eAAe,CAAC,SAAS,QAAS;AAChD,YAAQ,cAAc,SAAS,QAAQ,GAAG,SAAS,QAAQ,GAAG,EAAE,SAAS,EAAE,OAAO,CAAC;AAAA,EACrF;AAEA,QAAM,YAAY,OAAO,MAAwB;AAC/C,QAAI,UAAU,eAAe,CAAC,SAAS,QAAS;AAChD,UAAM,YAAY,cAAc,SAAS,QAAQ,GAAG,SAAS,QAAQ,GAAG,EAAE,SAAS,EAAE,OAAO;AAC5F,aAAS,UAAU;AAEnB,QAAI,UAAU,IAAI,KAAK,UAAU,IAAI,GAAG;AACtC,eAAS,MAAM;AACf,cAAQ,IAAI;AACZ;AAAA,IACF;AAEA,aAAS,WAAW;AAEpB,UAAM,MAAM,OAAO,oBAAoB;AACvC,UAAM,KAAK,OAAO;AAClB,UAAM,KAAK,OAAO;AAGlB,UAAM,IAAI,QAAc,CAAC,YAAY,sBAAsB,MAAM,sBAAsB,MAAM,QAAQ,CAAC,CAAC,CAAC;AAExG,QAAI;AAGF,YAAM,aAAa,MAAM,YAAY,SAAS,iBAAiB;AAAA,QAC7D,OAAO;AAAA,QACP,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,OAAO;AAAA,UACL,WAAW,cAAc,OAAO,OAAO,QAAQ,OAAO,OAAO;AAAA,QAC/D;AAAA,QACA,QAAQ,CAAC,OAAO,OAAO,WAAW;AAAA,MACpC,CAAC;AAGD,YAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,aAAO,QAAQ,KAAK;AACpB,aAAO,SAAS,KAAK;AACrB,YAAM,MAAM,OAAO,WAAW,IAAI;AAClC,UAAI,UAAU,YAAY,GAAG,GAAG,KAAK,KAAK,KAAK,KAAK,GAAG,GAAG,KAAK,KAAK,KAAK,GAAG;AAG5E,UAAI,YAAY;AAChB,UAAI,SAAS,UAAU,IAAI,KAAK,UAAU,IAAI,KAAK,UAAU,IAAI,KAAK,UAAU,IAAI,GAAG;AACvF,UAAI,cAAc;AAClB,UAAI,YAAY,IAAI;AACpB,UAAI,WAAW,UAAU,IAAI,KAAK,UAAU,IAAI,KAAK,UAAU,IAAI,KAAK,UAAU,IAAI,GAAG;AAEzF,aAAO,OAAO,CAAC,SAAsB;AACnC,YAAI,MAAM;AACR,oBAAU,IAAI,KAAK,CAAC,IAAI,GAAG,kBAAkB,EAAE,MAAM,YAAY,CAAC,CAAC;AAAA,QACrE,OAAO;AACL,mBAAS;AAAA,QACX;AAAA,MACF,GAAG,WAAW;AAAA,IAChB,SAAS,KAAK;AACZ,cAAQ,MAAM,2CAA2C,GAAG;AAC5D,eAAS;AAAA,IACX;AAAA,EACF;AAEA,QAAM,cAAc,UAAU;AAE9B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA,OAAO;AAAA,QACL,UAAU;AAAA,QACV,OAAO;AAAA,QACP;AAAA,QACA,QAAQ,cAAc,YAAY;AAAA,QAClC,YAAY;AAAA,QACZ,YAAY,UAAU,cAAc,qBAAqB;AAAA,QACzD,YAAY;AAAA,QACZ,SAAS,cAAc,IAAI;AAAA,QAC3B,eAAe,cAAc,SAAS;AAAA,MACxC;AAAA,MAEC;AAAA,SAAC,eACA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,UAAU;AAAA,cACV,KAAK;AAAA,cACL,MAAM;AAAA,cACN,WAAW;AAAA,cACX,YAAY;AAAA,cACZ,OAAO;AAAA,cACP,SAAS;AAAA,cACT,cAAc;AAAA,cACd,UAAU;AAAA,cACV,YAAY;AAAA,cACZ,eAAe;AAAA,cACf,YAAY;AAAA,cACZ,gBAAgB;AAAA,YAClB;AAAA,YACD;AAAA;AAAA,QAED;AAAA,QAGD,QAAQ,UAAU,eACjB;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,UAAU;AAAA,cACV,MAAM,KAAK;AAAA,cACX,KAAK,KAAK;AAAA,cACV,OAAO,KAAK;AAAA,cACZ,QAAQ,KAAK;AAAA,cACb,YAAY;AAAA,cACZ,QAAQ;AAAA,cACR,WAAW;AAAA,cACX,eAAe;AAAA,YACjB;AAAA;AAAA,QACF;AAAA;AAAA;AAAA,EAEJ;AAEJ;;;AC5KA,SAAS,oBAAoB;;;AH0VnB,SAwQM,UAxQN,OAAAC,MAkDI,QAAAC,aAlDJ;AAjTV,IAAM,aAAyB,CAAC,MAAM,MAAM,MAAM,IAAI;AACtD,IAAM,YAAsC;AAAA,EAC1C,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AAKA,SAAS,kBAAkB;AACzB,MAAI,OAAO,aAAa,YAAa;AACrC,MAAI,SAAS,eAAe,WAAW,EAAG;AAC1C,QAAM,IAAI,SAAS,cAAc,OAAO;AACxC,IAAE,KAAK;AACP,IAAE,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA6BhB,WAAS,KAAK,YAAY,CAAC;AAC7B;AAEO,SAAS,WAAW;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,mBAAmB;AAAA,EACnB,mBAAmB;AAAA,EACnB,mBAAmB;AAAA,EACnB,wBAAwB;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAU;AACR,QAAM,SAAS,MAAM,UAAU;AAC/B,QAAM,EAAE,YAAY,UAAU,IAAI;AAClC,QAAM,EAAE,EAAE,IAAI,eAAe;AAC7B,QAAM,SAAS,aAAa,KAAK;AACjC,QAAM,SAAS,UAAU;AAGzB,QAAM,gBAAgB,CAAC;AACvB,QAAM,CAAC,cAAc,eAAe,IAAIC,UAAS,MAAM;AACrD,QAAI,MAAM,KAAM,QAAO,KAAK;AAC5B,QAAI;AACF,aAAO,aAAa,QAAQ,qBAAqB,KAAK;AAAA,IACxD,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF,CAAC;AACD,QAAM,CAAC,eAAe,gBAAgB,IAAIA,UAAS,MAAM;AACvD,QAAI,MAAM,MAAO,QAAO,KAAK;AAC7B,QAAI;AACF,aAAO,aAAa,QAAQ,sBAAsB,KAAK;AAAA,IACzD,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF,CAAC;AAED,QAAM,CAAC,UAAU,WAAW,IAAIA,UAAmB,IAAI;AACvD,QAAM,CAAC,aAAa,cAAc,IAAIA,UAAS,EAAE;AACjD,QAAM,CAAC,kBAAkB,mBAAmB,IAAIA,UAAS,EAAE;AAC3D,QAAM,CAAC,YAAY,aAAa,IAAIA,UAAsB,IAAI;AAC9D,QAAM,CAAC,YAAY,aAAa,IAAIA,UAAS,KAAK;AAClD,QAAM,CAAC,QAAQ,SAAS,IAAIA,UAAiB,MAAM;AACnD,QAAM,CAAC,QAAQ,SAAS,IAAIA,UAA8B,IAAI;AAC9D,QAAM,CAAC,UAAU,WAAW,IAAIA,UAAS,EAAE;AAI3C,QAAM,sBAAsB,oBAAoB,CAAC,CAAC;AAClD,QAAM,mBAAmB,oBAAoB;AAC7C,QAAM,CAAC,MAAM,OAAO,IAAIA,UAA8B,uBAAuB,CAAC,mBAAmB,SAAS,UAAU;AACpH,QAAM,CAAC,MAAM,OAAO,IAAIA,UAAqC,sBAAsB,SAAS,KAAK;AACjG,QAAM,CAAC,cAAc,eAAe,IAAIA,UAAS,gBAAgB;AACjE,QAAM,CAAC,eAAe,gBAAgB,IAAIA,UAAS,EAAE;AAGrD,QAAM,CAAC,oBAAoB,qBAAqB,IAAIA,UAAS,EAAE;AAC/D,QAAM,CAAC,gBAAgB,iBAAiB,IAAIA,UAAS,EAAE;AACvD,QAAM,CAAC,UAAU,WAAW,IAAIA;AAAA,IAC9B,OAAO,aAAa,cAAc,SAAS,gBAAgB,MAAM,MAAM,GAAG,EAAE,CAAC,KAAK,OAAO;AAAA,EAC3F;AAEA,QAAM,UAAUC,QAAyB,IAAI;AAC7C,QAAM,aAAaA,QAAuB,IAAI;AAE9C,EAAAC,WAAU,MAAM;AACd,oBAAgB;AAAA,EAClB,GAAG,CAAC,CAAC;AAEL,EAAAA,WAAU,MAAM;AACd,UAAM,UAAU,CAAC,MAAqB;AACpC,UAAI,EAAE,QAAQ,YAAY,WAAW,aAAc,SAAQ;AAAA,IAC7D;AACA,WAAO,iBAAiB,WAAW,OAAO;AAC1C,WAAO,MAAM,OAAO,oBAAoB,WAAW,OAAO;AAAA,EAC5D,GAAG,CAAC,SAAS,MAAM,CAAC;AAEpB,QAAM,qBAAqB;AAAA,IACzB,CAAC,MAAwB;AACvB,UAAI,EAAE,WAAW,WAAW,WAAW,WAAW,aAAc,SAAQ;AAAA,IAC1E;AAAA,IACA,CAAC,SAAS,MAAM;AAAA,EAClB;AAEA,QAAM,eAAe,OAAO,MAAuB;AACjD,MAAE,eAAe;AACjB,UAAM,SAAS,SAAS;AACxB,UAAM,YAAY,SAAS;AAC3B,QAAI,QAAQ;AACV,UAAI,CAAC,aAAa,KAAK,KAAK,CAAC,cAAc,KAAK,EAAG;AAAA,IACrD,WAAW,WAAW;AACpB,UAAI,CAAC,mBAAmB,KAAK,EAAG;AAAA,IAClC,OAAO;AACL,UAAI,CAAC,YAAY,KAAK,EAAG;AAAA,IAC3B;AAEA,cAAU,YAAY;AACtB,gBAAY,EAAE;AAEd,UAAM,gBAAyC;AAAA,MAC7C,GAAG;AAAA,MACH,aAAa,eAAe;AAAA,MAC5B,aAAa,eAAe;AAAA,MAC5B,eAAe,iBAAiB;AAAA,MAChC,YAAY,cAAc;AAAA,IAC5B;AAEA,QAAI,QAAQ;AACV,oBAAc,YAAY;AAAA,QACxB,UAAU,aAAa,KAAK;AAAA,QAC5B,WAAW,cAAc,KAAK;AAAA,QAC9B,MAAM;AAAA,MACR;AAAA,IACF;AAEA,QAAI,WAAW;AACb,oBAAc,iBAAiB;AAAA,QAC7B,SAAS,eAAe,KAAK;AAAA,MAC/B;AAAA,IACF;AAGA,QAAI,eAAe;AACjB,UAAI;AACF,YAAI,aAAa,KAAK,EAAG,cAAa,QAAQ,uBAAuB,aAAa,KAAK,CAAC;AACxF,YAAI,cAAc,KAAK,EAAG,cAAa,QAAQ,wBAAwB,cAAc,KAAK,CAAC;AAAA,MAC7F,QAAQ;AAAA,MAER;AAAA,IACF;AAEA,UAAM,UAAyB;AAAA,MAC7B,YAAY,MAAM,OAAO,cAAc,KAAK,KAAK;AAAA,MACjD,cAAc,MAAM,SAAS,aAAa,KAAK,KAAK;AAAA,MACpD,eAAe,MAAM,UAAU,cAAc,KAAK,KAAK;AAAA,MACvD,yBAAyB,MAAM;AAAA,MAC/B,aAAa,YACT,mBAAmB,KAAK,IACxB,SACE,iBAAiB,aAAa,KAAK,CAAC,aAAQ,cAAc,KAAK,CAAC,MAChE,YAAY,KAAK;AAAA,MACvB,kBAAkB,CAAC,UAAU,CAAC,YAAY,iBAAiB,KAAK,KAAK,SAAY;AAAA,MACjF,mBAAmB,qBAAqB,KAAK;AAAA,MAC7C,UAAU,UAAU,YAAY,OAAO;AAAA,MACvC,KAAK,OAAO,SAAS;AAAA,MACrB,MAAM;AAAA,MACN,OAAO,SAAS,SAAS,YAAY,YAAY;AAAA,MACjD,QAAQ,YAAY,oBAAoB,SAAS,eAAe;AAAA,MAChE,MAAM,YAAY,oBAAoB;AAAA,MACtC,YAAY,OAAO;AAAA,MACnB,SAAS,OAAO;AAAA,IAClB;AAEA,QAAI,gBAAgB;AAClB,YAAM,UAAU,MAAM,eAAe,OAAO;AAC5C,UAAI,CAAC,SAAS;AACZ,kBAAU,MAAM;AAChB;AAAA,MACF;AAAA,IACF;AAEA,QAAI;AACF,YAAM,MAAM,MAAM;AAAA,QAChB;AAAA,QACA;AAAA,QACA;AAAA,QACA,CAAC,UAAU,CAAC,YAAa,cAAc,SAAa;AAAA,MACtD;AACA,gBAAU,GAAG;AACb,gBAAU,SAAS;AACnB,kBAAY,GAAG;AAEf,YAAM,SAAS,gBAAgB;AAC/B,UAAI,OAAO,SAAS,GAAG;AACrB,qBAAa,WAAW,YAAY,IAAI,IAAI,MAAM,EAAE,MAAM,MAAM;AAAA,QAAC,CAAC;AAAA,MACpE;AAAA,IACF,SAAS,KAAK;AACZ,YAAM,QAAQ,eAAe,QAAQ,MAAM,IAAI,MAAM,EAAE,YAAY,CAAC;AACpE,kBAAY,MAAM,OAAO;AACzB,gBAAU,OAAO;AACjB,gBAAU,KAAK;AAAA,IACjB;AAAA,EACF;AAGA,QAAM,cAAc,SAAS,0BAA0B;AACvD,QAAM,aAAa,YAAY,OAAO,MAAM;AAE5C,QAAM,eAAoC;AAAA,IACxC,UAAU;AAAA,IACV,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,gBAAgB;AAAA,IAChB;AAAA,IACA,SAAS;AAAA,IACT,gBAAgB;AAAA,IAChB,sBAAsB;AAAA,IACtB,WAAW;AAAA,EACb;AAEA,QAAM,aAAkC;AAAA,IACtC,YAAY,OAAO;AAAA,IACnB,gBAAgB,OAAO;AAAA,IACvB,sBAAsB,OAAO;AAAA,IAC7B,cAAc;AAAA,IACd,WAAW,OAAO;AAAA,IAClB,QAAQ,aAAa,OAAO,MAAM;AAAA,IAClC,OAAO;AAAA,IACP,UAAU;AAAA,IACV,WAAW;AAAA,IACX,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,OAAO,OAAO;AAAA,IACd,WAAW;AAAA,EACb;AAEA,QAAM,aAAkC;AAAA,IACtC,OAAO;AAAA,IACP,SAAS;AAAA,IACT,cAAc;AAAA,IACd,QAAQ,aAAa,WAAW;AAAA,IAChC,YAAY,OAAO;AAAA,IACnB,OAAO,OAAO;AAAA,IACd,UAAU;AAAA,IACV,SAAS;AAAA,IACT,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,YAAY;AAAA,EACd;AAGA,MAAI,WAAW,gBAAgB,WAAW,WAAW;AACnD,UAAM,YAAY,WAAW;AAC7B,UAAM,aAAa,YACf,sBACA,aAAa,SAAS,2BAA2B,kBAAkB;AACvE,UAAM,eAAe,YAAY,YAAY,OAAO;AAEpD,WACE,gBAAAJ,KAAC,SAAI,OAAO,cACV,0BAAAC;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,QACP,MAAK;AAAA,QACL,cAAW;AAAA,QACX,cAAY,YAAY,EAAE,cAAc,IAAI,EAAE,SAAS;AAAA,QAEvD;AAAA,0BAAAD,KAAC,eAAY,QAAgB,aAA0B,WAAW,OAAO,SAAkB;AAAA,UAE3F,gBAAAC;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,gBACL,SAAS;AAAA,gBACT,WAAW;AAAA,gBACX,SAAS;AAAA,gBACT,eAAe;AAAA,gBACf,YAAY;AAAA,cACd;AAAA,cAGA;AAAA,gCAAAA,MAAC,SAAI,OAAO,EAAE,UAAU,YAAY,OAAO,IAAI,QAAQ,IAAI,cAAc,GAAG,GAE1E;AAAA,kCAAAD;AAAA,oBAAC;AAAA;AAAA,sBACC,OAAO;AAAA,wBACL,UAAU;AAAA,wBACV,OAAO;AAAA,wBACP,cAAc;AAAA,wBACd,QAAQ,eAAe,OAAO,MAAM;AAAA,wBACpC,WAAW;AAAA,wBACX,SAAS,YAAY,IAAI;AAAA,wBACzB,YAAY;AAAA,sBACd;AAAA;AAAA,kBACF;AAAA,kBAEA,gBAAAA;AAAA,oBAAC;AAAA;AAAA,sBACC,OAAO;AAAA,wBACL,UAAU;AAAA,wBACV,OAAO;AAAA,wBACP,cAAc;AAAA,wBACd,QAAQ,eAAe,OAAO,MAAM;AAAA,wBACpC,WAAW;AAAA,wBACX,SAAS,YAAY,IAAI;AAAA,wBACzB,YAAY;AAAA,sBACd;AAAA;AAAA,kBACF;AAAA,kBAEA,gBAAAA;AAAA,oBAAC;AAAA;AAAA,sBACC,OAAO;AAAA,wBACL,UAAU;AAAA,wBACV,OAAO;AAAA,wBACP,cAAc;AAAA,wBACd,QAAQ;AAAA,wBACR,gBAAgB;AAAA,wBAChB,WAAW,YAAY,SAAS;AAAA,wBAChC,YAAY;AAAA,sBACd;AAAA;AAAA,kBACF;AAAA,kBAEA,gBAAAC,MAAC,SAAI,OAAO,EAAE,UAAU,YAAY,OAAO,IAAI,cAAc,MAAM,GAEjE;AAAA,oCAAAD;AAAA,sBAAC;AAAA;AAAA,wBACC,OAAO;AAAA,0BACL,UAAU;AAAA,0BACV,OAAO;AAAA,0BACP,cAAc;AAAA,0BACd,YAAY,2BAA2B,OAAO,MAAM,OAAO,OAAO,WAAW;AAAA,0BAC7E,SAAS;AAAA,0BACT,YAAY;AAAA,0BACZ,gBAAgB;AAAA,0BAChB,WAAW,YAAY,SAAS;AAAA,0BAChC,SAAS,YAAY,IAAI;AAAA,0BACzB,YAAY;AAAA,wBACd;AAAA,wBAEA,0BAAAA,KAAC,aAAU,OAAO,OAAO,QAAQ,MAAM,IAAI;AAAA;AAAA,oBAC7C;AAAA,oBAEA,gBAAAA;AAAA,sBAAC;AAAA;AAAA,wBACC,OAAO;AAAA,0BACL,UAAU;AAAA,0BACV,OAAO;AAAA,0BACP,cAAc;AAAA,0BACd,YAAY;AAAA,0BACZ,SAAS;AAAA,0BACT,YAAY;AAAA,0BACZ,gBAAgB;AAAA,0BAChB,SAAS,YAAY,IAAI;AAAA,0BACzB,WAAW,YAAY,aAAa;AAAA,0BACpC,YAAY;AAAA,wBACd;AAAA,wBAEA,0BAAAA,KAAC,aAAU,MAAM,IAAI;AAAA;AAAA,oBACvB;AAAA,qBACF;AAAA,mBACF;AAAA,gBAGA,gBAAAC,MAAC,SAAI,OAAO,EAAE,UAAU,YAAY,QAAQ,IAAI,OAAO,QAAQ,cAAc,GAAG,GAC9E;AAAA,kCAAAD;AAAA,oBAAC;AAAA;AAAA,sBACC,OAAO;AAAA,wBACL,UAAU;AAAA,wBACV,OAAO;AAAA,wBACP,SAAS;AAAA,wBACT,YAAY;AAAA,wBACZ,gBAAgB;AAAA,wBAChB,UAAU;AAAA,wBACV,YAAY;AAAA,wBACZ,OAAO,OAAO;AAAA,wBACd,eAAe;AAAA,wBACf,SAAS,YAAY,IAAI;AAAA,wBACzB,YAAY;AAAA,wBACZ,eAAe;AAAA,sBACjB;AAAA,sBAEC,YAAE,SAAS;AAAA;AAAA,kBACd;AAAA,kBACA,gBAAAA;AAAA,oBAAC;AAAA;AAAA,sBACC,OAAO;AAAA,wBACL,UAAU;AAAA,wBACV,OAAO;AAAA,wBACP,SAAS;AAAA,wBACT,YAAY;AAAA,wBACZ,gBAAgB;AAAA,wBAChB,UAAU;AAAA,wBACV,YAAY;AAAA,wBACZ,OAAO,OAAO;AAAA,wBACd,eAAe;AAAA,wBACf,SAAS,YAAY,IAAI;AAAA,wBACzB,WAAW,YAAY,kBAAkB;AAAA,wBACzC,YAAY;AAAA,wBACZ,eAAe,YAAY,SAAS;AAAA,sBACtC;AAAA,sBAEC,YAAE,cAAc;AAAA;AAAA,kBACnB;AAAA,mBACF;AAAA,gBAGA,gBAAAC,MAAC,SAAI,OAAO,EAAE,UAAU,YAAY,WAAW,IAAI,OAAO,OAAO,GAE/D;AAAA,kCAAAA;AAAA,oBAAC;AAAA;AAAA,sBACC,OAAO;AAAA,wBACL,UAAU;AAAA,wBACV,OAAO;AAAA,wBACP,SAAS;AAAA,wBACT,YAAY;AAAA,wBACZ,gBAAgB;AAAA,wBAChB,KAAK;AAAA,wBACL,OAAO,OAAO;AAAA,wBACd,UAAU;AAAA,wBACV,SAAS,YAAY,IAAI;AAAA,wBACzB,YAAY;AAAA,wBACZ,eAAe;AAAA,sBACjB;AAAA,sBAEA;AAAA,wCAAAD,KAAC,UAAM,YAAE,kBAAkB,GAAE;AAAA,wBAC7B,gBAAAA,KAAC,eAAY,OAAO,OAAO,QAAQ;AAAA;AAAA;AAAA,kBACrC;AAAA,kBAEA,gBAAAC;AAAA,oBAAC;AAAA;AAAA,sBACC,OAAO;AAAA,wBACL,UAAU;AAAA,wBACV,OAAO;AAAA,wBACP,SAAS;AAAA,wBACT,eAAe;AAAA,wBACf,YAAY;AAAA,wBACZ,KAAK;AAAA,wBACL,SAAS,YAAY,IAAI;AAAA,wBACzB,WAAW,YAAY,kBAAkB;AAAA,wBACzC,YAAY;AAAA,wBACZ,eAAe,YAAY,SAAS;AAAA,sBACtC;AAAA,sBAEA;AAAA,wCAAAD,KAAC,OAAE,OAAO,EAAE,UAAU,IAAI,OAAO,OAAO,WAAW,QAAQ,EAAE,GAAI,mBAAS,OAAO,OAAO,EAAE,KAAK,IAAG;AAAA,wBACjG,iBAAiB,MAAM,MACtB,gBAAAC;AAAA,0BAAC;AAAA;AAAA,4BACC,MAAM,GAAG,aAAa,uBAAuB,mBAAmB,UAAU,CAAC,gBAAgB,mBAAmB,KAAK,EAAE,CAAC,eAAe,mBAAmB,SAAS,CAAC;AAAA,4BAClK,QAAO;AAAA,4BACP,KAAI;AAAA,4BACJ,OAAO;AAAA,8BACL,UAAU;AAAA,8BACV,OAAO,OAAO;AAAA,8BACd,gBAAgB;AAAA,8BAChB,YAAY;AAAA,8BACZ,WAAW;AAAA,4BACb;AAAA,4BAEC;AAAA;AAAA,8BAAe;AAAA,8BAAkB;AAAA;AAAA;AAAA,wBACpC;AAAA,wBAyBF,gBAAAD;AAAA,0BAAC;AAAA;AAAA,4BACC,SAAS;AAAA,4BACT,OAAO;AAAA,8BACL,OAAO;AAAA,8BACP,SAAS;AAAA,8BACT,cAAc;AAAA,8BACd,QAAQ;AAAA,8BACR,YAAY,2BAA2B,OAAO,MAAM,KAAK,OAAO,WAAW;AAAA,8BAC3E,OAAO,OAAO;AAAA,8BACd,UAAU;AAAA,8BACV,YAAY;AAAA,8BACZ,QAAQ;AAAA,8BACR,eAAe;AAAA,8BACf,WAAW;AAAA,8BACX,YAAY;AAAA,8BACZ,SAAS;AAAA,8BACT,YAAY;AAAA,8BACZ,gBAAgB;AAAA,8BAChB,KAAK;AAAA,4BACP;AAAA,4BAEC,YAAE,OAAO;AAAA;AAAA,wBACZ;AAAA;AAAA;AAAA,kBACF;AAAA,mBACF;AAAA;AAAA;AAAA,UACF;AAAA;AAAA;AAAA,IACF,GACF;AAAA,EAEJ;AAGA,SACE,gBAAAC,MAAA,YACG;AAAA,wBAAoB,cACnB,gBAAAD;AAAA,MAAC;AAAA;AAAA,QACC,QAAQ,SAAS;AAAA,QACjB,WAAW,CAAC,SAAS;AACnB,wBAAc,IAAI;AAClB,wBAAc,KAAK;AAAA,QACrB;AAAA,QACA,UAAU,MAAM,cAAc,KAAK;AAAA;AAAA,IACrC;AAAA,IAED,CAAC,cACA,gBAAAA,KAAC,SAAI,KAAK,YAAY,OAAO,cAAc,SAAS,oBAClD,0BAAAC,MAAC,SAAI,OAAO,YAAY,MAAK,UAAS,cAAW,QAAO,mBAAgB,qBACtE;AAAA,sBAAAD;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA;AAAA,UACA,WAAS;AAAA,UACT;AAAA,UACA,SAAQ;AAAA,UACR,OAAO,EAAE,YAAY;AAAA;AAAA,MACvB;AAAA,MAEA,gBAAAC,MAAC,UAAK,UAAU,cAAc,OAAO,EAAE,SAAS,iBAAiB,GAE9D;AAAA,iBAAS,cACR,gBAAAA,MAAA,YAEG;AAAA,2BACC,gBAAAA,MAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,KAAK,IAAI,cAAc,GAAG,GACvD;AAAA,4BAAAA,MAAC,SAAI,OAAO,EAAE,MAAM,EAAE,GACpB;AAAA,8BAAAD,KAAC,cAAW,QAAgB,SAAQ,uBACjC,YAAE,aAAa,WAAW,GAC7B;AAAA,cACA,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,IAAG;AAAA,kBACH,MAAK;AAAA,kBACL,OAAO;AAAA,kBACP,OAAO;AAAA,kBACP,UAAU,CAAC,MAAM,gBAAgB,EAAE,OAAO,KAAK;AAAA,kBAC/C,aAAY;AAAA;AAAA,cACd;AAAA,eACF;AAAA,YACA,gBAAAC,MAAC,SAAI,OAAO,EAAE,MAAM,EAAE,GACpB;AAAA,8BAAAD,KAAC,cAAW,QAAgB,SAAQ,wBACjC,YAAE,cAAc,OAAO,GAC1B;AAAA,cACA,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,IAAG;AAAA,kBACH,MAAK;AAAA,kBACL,OAAO;AAAA,kBACP,OAAO;AAAA,kBACP,UAAU,CAAC,MAAM,iBAAiB,EAAE,OAAO,KAAK;AAAA,kBAChD,aAAY;AAAA;AAAA,cACd;AAAA,eACF;AAAA,aACF;AAAA,UAIF,gBAAAA,KAAC,cAAW,QAAgB,4CAA8B;AAAA,UAC1D,gBAAAC,MAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,eAAe,UAAU,KAAK,GAAG,cAAc,GAAG,GAC/E;AAAA,4BAAAD;AAAA,cAAC;AAAA;AAAA,gBACC,OAAM;AAAA,gBACN,OAAM;AAAA,gBACN,UAAS;AAAA,gBACT;AAAA,gBACA;AAAA,gBACA,SAAS,MAAM;AACb,0BAAQ,KAAK;AACb,0BAAQ,MAAM;AAAA,gBAChB;AAAA;AAAA,YACF;AAAA,YACC,yBACC,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,OAAM;AAAA,gBACN,OAAM;AAAA,gBACN,UAAS;AAAA,gBACT;AAAA,gBACA;AAAA,gBACA,SAAS,MAAM;AACb,0BAAQ,SAAS;AACjB,0BAAQ,MAAM;AAAA,gBAChB;AAAA;AAAA,YACF;AAAA,YAED,oBACC,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,OAAM;AAAA,gBACN,OAAM;AAAA,gBACN,UAAS;AAAA,gBACT;AAAA,gBACA;AAAA,gBACA,SAAS,MAAM;AACb,0BAAQ,MAAM;AACd,0BAAQ,MAAM;AAAA,gBAChB;AAAA;AAAA,YACF;AAAA,aAEJ;AAAA,UAGA,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAS;AAAA,cACT,OAAO;AAAA,gBACL,OAAO;AAAA,gBACP,SAAS;AAAA,gBACT,YAAY;AAAA,gBACZ,QAAQ;AAAA,gBACR,QAAQ;AAAA,gBACR,UAAU;AAAA,gBACV,OAAO,OAAO;AAAA,gBACd,YAAY;AAAA,gBACZ,cAAc;AAAA,cAChB;AAAA,cAEC,YAAE,QAAQ;AAAA;AAAA,UACb;AAAA,WACF;AAAA,QAID,SAAS,UACR,gBAAAC,MAAA,YAEG;AAAA,WAAC,uBACA,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAS,MAAM,QAAQ,UAAU;AAAA,cACjC,OAAO;AAAA,gBACL,SAAS;AAAA,gBACT,YAAY;AAAA,gBACZ,KAAK;AAAA,gBACL,YAAY;AAAA,gBACZ,QAAQ;AAAA,gBACR,QAAQ;AAAA,gBACR,UAAU;AAAA,gBACV,YAAY;AAAA,gBACZ,OAAO,OAAO;AAAA,gBACd,YAAY;AAAA,gBACZ,SAAS;AAAA,gBACT,cAAc;AAAA,cAChB;AAAA,cACD;AAAA;AAAA,gBACI,SAAS,QAAQ,yBAAkB,SAAS,YAAY,8BAAuB;AAAA;AAAA;AAAA,UACpF;AAAA,UAID,SAAS,UACR,gBAAAA,MAAA,YACE;AAAA,4BAAAA,MAAC,SAAI,OAAO,EAAE,cAAc,GAAG,GAC7B;AAAA,8BAAAD,KAAC,cAAW,QAAgB,SAAQ,uBAAsB,2BAE1D;AAAA,cACA,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,IAAG;AAAA,kBACH,OAAO,EAAE,GAAG,YAAY,QAAQ,YAAY,WAAW,GAAG;AAAA,kBAC1D,OAAO;AAAA,kBACP,UAAU,CAAC,MAAM,gBAAgB,EAAE,OAAO,KAAK;AAAA,kBAC/C,aAAY;AAAA,kBACZ,UAAQ;AAAA;AAAA,cACV;AAAA,eACF;AAAA,YACA,gBAAAC,MAAC,SAAI,OAAO,EAAE,cAAc,GAAG,GAC7B;AAAA,8BAAAD,KAAC,cAAW,QAAgB,SAAQ,wBAAuB,kCAE3D;AAAA,cACA,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,IAAG;AAAA,kBACH,OAAO,EAAE,GAAG,YAAY,QAAQ,YAAY,WAAW,GAAG;AAAA,kBAC1D,OAAO;AAAA,kBACP,UAAU,CAAC,MAAM,iBAAiB,EAAE,OAAO,KAAK;AAAA,kBAChD,aAAY;AAAA,kBACZ,UAAQ;AAAA;AAAA,cACV;AAAA,eACF;AAAA,YACA,gBAAAC,MAAC,SAAI,OAAO,EAAE,cAAc,GAAG,GAC7B;AAAA,8BAAAD,KAAC,cAAW,QAAgB,SAAQ,mBAAkB,sBAEtD;AAAA,cACA,gBAAAC;AAAA,gBAAC;AAAA;AAAA,kBACC,IAAG;AAAA,kBACH,OAAO;AAAA,kBACP,UAAU,CAAC,MAAM,YAAY,EAAE,OAAO,KAAK;AAAA,kBAC3C,OAAO;AAAA,oBACL,GAAG;AAAA,oBACH,YAAY;AAAA,oBACZ,QAAQ;AAAA,kBACV;AAAA,kBAEA;AAAA,oCAAAD,KAAC,YAAO,OAAM,MAAK,0BAAY;AAAA,oBAC/B,gBAAAA,KAAC,YAAO,OAAM,MAAK,iDAAU;AAAA;AAAA;AAAA,cAC/B;AAAA,eACF;AAAA,aACF;AAAA,UAID,SAAS,aACR,gBAAAC,MAAA,YACE;AAAA,4BAAAA,MAAC,SAAI,OAAO,EAAE,cAAc,GAAG,GAC7B;AAAA,8BAAAD,KAAC,cAAW,QAAgB,SAAQ,6BAA4B,yBAEhE;AAAA,cACA,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,IAAG;AAAA,kBACH,OAAO,EAAE,GAAG,YAAY,QAAQ,YAAY,WAAW,GAAG;AAAA,kBAC1D,OAAO;AAAA,kBACP,UAAU,CAAC,MAAM,sBAAsB,EAAE,OAAO,KAAK;AAAA,kBACrD,aAAY;AAAA,kBACZ,UAAQ;AAAA;AAAA,cACV;AAAA,eACF;AAAA,YACA,gBAAAC,MAAC,SAAI,OAAO,EAAE,cAAc,GAAG,GAC7B;AAAA,8BAAAD,KAAC,cAAW,QAAgB,SAAQ,yBAAwB,sBAE5D;AAAA,cACA,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,IAAG;AAAA,kBACH,OAAO,EAAE,GAAG,YAAY,QAAQ,YAAY,WAAW,GAAG;AAAA,kBAC1D,OAAO;AAAA,kBACP,UAAU,CAAC,MAAM,kBAAkB,EAAE,OAAO,KAAK;AAAA,kBACjD,aAAY;AAAA;AAAA,cACd;AAAA,eACF;AAAA,aACF;AAAA,UAIF,gBAAAC;AAAA,YAAC;AAAA;AAAA,cACC,OAAO,EAAE,cAAc,IAAI,SAAS,SAAS,UAAU,SAAS,YAAY,SAAS,OAAU;AAAA,cAE/F;AAAA,gCAAAD,KAAC,cAAW,QAAiB,YAAE,eAAe,GAAE;AAAA,gBAChD,gBAAAA,KAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,qBAAqB,iBAAiB,KAAK,EAAE,GACzE,qBAAW,IAAI,CAAC,QACf,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBAEC;AAAA,oBACA,OAAO,EAAE,YAAY,GAAG,QAAQ;AAAA,oBAChC,UAAU,aAAa;AAAA,oBACvB,MAAM,EAAE,YAAY,GAAG,OAAO;AAAA,oBAC9B,OAAO,UAAU,GAAG;AAAA,oBACpB,QAAQ,OAAO;AAAA,oBACf,QAAQ;AAAA,oBACR,IAAI,OAAO;AAAA,oBACX,MAAM,OAAO;AAAA,oBACb,SAAS,MAAM,YAAY,GAAG;AAAA;AAAA,kBAVzB;AAAA,gBAWP,CACD,GACH;AAAA;AAAA;AAAA,UACF;AAAA,UAGC,SAAS,SACR,gBAAAC,MAAC,SAAI,OAAO,EAAE,cAAc,GAAG,GAC7B;AAAA,4BAAAD,KAAC,cAAW,QAAgB,SAAQ,qBACjC,YAAE,mBAAmB,GACxB;AAAA,YACA,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,IAAG;AAAA,gBACH,OAAO,EAAE,GAAG,YAAY,QAAQ,YAAY,WAAW,GAAG;AAAA,gBAC1D,OAAO;AAAA,gBACP,UAAU,CAAC,MAAM,eAAe,EAAE,OAAO,KAAK;AAAA,gBAC9C,aAAa,EAAE,yBAAyB;AAAA,gBACxC,UAAQ;AAAA;AAAA,YACV;AAAA,aACF;AAAA,UAID,SAAS,SACR,gBAAAC,MAAC,SAAI,OAAO,EAAE,cAAc,GAAG,GAC7B;AAAA,4BAAAD,KAAC,cAAW,QAAgB,SAAQ,kBACjC,YAAE,uBAAuB,GAC5B;AAAA,YACA,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,IAAG;AAAA,gBACH,OAAO,EAAE,GAAG,YAAY,QAAQ,YAAY,WAAW,GAAG;AAAA,gBAC1D,OAAO;AAAA,gBACP,UAAU,CAAC,MAAM,oBAAoB,EAAE,OAAO,KAAK;AAAA,gBACnD,aAAa,EAAE,6BAA6B;AAAA;AAAA,YAC9C;AAAA,aACF;AAAA,UAIF,gBAAAC;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,gBACL,cAAc;AAAA,gBACd,SAAS,SAAS,UAAU,SAAS,aAAa,CAAC,mBAAmB,SAAS;AAAA,cACjF;AAAA,cAEA;AAAA,gCAAAD,KAAC,cAAW,QAAiB,YAAE,iBAAiB,GAAE;AAAA,gBACjD,aACC,gBAAAC,MAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,GAAG,GAC3D;AAAA,kCAAAD;AAAA,oBAAC;AAAA;AAAA,sBACC,KAAK,IAAI,gBAAgB,UAAU;AAAA,sBACnC,KAAI;AAAA,sBACJ,OAAO;AAAA,wBACL,QAAQ;AAAA,wBACR,cAAc;AAAA,wBACd,WAAW;AAAA,wBACX,QAAQ,aAAa,WAAW;AAAA,sBAClC;AAAA;AAAA,kBACF;AAAA,kBACA,gBAAAA;AAAA,oBAAC;AAAA;AAAA,sBACC,OAAO;AAAA,wBACL,UAAU;AAAA,wBACV,OAAO,OAAO;AAAA,wBACd,MAAM;AAAA,wBACN,UAAU;AAAA,wBACV,cAAc;AAAA,wBACd,YAAY;AAAA,sBACd;AAAA,sBAEC,qBAAW;AAAA;AAAA,kBACd;AAAA,kBACA,gBAAAA;AAAA,oBAAC;AAAA;AAAA,sBACC,MAAK;AAAA,sBACL,SAAS,MAAM,cAAc,IAAI;AAAA,sBACjC,cAAW;AAAA,sBACX,OAAO;AAAA,wBACL,YAAY;AAAA,wBACZ,QAAQ;AAAA,wBACR,QAAQ;AAAA,wBACR,UAAU;AAAA,wBACV,OAAO,OAAO;AAAA,wBACd,YAAY;AAAA,wBACZ,SAAS;AAAA,wBACT,cAAc;AAAA,wBACd,YAAY;AAAA,sBACd;AAAA,sBACD;AAAA;AAAA,kBAED;AAAA,mBACF,IAEA,gBAAAC,MAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,KAAK,EAAE,GACpC;AAAA,kCAAAA;AAAA,oBAAC;AAAA;AAAA,sBACC,MAAK;AAAA,sBACL,SAAS,MAAM,QAAQ,SAAS,MAAM;AAAA,sBACtC,OAAO;AAAA,wBACL,MAAM;AAAA,wBACN,SAAS;AAAA,wBACT,YAAY;AAAA,wBACZ,gBAAgB;AAAA,wBAChB,KAAK;AAAA,wBACL,SAAS;AAAA,wBACT,cAAc;AAAA,wBACd,QAAQ,cAAc,WAAW;AAAA,wBACjC,QAAQ;AAAA,wBACR,UAAU;AAAA,wBACV,OAAO,OAAO;AAAA,wBACd,YAAY,OAAO;AAAA,wBACnB,YAAY;AAAA,sBACd;AAAA,sBACD;AAAA;AAAA,wBACK,EAAE,sBAAsB;AAAA;AAAA;AAAA,kBAC9B;AAAA,kBACA,gBAAAA;AAAA,oBAAC;AAAA;AAAA,sBACC,MAAK;AAAA,sBACL,SAAS,MAAM,cAAc,IAAI;AAAA,sBACjC,OAAO;AAAA,wBACL,MAAM;AAAA,wBACN,SAAS;AAAA,wBACT,YAAY;AAAA,wBACZ,gBAAgB;AAAA,wBAChB,KAAK;AAAA,wBACL,SAAS;AAAA,wBACT,cAAc;AAAA,wBACd,QAAQ,cAAc,WAAW;AAAA,wBACjC,QAAQ;AAAA,wBACR,UAAU;AAAA,wBACV,OAAO,OAAO;AAAA,wBACd,YAAY,OAAO;AAAA,wBACnB,YAAY;AAAA,sBACd;AAAA,sBACD;AAAA;AAAA,wBACK,EAAE,wBAAwB;AAAA;AAAA;AAAA,kBAChC;AAAA,mBACF;AAAA,gBAEF,gBAAAD;AAAA,kBAAC;AAAA;AAAA,oBACC,IAAG;AAAA,oBACH,KAAK;AAAA,oBACL,MAAK;AAAA,oBACL,QAAO;AAAA,oBACP,OAAO,EAAE,SAAS,OAAO;AAAA,oBACzB,UAAU,CAAC,MAAM,cAAc,EAAE,OAAO,QAAQ,CAAC,KAAK,IAAI;AAAA;AAAA,gBAC5D;AAAA;AAAA;AAAA,UACF;AAAA,UAGA,gBAAAC;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,gBACL,SAAS;AAAA,gBACT,YAAY;AAAA,gBACZ,KAAK;AAAA,gBACL,SAAS;AAAA,gBACT,cAAc;AAAA,gBACd,YAAY,SAAS,2BAA2B;AAAA,gBAChD,QAAQ,aAAa,SAAS,2BAA2B,oBAAoB;AAAA,gBAC7E,cAAc;AAAA,cAChB;AAAA,cAEA;AAAA,gCAAAD,KAAC,UAAK,OAAO,EAAE,UAAU,GAAG,GAAG,uBAAE;AAAA,gBACjC,gBAAAA,KAAC,UAAK,OAAO,EAAE,UAAU,IAAI,OAAO,OAAO,WAAW,YAAY,IAAI,GAAI,YAAE,YAAY,GAAE;AAAA;AAAA;AAAA,UAC5F;AAAA,UAGC,WAAW,WACV,gBAAAC;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,gBACL,SAAS;AAAA,gBACT,cAAc;AAAA,gBACd,YAAY;AAAA,gBACZ,QAAQ;AAAA,gBACR,OAAO;AAAA,gBACP,UAAU;AAAA,gBACV,cAAc;AAAA,cAChB;AAAA,cACD;AAAA;AAAA,gBACK,YAAY,EAAE,YAAY;AAAA;AAAA;AAAA,UAChC;AAAA,UAIF,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,OAAO;AAAA,gBACL,OAAO;AAAA,gBACP,SAAS;AAAA,gBACT,cAAc;AAAA,gBACd,QAAQ;AAAA,gBACR,YAAY,2BAA2B,OAAO,MAAM,KAAK,OAAO,WAAW;AAAA,gBAC3E,OAAO,OAAO;AAAA,gBACd,UAAU;AAAA,gBACV,YAAY;AAAA,gBACZ,QAAQ;AAAA,gBACR,eAAe;AAAA,gBACf,WAAW;AAAA,gBACX,YAAY;AAAA,gBACZ,SAAS;AAAA,gBACT,YAAY;AAAA,gBACZ,gBAAgB;AAAA,gBAChB,KAAK;AAAA,cACP;AAAA,cAEA;AAAA,gCAAAD,KAAC,aAAU,OAAO,OAAO,YAAY,MAAM,IAAI;AAAA,gBAC9C,EAAE,aAAa;AAAA;AAAA;AAAA,UAClB;AAAA,UAGA,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAS;AAAA,cACT,OAAO;AAAA,gBACL,OAAO;AAAA,gBACP,SAAS;AAAA,gBACT,WAAW;AAAA,gBACX,YAAY;AAAA,gBACZ,QAAQ;AAAA,gBACR,QAAQ;AAAA,gBACR,UAAU;AAAA,gBACV,OAAO,OAAO;AAAA,gBACd,YAAY;AAAA,gBACZ,cAAc;AAAA,cAChB;AAAA,cAEC,YAAE,QAAQ;AAAA;AAAA,UACb;AAAA,WACF;AAAA,SAEJ;AAAA,OACF,GACF;AAAA,KAEJ;AAEJ;AAIA,SAAS,YAAY;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAOG;AACD,SACE,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,KAAK;AAAA,QACL,SAAS;AAAA,QACT,cAAc,aAAa,WAAW;AAAA,MACxC;AAAA,MAGA;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,cAAc;AAAA,cACd,YAAY,2BAA2B,OAAO,MAAM,OAAO,OAAO,WAAW;AAAA,cAC7E,QAAQ,aAAa,OAAO,MAAM;AAAA,cAClC,SAAS;AAAA,cACT,YAAY;AAAA,cACZ,gBAAgB;AAAA,cAChB,YAAY;AAAA,YACd;AAAA,YAEA,0BAAAA,KAAC,aAAU,OAAO,OAAO,QAAQ,MAAM,IAAI;AAAA;AAAA,QAC7C;AAAA,QAEC,WAAW,QACV,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,IAAI;AAAA,YACJ,OAAO,EAAE,QAAQ,GAAG,UAAU,IAAI,YAAY,KAAK,OAAO,OAAO,MAAM,eAAe,WAAW,MAAM,EAAE;AAAA,YAExG;AAAA;AAAA,QACH,IAEA,gBAAAA,KAAC,UAAK,OAAO,EAAE,MAAM,GAAG,UAAU,IAAI,YAAY,KAAK,OAAO,OAAO,UAAU,GAAG,mBAAK;AAAA,QAGxF,aACC,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,SAAS;AAAA,YACT,cAAW;AAAA,YACX,OAAO;AAAA,cACL,YAAY;AAAA,cACZ,QAAQ;AAAA,cACR,QAAQ;AAAA,cACR,SAAS;AAAA,cACT,OAAO,OAAO;AAAA,cACd,UAAU;AAAA,cACV,YAAY;AAAA,cACZ,cAAc;AAAA,cACd,SAAS;AAAA,cACT,YAAY;AAAA,cACZ,gBAAgB;AAAA,cAChB,SAAS;AAAA,cACT,YAAY;AAAA,YACd;AAAA,YACD;AAAA;AAAA,QAED;AAAA;AAAA;AAAA,EAEJ;AAEJ;AAEA,SAAS,WAAW;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,OAAO;AAAA,QACL,SAAS;AAAA,QACT,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,OAAO,OAAO;AAAA,QACd,cAAc;AAAA,QACd,eAAe;AAAA,QACf,eAAe;AAAA,MACjB;AAAA,MAEC;AAAA;AAAA,EACH;AAEJ;AAEA,SAAS,YAAY,EAAE,MAAM,GAAsB;AACjD,SACE,gBAAAA,KAAC,UAAK,OAAO,EAAE,SAAS,eAAe,KAAK,GAAG,YAAY,SAAS,GACjE,WAAC,GAAG,GAAG,CAAC,EAAE,IAAI,CAAC,MACd,gBAAAA;AAAA,IAAC;AAAA;AAAA,MAEC,OAAO;AAAA,QACL,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,SAAS;AAAA,QACT,WAAW,gDAAgD,IAAI,GAAG;AAAA,MACpE;AAAA;AAAA,IARK;AAAA,EASP,CACD,GACH;AAEJ;AAeA,SAAS,mBAAmB;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAOG;AACD,SACE,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL;AAAA,MACA,OAAO;AAAA,QACL,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,KAAK;AAAA,QACL,SAAS;AAAA,QACT,cAAc;AAAA,QACd,QAAQ,aAAa,WAAW;AAAA,QAChC,YAAY,OAAO;AAAA,QACnB,QAAQ;AAAA,QACR,YAAY;AAAA,QACZ,WAAW;AAAA,QACX,YAAY;AAAA,MACd;AAAA,MACA,cAAc,CAAC,MAAM;AACnB,UAAE,cAAc,MAAM,cAAc,OAAO;AAC3C,UAAE,cAAc,MAAM,YAAY,aAAa,OAAO,MAAM;AAAA,MAC9D;AAAA,MACA,cAAc,CAAC,MAAM;AACnB,UAAE,cAAc,MAAM,cAAc;AACpC,UAAE,cAAc,MAAM,YAAY;AAAA,MACpC;AAAA,MAEA;AAAA,wBAAAD,KAAC,UAAK,OAAO,EAAE,UAAU,IAAI,YAAY,GAAG,YAAY,EAAE,GAAI,iBAAM;AAAA,QACpE,gBAAAC,MAAC,SACC;AAAA,0BAAAD,KAAC,SAAI,OAAO,EAAE,UAAU,IAAI,YAAY,KAAK,OAAO,OAAO,MAAM,cAAc,EAAE,GAAI,iBAAM;AAAA,UAC3F,gBAAAA,KAAC,SAAI,OAAO,EAAE,UAAU,IAAI,OAAO,OAAO,UAAU,GAAI,oBAAS;AAAA,WACnE;AAAA,QACA,gBAAAA,KAAC,UAAK,OAAO,EAAE,YAAY,QAAQ,UAAU,IAAI,OAAO,OAAO,WAAW,YAAY,EAAE,GAAG,oBAAC;AAAA;AAAA;AAAA,EAC9F;AAEJ;AAEA,SAAS,eAAe,EAAE,KAAK,OAAO,UAAU,MAAM,OAAO,QAAQ,QAAQ,IAAI,MAAM,QAAQ,GAAgB;AAC7G,SACE,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,OAAO;AAAA,MACP;AAAA,MACA,OAAO;AAAA,QACL,SAAS;AAAA,QACT,cAAc;AAAA,QACd,QAAQ,WAAW,aAAa,MAAM,KAAK,eAAe,MAAM;AAAA,QAChE,YAAY,WAAW,GAAG,MAAM,OAAO;AAAA,QACvC,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,eAAe;AAAA,QACf,YAAY;AAAA,QACZ,KAAK;AAAA,QACL,YAAY;AAAA,QACZ,YAAY;AAAA,MACd;AAAA,MAEA;AAAA,wBAAAD,KAAC,UAAK,OAAO,EAAE,OAAO,GAAG,QAAQ,GAAG,cAAc,OAAO,YAAY,OAAO,SAAS,QAAQ,GAAG;AAAA,QAChG,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,UAAU;AAAA,cACV,YAAY,WAAW,MAAM;AAAA,cAC7B,OAAO,WAAW,SAAS;AAAA,cAC3B,eAAe;AAAA,YACjB;AAAA,YAEC;AAAA;AAAA,QACH;AAAA,QACA,gBAAAA,KAAC,UAAK,OAAO,EAAE,UAAU,IAAI,OAAO,WAAW,SAAS,MAAM,SAAS,KAAK,eAAe,SAAS,GACjG,iBACH;AAAA;AAAA;AAAA,EACF;AAEJ;AAEA,SAAS,UAAU,EAAE,QAAQ,gBAAgB,OAAO,GAAG,GAAsC;AAC3F,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,QAAQ;AAAA,MACR,aAAY;AAAA,MACZ,eAAc;AAAA,MACd,gBAAe;AAAA,MACf,eAAY;AAAA,MAEZ,0BAAAA,KAAC,UAAK,GAAE,mCAAkC;AAAA;AAAA,EAC5C;AAEJ;AAEA,SAAS,UAAU,EAAE,OAAO,GAAG,GAAsB;AACnD,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,QAAO;AAAA,MACP,aAAY;AAAA,MACZ,eAAc;AAAA,MACd,gBAAe;AAAA,MACf,eAAY;AAAA,MAEZ,0BAAAA,KAAC,cAAS,QAAO,kBAAiB;AAAA;AAAA,EACpC;AAEJ;;;AIpzCA,SAAS,SAAAK,cAAoC;AAE7C,SAAS,eAAAC,cAAa,aAAAC,YAAW,UAAAC,SAAQ,YAAAC,iBAAgB;AACzD,SAAS,iBAAiB,kBAAAC,uBAAsB;;;ACHhD,SAAS,0BAA0B;;;ACAnC,SAAS,sBAAsB;AAC/B,SAAS,wBAAwB;;;ACDjC;AAAA,EACE,aAAe;AAAA,EACf,YAAc;AAAA,EACd,eAAiB;AAAA,EACjB,kBAAoB;AAAA,EACpB,kBAAoB;AAAA,EACpB,kBAAoB;AAAA,EACpB,kBAAoB;AAAA,EACpB,mBAAqB;AAAA,EACrB,mBAAqB;AAAA,EACrB,mBAAqB;AAAA,EACrB,mBAAqB;AAAA,EACrB,mBAAqB;AAAA,EACrB,yBAA2B;AAAA,EAC3B,uBAAyB;AAAA,EACzB,6BAA+B;AAAA,EAC/B,iBAAmB;AAAA,EACnB,uBAAyB;AAAA,EACzB,sBAAwB;AAAA,EACxB,wBAA0B;AAAA,EAC1B,aAAe;AAAA,EACf,OAAS;AAAA,EACT,cAAgB;AAAA,EAChB,kBAAoB;AAAA,EACpB,eAAiB;AAAA,EACjB,cAAgB;AAAA,EAChB,YAAc;AAAA,EACd,YAAc;AAAA,EACd,QAAU;AAAA,EACV,SAAW;AAAA,EACX,kBAAoB;AACtB;;;AD3BO,IAAM,aAAgD,eAAe;AAE5E,WAAW,IAAI,gBAAgB,EAAE,KAAK;AAAA,EACpC,KAAK;AAAA,EACL,aAAa;AAAA,EACb,WAAW,EAAE,SAAS,EAAE,aAAa,WAAG,EAAE;AAAA,EAC1C,eAAe,EAAE,aAAa,MAAM;AAAA,EACpC,eAAe;AAAA,EACf,mBAAmB;AACrB,CAAC;AAED,IAAO,eAAQ;;;AEff,SAAS,aAAa,iBAAiB;AACvC,SAAS,4BAA4B;AAErC,SAAS,wBAAwB,SAAAC,cAAa;AAEvC,SAAS,gBAAgB;AAC9B,SAAO,qBAAqB,WAAW,WAAW;AACpD;;;AJYM,SAyGF,YAAAC,WAzGE,OAAAC,MA2GA,QAAAC,aA3GA;AATC,SAAS,YAAY,OAAyB;AACnD,QAAM,EAAE,SAAS,QAAQ,IAAI;AAE7B,EAAAC,WAAU,MAAM;AACd,iBAAW,eAAe,MAAM;AAAA,EAClC,GAAG,CAAC,MAAM,CAAC;AAEX,SACE,gBAAAF,KAAC,mBAAgB,MAAM,cACrB,0BAAAA,KAAC,iBAAe,GAAG,OAAO,GAC5B;AAEJ;AAEA,SAAS,cAAc;AAAA,EACrB;AAAA,EACA,QAAQ;AAAA,EACR,SAAS;AAAA,EACT;AAAA,EACA,mBAAmB;AAAA,EACnB,mBAAmB;AAAA,EACnB,wBAAwB;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAqB;AAEnB,MAAI,CAACG,OAAM,cAAc,GAAG;AAC1B,UAAM,IAAI,MAAM,4DAA4D;AAAA,EAC9E;AAEA,QAAM,SAASA,OAAM,UAAU;AAC/B,QAAM,cAAc,cAAc;AAClC,QAAM,eAAe,YAAY,QAAQ,OAAO;AAEhD,QAAM,EAAE,EAAE,IAAIC,gBAAe;AAC7B,QAAM,eAAeC,QAAO,CAAC;AAC7B,QAAM,CAAC,MAAM,OAAO,IAAIC,UAAS,KAAK;AACtC,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAS,KAAK;AAC5C,QAAM,mBAAmBD,QAAO,EAAE;AAClC,QAAM,SAAS,aAAa,KAAK;AAGjC,QAAM,CAAC,kBAAkB,mBAAmB,IAAIC,UAItC,IAAI;AACd,QAAM,aAAaD,QAA0B,IAAI;AACjD,QAAM,aAAaA,QAA0B,IAAI;AAEjD,QAAM,gBAAgBE,aAAY,CAAC,MAAkB;AACnD,UAAM,SAAS,EAAE;AAEjB,QAAI,WAAW,SAAS,SAAS,MAAM,EAAG;AAC1C,QAAI,WAAW,SAAS,SAAS,MAAM,EAAG;AAG1C,0BAAsB,MAAM;AAC1B,YAAM,MAAM,OAAO,aAAa;AAChC,YAAM,OAAO,KAAK,SAAS,EAAE,KAAK,KAAK;AACvC,UAAI,KAAK,SAAS,GAAG;AACnB,4BAAoB,IAAI;AACxB;AAAA,MACF;AAEA,YAAM,QAAQ,KAAK,WAAW,CAAC;AAC/B,UAAI,CAAC,MAAO;AACZ,YAAM,OAAO,MAAM,sBAAsB;AACzC,0BAAoB;AAAA,QAClB;AAAA,QACA,GAAG,KAAK,OAAO,KAAK,QAAQ;AAAA,QAC5B,GAAG,KAAK,MAAM;AAAA,MAChB,CAAC;AAAA,IACH,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAEL,QAAM,wBAAwBA,aAAY,MAAM;AAC9C,UAAM,OAAO,OAAO,aAAa,GAAG,SAAS,EAAE,KAAK,KAAK;AACzD,QAAI,KAAK,SAAS,EAAG,qBAAoB,IAAI;AAAA,EAC/C,GAAG,CAAC,CAAC;AAEL,EAAAL,WAAU,MAAM;AACd,aAAS,iBAAiB,WAAW,aAAa;AAClD,aAAS,iBAAiB,mBAAmB,qBAAqB;AAClE,WAAO,MAAM;AACX,eAAS,oBAAoB,WAAW,aAAa;AACrD,eAAS,oBAAoB,mBAAmB,qBAAqB;AAAA,IACvE;AAAA,EACF,GAAG,CAAC,eAAe,qBAAqB,CAAC;AAEzC,QAAM,oBAAoB,CAAC,SAAiB;AAC1C,qBAAiB,UAAU;AAC3B,wBAAoB,IAAI;AACxB,iBAAa,UAAU,KAAK,IAAI;AAChC,YAAQ,IAAI;AACZ,aAAS;AAAA,EACX;AAGA,QAAM,kBAAkBG,QAAO,KAAK;AACpC,MAAI,CAAC,gBAAgB,WAAW,OAAO,gBAAgB,CAACF,OAAM,YAAY,GAAG,YAAY;AAGvF,oBAAgB,UAAU;AAAA,EAC5B;AAEA,QAAM,SAASA,OAAM,YAAY;AAEjC,QAAM,QAAQ,eAAe,EAAE,aAAa;AAE5C,SACE,gBAAAF,MAAAF,WAAA,EAEE;AAAA,oBAAAE;AAAA,MAAC;AAAA;AAAA,QACC,KAAK;AAAA,QACL,aAAa,MAAM;AACjB,2BAAiB,UAAU,OAAO,aAAa,GAAG,SAAS,EAAE,KAAK,KAAK;AAAA,QACzE;AAAA,QACA,SAAS,MAAM;AACb,uBAAa,UAAU,KAAK,IAAI;AAChC,kBAAQ,IAAI;AACZ,mBAAS;AAAA,QACX;AAAA,QACA,cAAc,MAAM,WAAW,IAAI;AAAA,QACnC,cAAc,MAAM,WAAW,KAAK;AAAA,QACpC,cAAY;AAAA,QACZ,OAAO;AAAA,UACL,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,OAAO;AAAA,UACP,QAAQ,SAAS;AAAA,UACjB,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,KAAK;AAAA,UACL,SAAS;AAAA,UACT,cAAc;AAAA,UACd,QAAQ;AAAA,UACR,YAAY,2BAA2B,OAAO,MAAM,KAAK,OAAO,WAAW;AAAA,UAC3E,OAAO,OAAO;AAAA,UACd,UAAU;AAAA,UACV,YAAY;AAAA,UACZ,QAAQ;AAAA,UACR,WAAW,UACP,YAAY,OAAO,MAAM,mCACzB,YAAY,OAAO,MAAM;AAAA,UAC7B,YAAY;AAAA,UACZ,WAAW,UAAU,qBAAqB;AAAA,UAC1C,YAAY;AAAA,UACZ,eAAe;AAAA,QACjB;AAAA,QAEA;AAAA,0BAAAD,KAACQ,YAAA,EAAU;AAAA,UACV;AAAA;AAAA;AAAA,IACH;AAAA,IAGC,oBAAoB,oBAAoB,CAAC,QACxC,gBAAAP;AAAA,MAAC;AAAA;AAAA,QACC,KAAK;AAAA,QACL,SAAS,MAAM,kBAAkB,iBAAiB,IAAI;AAAA,QACtD,OAAO;AAAA,UACL,UAAU;AAAA,UACV,MAAM,KAAK,IAAI,GAAG,KAAK,IAAI,iBAAiB,IAAI,IAAI,OAAO,aAAa,GAAG,CAAC;AAAA,UAC5E,KAAK,KAAK,IAAI,GAAG,iBAAiB,IAAI,EAAE;AAAA,UACxC,QAAQ,SAAS;AAAA,UACjB,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,KAAK;AAAA,UACL,SAAS;AAAA,UACT,cAAc;AAAA,UACd,QAAQ;AAAA,UACR,YAAY,2BAA2B,OAAO,MAAM,KAAK,OAAO,WAAW;AAAA,UAC3E,OAAO,OAAO;AAAA,UACd,UAAU;AAAA,UACV,YAAY;AAAA,UACZ,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,WAAW,yCAAyC,OAAO,MAAM;AAAA,UACjE,WAAW;AAAA,UACX,YAAY;AAAA,QACd;AAAA,QAEA;AAAA,0BAAAD,KAAC,YAAS;AAAA,UAAE;AAAA;AAAA;AAAA,IAEd;AAAA,IAIF,gBAAAA,KAAC,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA,SAKN;AAAA,IAGD,QACC,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAM;AAAA,QACN,MAAM,OAAO;AAAA,QACb;AAAA,QACA;AAAA,QACA,SAAS,MAAM;AACb,kBAAQ,KAAK;AACb,oBAAU;AACV,2BAAiB,UAAU;AAAA,QAC7B;AAAA,QACA,gBAAgB;AAAA,QAChB,gBAAgB,MAAM,QAAQ,SAAS,WAAW,KAAK,CAAC;AAAA,QACxD,kBAAkB,MAAM,QAAQ,SAAS,WAAW,KAAK,CAAC;AAAA,QAC1D,eAAe,MAAM,QAAQ,YAAY,WAAW,KAAK,CAAC;AAAA,QAC1D,iBAAiB,MAAMG,OAAM,gBAAgB;AAAA,QAC7C,sBAAsB,MAAMA,OAAM,qBAAqB;AAAA,QACvD,kBAAkB,iBAAiB;AAAA,QACnC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA;AAAA,IACF;AAAA,KAEJ;AAEJ;AAEA,SAAS,WAAW;AAClB,SACE,gBAAAF;AAAA,IAAC;AAAA;AAAA,MACC,OAAM;AAAA,MACN,QAAO;AAAA,MACP,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,QAAO;AAAA,MACP,aAAY;AAAA,MACZ,eAAc;AAAA,MACd,gBAAe;AAAA,MACf,eAAY;AAAA,MAEZ;AAAA,wBAAAD,KAAC,UAAK,GAAE,YAAW;AAAA,QACnB,gBAAAA,KAAC,UAAK,GAAE,WAAU;AAAA,QAClB,gBAAAA,KAAC,UAAK,GAAE,YAAW;AAAA,QACnB,gBAAAA,KAAC,UAAK,GAAE,YAAW;AAAA;AAAA;AAAA,EACrB;AAEJ;AAEA,SAASQ,aAAY;AACnB,SACE,gBAAAR;AAAA,IAAC;AAAA;AAAA,MACC,OAAM;AAAA,MACN,QAAO;AAAA,MACP,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,QAAO;AAAA,MACP,aAAY;AAAA,MACZ,eAAc;AAAA,MACd,gBAAe;AAAA,MACf,eAAY;AAAA,MAEZ,0BAAAA,KAAC,UAAK,GAAE,mCAAkC;AAAA;AAAA,EAC5C;AAEJ;","names":["useEffect","useRef","useState","jsx","jsxs","useState","useRef","useEffect","Flint","useCallback","useEffect","useRef","useState","useTranslation","Flint","Fragment","jsx","jsxs","useEffect","Flint","useTranslation","useRef","useState","useCallback","SparkIcon"]}
1
+ {"version":3,"sources":["../src/FlintModal.tsx","../src/api.ts","../src/ScreenAnnotator.tsx","../src/theme.ts","../src/FlintWidget.tsx","../src/collectors/environment.ts","../src/i18n/index.ts","../src/i18n/locales/en.json","../src/store.ts"],"sourcesContent":["import {\n type ConsoleEntry,\n type EnvironmentInfo,\n Flint,\n type FlintUser,\n type FormErrorEntry,\n type NetworkEntry,\n type ReportPayload,\n type ReportResult,\n type Severity,\n type Theme,\n trackDatadogBugReported,\n} from \"@diegotsi/flint-core\";\nimport type { eventWithTime } from \"@rrweb/types\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { submitReplay, submitReport } from \"./api.js\";\nimport { ScreenAnnotator } from \"./ScreenAnnotator.js\";\nimport { resolveTheme } from \"./theme.js\";\n\ninterface Props {\n user?: FlintUser;\n meta?: Record<string, unknown>;\n theme: Theme;\n zIndex: number;\n onClose: () => void;\n getEnvironment: () => EnvironmentInfo;\n getConsoleLogs: () => ConsoleEntry[];\n getNetworkErrors: () => NetworkEntry[];\n getFormErrors: () => FormErrorEntry[];\n getReplayEvents: () => eventWithTime[];\n getExternalReplayUrl: () => string | undefined;\n initialSelection?: string;\n enableScreenshot?: boolean;\n enableTextIssues?: boolean;\n enableFeatureRequests?: 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 user,\n meta,\n theme,\n zIndex,\n onClose,\n getEnvironment,\n getConsoleLogs,\n getNetworkErrors,\n getFormErrors,\n getReplayEvents,\n getExternalReplayUrl,\n initialSelection = \"\",\n enableScreenshot = true,\n enableTextIssues = true,\n enableFeatureRequests = false,\n statusPageUrl,\n onBeforeSubmit,\n onSuccess,\n onError,\n}: Props) {\n const config = Flint.getConfig()!;\n const { projectKey, serverUrl } = config;\n const { t } = useTranslation();\n const colors = resolveTheme(theme);\n const isDark = theme === \"dark\";\n\n // Reporter identity: prop > localStorage > empty\n const needsIdentity = !user;\n const [reporterName, setReporterName] = useState(() => {\n if (user?.name) return user.name;\n try {\n return localStorage.getItem(\"flint_reporter_name\") ?? \"\";\n } catch {\n return \"\";\n }\n });\n const [reporterEmail, setReporterEmail] = useState(() => {\n if (user?.email) return user.email;\n try {\n return localStorage.getItem(\"flint_reporter_email\") ?? \"\";\n } catch {\n return \"\";\n }\n });\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 // Wizard step: selector screen → form screen\n // Skip selector if: text issue with initial selection, or no alternative modes enabled\n const hasInitialSelection = enableTextIssues && !!initialSelection;\n const hasMultipleModes = enableTextIssues || enableFeatureRequests;\n const [step, setStep] = useState<\"selector\" | \"form\">(hasInitialSelection || !hasMultipleModes ? \"form\" : \"selector\");\n const [mode, setMode] = useState<\"bug\" | \"text\" | \"feature\">(hasInitialSelection ? \"text\" : \"bug\");\n const [textOriginal, setTextOriginal] = useState(initialSelection);\n const [textSuggested, setTextSuggested] = useState(\"\");\n\n // Feature request mode\n const [featureDescription, setFeatureDescription] = useState(\"\");\n const [featureUseCase, setFeatureUseCase] = 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 const isFeature = mode === \"feature\";\n if (isText) {\n if (!textOriginal.trim() || !textSuggested.trim()) return;\n } else if (isFeature) {\n if (!featureDescription.trim()) return;\n } else {\n if (!description.trim()) return;\n }\n\n setStatus(\"submitting\");\n setErrorMsg(\"\");\n\n const collectedMeta: Record<string, unknown> = {\n ...meta,\n environment: getEnvironment(),\n consoleLogs: getConsoleLogs(),\n networkErrors: getNetworkErrors(),\n formErrors: getFormErrors(),\n };\n\n if (isText) {\n collectedMeta.textIssue = {\n original: textOriginal.trim(),\n suggested: textSuggested.trim(),\n lang: textLang,\n };\n }\n\n if (isFeature) {\n collectedMeta.featureRequest = {\n useCase: featureUseCase.trim(),\n };\n }\n\n // Save reporter identity to localStorage for next time\n if (needsIdentity) {\n try {\n if (reporterName.trim()) localStorage.setItem(\"flint_reporter_name\", reporterName.trim());\n if (reporterEmail.trim()) localStorage.setItem(\"flint_reporter_email\", reporterEmail.trim());\n } catch {\n /* localStorage unavailable */\n }\n }\n\n const payload: ReportPayload = {\n reporterId: user?.id ?? (reporterEmail.trim() || \"anonymous\"),\n reporterName: user?.name ?? (reporterName.trim() || \"Anonymous\"),\n reporterEmail: user?.email ?? (reporterEmail.trim() || undefined),\n reporterExtraAttributes: user?.extraAttributes,\n description: isFeature\n ? featureDescription.trim()\n : isText\n ? `[Text issue] \"${textOriginal.trim()}\" → \"${textSuggested.trim()}\"`\n : description.trim(),\n expectedBehavior: !isText && !isFeature ? expectedBehavior.trim() || undefined : undefined,\n externalReplayUrl: getExternalReplayUrl() || undefined,\n severity: isText || isFeature ? \"P3\" : severity,\n url: window.location.href,\n meta: collectedMeta,\n label: isText ? \"TEXT\" : isFeature ? \"FEATURE\" : undefined,\n source: isFeature ? \"feature_request\" : isText ? \"text_issue\" : \"widget\",\n type: isFeature ? \"FEATURE_REQUEST\" : \"BUG\",\n appVersion: config.appVersion,\n release: config.release,\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(\n serverUrl,\n projectKey,\n payload,\n !isText && !isFeature ? (screenshot ?? undefined) : undefined,\n );\n setResult(res);\n setStatus(\"success\");\n onSuccess?.(res);\n\n // Drop a marker on the Datadog RUM Session Replay timeline at the report\n // moment (no-op when Datadog RUM isn't on the page).\n trackDatadogBugReported({\n bugId: res.id,\n severity: payload.severity,\n url: payload.url,\n title: payload.description.slice(0, 120),\n });\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 {/* ── Step 1: Selector screen ──────────────────────────────── */}\n {step === \"selector\" && (\n <>\n {/* Reporter identity */}\n {needsIdentity && (\n <div style={{ display: \"flex\", gap: 10, marginBottom: 18 }}>\n <div style={{ flex: 1 }}>\n <FieldLabel colors={colors} htmlFor=\"flint-reporter-name\">\n {t(\"nameLabel\", \"Your name\")}\n </FieldLabel>\n <input\n id=\"flint-reporter-name\"\n type=\"text\"\n style={inputStyle}\n value={reporterName}\n onChange={(e) => setReporterName(e.target.value)}\n placeholder=\"Jane Doe\"\n />\n </div>\n <div style={{ flex: 1 }}>\n <FieldLabel colors={colors} htmlFor=\"flint-reporter-email\">\n {t(\"emailLabel\", \"Email\")}\n </FieldLabel>\n <input\n id=\"flint-reporter-email\"\n type=\"email\"\n style={inputStyle}\n value={reporterEmail}\n onChange={(e) => setReporterEmail(e.target.value)}\n placeholder=\"jane@company.com\"\n />\n </div>\n </div>\n )}\n\n {/* Type selector buttons */}\n <FieldLabel colors={colors}>What would you like to report?</FieldLabel>\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 8, marginBottom: 16 }}>\n <TypeSelectorButton\n emoji=\"🐛\"\n title=\"Bug Report\"\n subtitle=\"Something isn't working\"\n colors={colors}\n inputBorder={inputBorder}\n onClick={() => {\n setMode(\"bug\");\n setStep(\"form\");\n }}\n />\n {enableFeatureRequests && (\n <TypeSelectorButton\n emoji=\"💡\"\n title=\"Feature Request / Improvement\"\n subtitle=\"I have an idea or suggestion\"\n colors={colors}\n inputBorder={inputBorder}\n onClick={() => {\n setMode(\"feature\");\n setStep(\"form\");\n }}\n />\n )}\n {enableTextIssues && (\n <TypeSelectorButton\n emoji=\"✏️\"\n title=\"Text Issue\"\n subtitle=\"There's a text or translation problem\"\n colors={colors}\n inputBorder={inputBorder}\n onClick={() => {\n setMode(\"text\");\n setStep(\"form\");\n }}\n />\n )}\n </div>\n\n {/* Cancel */}\n <button\n type=\"button\"\n onClick={onClose}\n style={{\n width: \"100%\",\n padding: \"10px\",\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 </>\n )}\n\n {/* ── Step 2: Form screen ──────────────────────────────────── */}\n {step === \"form\" && (\n <>\n {/* Back button */}\n {!hasInitialSelection && (\n <button\n type=\"button\"\n onClick={() => setStep(\"selector\")}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 4,\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n fontSize: 13,\n fontWeight: 600,\n color: colors.textMuted,\n fontFamily: \"inherit\",\n padding: \"0 0 12px\",\n marginBottom: 4,\n }}\n >\n ← {mode === \"bug\" ? \"🐛 Bug Report\" : mode === \"feature\" ? \"💡 Feature Request\" : \"✏️ Text Issue\"}\n </button>\n )}\n\n {/* Text issue fields */}\n {mode === \"text\" && (\n <>\n <div style={{ marginBottom: 14 }}>\n <FieldLabel colors={colors} htmlFor=\"flint-text-original\">\n Original text\n </FieldLabel>\n <textarea\n id=\"flint-text-original\"\n style={{ ...inputStyle, resize: \"vertical\", minHeight: 60 }}\n value={textOriginal}\n onChange={(e) => setTextOriginal(e.target.value)}\n placeholder=\"Text that is wrong on screen…\"\n required\n />\n </div>\n <div style={{ marginBottom: 14 }}>\n <FieldLabel colors={colors} htmlFor=\"flint-text-suggested\">\n Suggested correction\n </FieldLabel>\n <textarea\n id=\"flint-text-suggested\"\n style={{ ...inputStyle, resize: \"vertical\", minHeight: 60 }}\n value={textSuggested}\n onChange={(e) => setTextSuggested(e.target.value)}\n placeholder=\"How it should read…\"\n required\n />\n </div>\n <div style={{ marginBottom: 20 }}>\n <FieldLabel colors={colors} htmlFor=\"flint-text-lang\">\n Language\n </FieldLabel>\n <select\n id=\"flint-text-lang\"\n value={textLang}\n onChange={(e) => setTextLang(e.target.value)}\n style={{\n ...inputStyle,\n appearance: \"none\",\n cursor: \"pointer\",\n }}\n >\n <option value=\"en\">English (en)</option>\n <option value=\"he\">עברית (he)</option>\n </select>\n </div>\n </>\n )}\n\n {/* Feature request fields */}\n {mode === \"feature\" && (\n <>\n <div style={{ marginBottom: 14 }}>\n <FieldLabel colors={colors} htmlFor=\"flint-feature-description\">\n Description\n </FieldLabel>\n <textarea\n id=\"flint-feature-description\"\n style={{ ...inputStyle, resize: \"vertical\", minHeight: 80 }}\n value={featureDescription}\n onChange={(e) => setFeatureDescription(e.target.value)}\n placeholder=\"Describe the feature you'd like to see...\"\n required\n />\n </div>\n <div style={{ marginBottom: 20 }}>\n <FieldLabel colors={colors} htmlFor=\"flint-feature-usecase\">\n Use case\n </FieldLabel>\n <textarea\n id=\"flint-feature-usecase\"\n style={{ ...inputStyle, resize: \"vertical\", minHeight: 72 }}\n value={featureUseCase}\n onChange={(e) => setFeatureUseCase(e.target.value)}\n placeholder=\"What problem would this solve for you?\"\n />\n </div>\n </>\n )}\n\n {/* Severity */}\n <div\n style={{ marginBottom: 18, display: mode === \"text\" || mode === \"feature\" ? \"none\" : undefined }}\n >\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\n style={{\n marginBottom: 20,\n display: mode === \"text\" || mode === \"feature\" || !enableScreenshot ? \"none\" : undefined,\n }}\n >\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={{\n height: 60,\n borderRadius: 8,\n objectFit: \"cover\",\n border: `1px solid ${inputBorder}`,\n }}\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 </>\n )}\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 TypeSelectorButton({\n emoji,\n title,\n subtitle,\n colors,\n inputBorder,\n onClick,\n}: {\n emoji: string;\n title: string;\n subtitle: string;\n colors: { backgroundSecondary: string; text: string; textMuted: string; accent: string };\n inputBorder: string;\n onClick: () => void;\n}) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 14,\n padding: \"14px 16px\",\n borderRadius: 12,\n border: `1px solid ${inputBorder}`,\n background: colors.backgroundSecondary,\n cursor: \"pointer\",\n fontFamily: \"inherit\",\n textAlign: \"left\",\n transition: \"border-color 0.15s, box-shadow 0.15s\",\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.borderColor = colors.accent;\n e.currentTarget.style.boxShadow = `0 0 0 1px ${colors.accent}40`;\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.borderColor = inputBorder;\n e.currentTarget.style.boxShadow = \"none\";\n }}\n >\n <span style={{ fontSize: 24, lineHeight: 1, flexShrink: 0 }}>{emoji}</span>\n <div>\n <div style={{ fontSize: 14, fontWeight: 600, color: colors.text, marginBottom: 2 }}>{title}</div>\n <div style={{ fontSize: 12, color: colors.textMuted }}>{subtitle}</div>\n </div>\n <span style={{ marginLeft: \"auto\", fontSize: 16, color: colors.textMuted, flexShrink: 0 }}>→</span>\n </button>\n );\n}\n\nfunction SeverityButton({ sev, label, selected, hint, color, accent, border, bg, text, onClick }: SevBtnProps) {\n return (\n <button\n type=\"button\"\n title={hint}\n onClick={onClick}\n style={{\n padding: \"9px 6px 8px\",\n borderRadius: 10,\n border: selected ? `2px solid ${accent}` : `1.5px solid ${border}`,\n background: selected ? `${accent}15` : bg,\n cursor: \"pointer\",\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n gap: 5,\n transition: \"border-color 0.12s, background 0.12s\",\n fontFamily: \"inherit\",\n }}\n >\n <span style={{ width: 8, height: 8, borderRadius: \"50%\", background: color, display: \"block\" }} />\n <span\n style={{\n fontSize: 13,\n fontWeight: selected ? 700 : 500,\n color: selected ? accent : text,\n letterSpacing: \"0.02em\",\n }}\n >\n {sev}\n </span>\n <span style={{ fontSize: 11, color: selected ? accent : text, opacity: 0.6, letterSpacing: \"0.02em\" }}>\n {label}\n </span>\n </button>\n );\n}\n\nfunction SparkIcon({ color = \"currentColor\", size = 14 }: { color?: string; size?: number }) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke={color}\n strokeWidth=\"2.2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M13 2L3 14h9l-1 8 10-12h-9l1-8z\" />\n </svg>\n );\n}\n\nfunction CheckIcon({ size = 20 }: { size?: number }) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"#22c55e\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n );\n}\n","export { submitReplay, submitReport } from \"@diegotsi/flint-core\";\n","import { domToCanvas } from \"modern-screenshot\";\nimport { useEffect, useRef, useState } from \"react\";\n\ninterface Props {\n zIndex: number;\n onCapture: (file: File) => void;\n onCancel: () => void;\n}\n\ntype Phase = \"idle\" | \"selecting\" | \"capturing\";\n\ninterface Rect {\n x: number;\n y: number;\n w: number;\n h: number;\n}\n\nfunction normalizeRect(startX: number, startY: number, endX: number, endY: number): Rect {\n return {\n x: Math.min(startX, endX),\n y: Math.min(startY, endY),\n w: Math.abs(endX - startX),\n h: Math.abs(endY - startY),\n };\n}\n\nexport function ScreenAnnotator({ zIndex, onCapture, onCancel }: Props) {\n const [phase, setPhase] = useState<Phase>(\"idle\");\n const [rect, setRect] = useState<Rect | null>(null);\n const startRef = useRef<{ x: number; y: number } | null>(null);\n const overlayRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") onCancel();\n };\n window.addEventListener(\"keydown\", onKey);\n return () => window.removeEventListener(\"keydown\", onKey);\n }, [onCancel]);\n\n const onMouseDown = (e: React.MouseEvent) => {\n e.preventDefault();\n startRef.current = { x: e.clientX, y: e.clientY };\n setPhase(\"selecting\");\n setRect({ x: e.clientX, y: e.clientY, w: 0, h: 0 });\n };\n\n const onMouseMove = (e: React.MouseEvent) => {\n if (phase !== \"selecting\" || !startRef.current) return;\n setRect(normalizeRect(startRef.current.x, startRef.current.y, e.clientX, e.clientY));\n };\n\n const onMouseUp = async (e: React.MouseEvent) => {\n if (phase !== \"selecting\" || !startRef.current) return;\n const finalRect = normalizeRect(startRef.current.x, startRef.current.y, e.clientX, e.clientY);\n startRef.current = null;\n\n if (finalRect.w < 5 || finalRect.h < 5) {\n setPhase(\"idle\");\n setRect(null);\n return;\n }\n\n setPhase(\"capturing\");\n\n const dpr = window.devicePixelRatio ?? 1;\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n\n // Wait for React to re-render + browser to paint so the overlay disappears\n await new Promise<void>((resolve) => requestAnimationFrame(() => requestAnimationFrame(() => resolve())));\n\n try {\n // Capture the visible viewport using modern-screenshot.\n // It clones only the visible area when width/height match the viewport.\n const fullCanvas = await domToCanvas(document.documentElement, {\n scale: dpr,\n width: vw,\n height: vh,\n style: {\n transform: `translate(-${window.scrollX}px, -${window.scrollY}px)`,\n },\n filter: (el) => el !== overlayRef.current,\n });\n\n // Crop canvas to viewport size (domToCanvas may produce a larger canvas)\n const canvas = document.createElement(\"canvas\");\n canvas.width = vw * dpr;\n canvas.height = vh * dpr;\n const ctx = canvas.getContext(\"2d\")!;\n ctx.drawImage(fullCanvas, 0, 0, vw * dpr, vh * dpr, 0, 0, vw * dpr, vh * dpr);\n\n // Draw annotation highlight — clientX/Y are viewport-relative\n ctx.fillStyle = \"rgba(255,200,0,0.25)\";\n ctx.fillRect(finalRect.x * dpr, finalRect.y * dpr, finalRect.w * dpr, finalRect.h * dpr);\n ctx.strokeStyle = \"#f97316\";\n ctx.lineWidth = 3 * dpr;\n ctx.strokeRect(finalRect.x * dpr, finalRect.y * dpr, finalRect.w * dpr, finalRect.h * dpr);\n\n canvas.toBlob((blob: Blob | null) => {\n if (blob) {\n onCapture(new File([blob], \"annotation.png\", { type: \"image/png\" }));\n } else {\n onCancel();\n }\n }, \"image/png\");\n } catch (err) {\n console.error(\"[Flint] ScreenAnnotator capture failed:\", err);\n onCancel();\n }\n };\n\n const isCapturing = phase === \"capturing\";\n\n return (\n <div\n ref={overlayRef}\n onMouseDown={onMouseDown}\n onMouseMove={onMouseMove}\n onMouseUp={onMouseUp}\n style={{\n position: \"fixed\",\n inset: 0,\n zIndex,\n cursor: isCapturing ? \"default\" : \"crosshair\",\n userSelect: \"none\",\n background: phase === \"selecting\" ? \"rgba(0,0,0,0.15)\" : \"rgba(0,0,0,0.05)\",\n transition: \"background 0.1s\",\n opacity: isCapturing ? 0 : 1,\n pointerEvents: isCapturing ? \"none\" : \"auto\",\n }}\n >\n {!isCapturing && (\n <div\n style={{\n position: \"absolute\",\n top: 16,\n left: \"50%\",\n transform: \"translateX(-50%)\",\n background: \"rgba(0,0,0,0.75)\",\n color: \"#fff\",\n padding: \"8px 18px\",\n borderRadius: 8,\n fontSize: 14,\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif',\n pointerEvents: \"none\",\n whiteSpace: \"nowrap\",\n backdropFilter: \"blur(4px)\",\n }}\n >\n Drag to highlight the problem area &nbsp;·&nbsp; Esc to cancel\n </div>\n )}\n\n {rect && phase === \"selecting\" && (\n <div\n style={{\n position: \"absolute\",\n left: rect.x,\n top: rect.y,\n width: rect.w,\n height: rect.h,\n background: \"rgba(255,200,0,0.2)\",\n border: \"2px dashed #f97316\",\n boxSizing: \"border-box\",\n pointerEvents: \"none\",\n }}\n />\n )}\n </div>\n );\n}\n","export { resolveTheme } from \"@diegotsi/flint-core\";\n","import { Flint, type FlintWidgetProps } from \"@diegotsi/flint-core\";\nimport type { eventWithTime } from \"@rrweb/types\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { I18nextProvider, useTranslation } from \"react-i18next\";\nimport { collectEnvironment } from \"./collectors/environment.js\";\nimport { FlintModal } from \"./FlintModal.js\";\nimport widgetI18n from \"./i18n/index.js\";\nimport { useFlintStore } from \"./store.js\";\nimport { resolveTheme } from \"./theme.js\";\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 buttonLabel,\n theme = \"dark\",\n zIndex = 9999,\n statusPageUrl,\n enableScreenshot = true,\n enableTextIssues = true,\n enableFeatureRequests = false,\n onBeforeSubmit,\n onSuccess,\n onError,\n onOpen,\n onClose,\n}: FlintWidgetProps) {\n // Flint.init() must be called before mounting the widget\n if (!Flint.isInitialized()) {\n throw new Error(\"[Flint] Call Flint.init() before mounting <FlintWidget />.\");\n }\n\n const config = Flint.getConfig()!;\n const globalState = useFlintStore();\n const resolvedUser = globalState.user ?? config.user;\n\n const { t } = useTranslation();\n const bugTimestamp = useRef(0);\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 bugTimestamp.current = Date.now();\n setOpen(true);\n onOpen?.();\n };\n\n // ── Inject rrweb replay recorder if not already initialized ─────────────\n const didInjectReplay = useRef(false);\n if (!didInjectReplay.current && config.enableReplay && !Flint.getInstance()?.stopReplay) {\n // The widget auto-injects the rrweb recorder when enableReplay is configured\n // but no _replayRecorder was provided (e.g. user called Flint.init without it)\n didInjectReplay.current = true;\n }\n\n const global = Flint.getInstance();\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 bugTimestamp.current = Date.now();\n setOpen(true);\n onOpen?.();\n }}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n aria-label={label}\n style={{\n position: \"fixed\",\n bottom: \"40px\",\n right: \"20px\",\n zIndex: zIndex - 1,\n display: \"flex\",\n alignItems: \"center\",\n gap: \"8px\",\n padding: \"10px 18px\",\n borderRadius: \"24px\",\n border: \"none\",\n background: `linear-gradient(135deg, ${colors.accent}, ${colors.accentHover})`,\n color: colors.buttonText,\n fontSize: \"13px\",\n fontWeight: 600,\n cursor: \"pointer\",\n boxShadow: hovered\n ? `0 0 28px ${colors.accent}55, 0 8px 24px rgba(0,0,0,0.3)`\n : `0 0 16px ${colors.accent}33, 0 4px 16px rgba(0,0,0,0.2)`,\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif',\n transform: hovered ? \"translateY(-2px)\" : \"translateY(0)\",\n transition: \"transform 0.15s ease, box-shadow 0.15s ease\",\n letterSpacing: \"0.01em\",\n }}\n >\n <SparkIcon />\n {label}\n </button>\n\n {/* Selection tooltip */}\n {enableTextIssues && selectionTooltip && !open && (\n <button\n ref={tooltipRef}\n onClick={() => openWithSelection(selectionTooltip.text)}\n style={{\n position: \"fixed\",\n left: Math.max(8, Math.min(selectionTooltip.x - 70, window.innerWidth - 148)),\n top: Math.max(8, selectionTooltip.y - 36),\n zIndex: zIndex + 1,\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n padding: \"6px 12px\",\n borderRadius: 10,\n border: \"none\",\n background: `linear-gradient(135deg, ${colors.accent}, ${colors.accentHover})`,\n color: colors.buttonText,\n fontSize: 12,\n fontWeight: 600,\n cursor: \"pointer\",\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif',\n boxShadow: `0 4px 20px rgba(0,0,0,0.25), 0 0 12px ${colors.accent}40`,\n animation: \"flint-tooltip-in 0.15s ease-out\",\n whiteSpace: \"nowrap\",\n }}\n >\n <TextIcon />\n Report text issue\n </button>\n )}\n\n {/* Tooltip animation */}\n <style>{`\n @keyframes flint-tooltip-in {\n from { opacity: 0; transform: translateY(4px); }\n to { opacity: 1; transform: translateY(0); }\n }\n `}</style>\n\n {/* Modal */}\n {open && (\n <FlintModal\n user={resolvedUser}\n meta={config.meta}\n theme={theme}\n zIndex={zIndex}\n onClose={() => {\n setOpen(false);\n onClose?.();\n pendingSelection.current = \"\";\n }}\n getEnvironment={collectEnvironment}\n getConsoleLogs={() => global?.console?.getEntries() ?? []}\n getNetworkErrors={() => global?.network?.getEntries() ?? []}\n getFormErrors={() => global?.formErrors?.getEntries() ?? []}\n getReplayEvents={() => Flint.getReplayEvents() as eventWithTime[]}\n getExternalReplayUrl={() => Flint.getExternalReplayUrl()}\n initialSelection={pendingSelection.current}\n enableScreenshot={enableScreenshot}\n enableTextIssues={enableTextIssues}\n enableFeatureRequests={enableFeatureRequests}\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 { collectEnvironment } from \"@diegotsi/flint-core\";\n","import { createInstance } from \"i18next\";\nimport { initReactI18next } from \"react-i18next\";\nimport en from \"./locales/en.json\";\n\nexport const widgetI18n: ReturnType<typeof createInstance> = createInstance();\n\nwidgetI18n.use(initReactI18next).init({\n lng: \"en-US\",\n fallbackLng: \"en-US\",\n resources: { \"en-US\": { translation: en } },\n interpolation: { escapeValue: false },\n initImmediate: false,\n showSupportNotice: false,\n});\n\nexport default widgetI18n;\n","{\n \"buttonLabel\": \"Report bug\",\n \"modalTitle\": \"Report an issue\",\n \"severityLabel\": \"Severity\",\n \"severity_P1_hint\": \"Critical — system down\",\n \"severity_P2_hint\": \"High — core feature broken\",\n \"severity_P3_hint\": \"Medium — noticeable but workable\",\n \"severity_P4_hint\": \"Low — cosmetic or improvement\",\n \"severity_P1_label\": \"Critical\",\n \"severity_P2_label\": \"High\",\n \"severity_P3_label\": \"Medium\",\n \"severity_P4_label\": \"Low\",\n \"whatIsBrokenLabel\": \"What Is Broken\",\n \"whatIsBrokenPlaceholder\": \"1–2 sentences: what is currently happening that should NOT happen.\",\n \"expectedBehaviorLabel\": \"Expected Behavior (optional)\",\n \"expectedBehaviorPlaceholder\": \"Describe exactly what the user should see or receive after the fix.\",\n \"screenshotLabel\": \"Screenshot (optional)\",\n \"screenshotPlaceholder\": \"Click to attach...\",\n \"screenshotAttachFile\": \"Attach file\",\n \"screenshotMarkOnScreen\": \"Mark on screen\",\n \"submitLabel\": \"Submit\",\n \"close\": \"Close\",\n \"successTitle\": \"Bug reported!\",\n \"successDuplicate\": \"Looks like a duplicate of an existing bug.\",\n \"successGitHub\": \"View GitHub issue\",\n \"successSlack\": \"View Slack message\",\n \"replayInfo\": \"No need to record your screen — we automatically capture a session replay when you submit.\",\n \"errorLabel\": \"Failed to submit. Please try again.\",\n \"cancel\": \"Cancel\",\n \"sending\": \"Sending report\",\n \"capturingContext\": \"Capturing context\"\n}\n","import { getSnapshot, subscribe } from \"@diegotsi/flint-core\";\nimport { useSyncExternalStore } from \"react\";\n\nexport { _setFormErrorCollector, Flint } from \"@diegotsi/flint-core\";\n\nexport function useFlintStore() {\n return useSyncExternalStore(subscribe, getSnapshot);\n}\n"],"mappings":"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","names":["useEffect","useRef","useState","jsx","jsxs","useState","useRef","useEffect","Flint","useCallback","useEffect","useRef","useState","useTranslation","Flint","Fragment","jsx","jsxs","useEffect","Flint","useTranslation","useRef","useState","useCallback","SparkIcon"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@diegotsi/flint-react",
3
- "version": "2.9.0",
3
+ "version": "2.10.0",
4
4
  "description": "Self-contained bug report widget for any React project",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -25,7 +25,7 @@
25
25
  "typecheck": "tsc --noEmit"
26
26
  },
27
27
  "dependencies": {
28
- "@diegotsi/flint-core": "^1.8.0",
28
+ "@diegotsi/flint-core": "^1.9.0",
29
29
  "fflate": "^0.8.2",
30
30
  "i18next": "^25.8.13",
31
31
  "modern-screenshot": "^4.6.8",