gotcha-feedback 1.1.7 → 1.1.8

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/constants.ts","../src/utils/localStorage.ts","../src/utils/generateId.ts","../src/utils/anonymous.ts","../src/utils/errorBuffer.ts","../src/utils/contextCollector.ts","../src/utils/offlineQueue.ts","../src/api/client.ts","../src/utils/deepMerge.ts","../src/theme/tokens.ts","../src/theme/resolveTheme.ts","../src/theme/styles.ts","../src/components/GotchaProvider.tsx","../src/hooks/useSubmit.ts","../src/hooks/useHideAfterSubmit.ts","../src/hooks/useTriggerConditions.ts","../src/utils/cn.ts","../src/utils/device.ts","../src/components/GotchaButton.tsx","../src/components/Spinner.tsx","../src/components/ScreenshotPreview.tsx","../src/components/modes/FeedbackMode.tsx","../src/components/modes/VoteMode.tsx","../src/components/modes/PollMode.tsx","../src/components/modes/NpsMode.tsx","../src/components/FollowUpPrompt.tsx","../src/components/GotchaModal.tsx","../src/components/Gotcha.tsx","../src/hooks/useScore.ts","../src/components/GotchaScore.tsx","../src/hooks/useGotcha.ts","../src/hooks/useGotchaTrigger.ts"],"names":["API_BASE_URL","STORAGE_KEYS","DEFAULTS","RETRY_CONFIG","safeGetItem","key","safeSetItem","value","generateId","c","getAnonymousId","stored","id","buffer","listening","pushError","message","source","entry","handleError","event","handleRejection","startErrorCapture","stopErrorCapture","getRecentErrors","collectContext","MAX_QUEUE_SIZE","MAX_AGE_MS","readQueue","raw","items","now","item","writeQueue","enqueue","payload","type","dequeue","getQueuedItems","getQueueLength","incrementRetries","DEFAULT_RETRY_CONFIG","fetchWithRetry","url","options","config","debug","lastError","attempt","response","error","delay","resolve","createApiClient","apiKey","baseUrl","flushing","headers","request","method","endpoint","body","idempotencyKey","data","user","fullPayload","err","elementId","userId","responseId","updatePayload","UNSAFE_KEYS","deepMerge","base","override","result","val","NPS_COLORS","LIGHT_TOKENS","DARK_TOKENS","createTheme","overrides","resolveTheme","theme","systemTheme","providerConfig","resolved","STYLE_ID","FONT_ID","FONT_FACE_ID","CARTER_ONE_FONT_FACE","injectFontFace","style","sanitizeCSS","generateStyleTag","easing","duration","fontFamily","textDisabled","borderColor","injectStyles","preconnect","preconnectStatic","link","styleEl","GotchaContext","createContext","EMPTY_USER","GotchaProvider","children","disabled","defaultUser","themeConfig","activeModalId","setActiveModalId","useState","client","useMemo","stableDefaultUser","useEffect","handleOnline","openModal","useCallback","closeModal","jsx","useGotchaContext","context","useContext","isResponseExpired","createdAt","cooldownDays","createdTime","ageMs","cooldownMs","useSubmit","isLoading","setIsLoading","isCheckingExisting","setIsCheckingExisting","setError","existingResponse","setExistingResponse","cancelled","existing","errorMessage","getStorageKey","checkIsHidden","resolvedUserId","hideAfterSubmitDays","hiddenUntilStr","useHideAfterSubmit","isHidden","setIsHidden","markHidden","hiddenUntil","getVisitKey","useTriggerConditions","showAfterSeconds","showAfterScrollPercent","showAfterVisits","hasConditions","timeMet","setTimeMet","scrollMet","setScrollMet","visitsMet","next","start","targetMs","check","timer","checkScroll","scrollHeight","viewportHeight","cn","classes","isTouchDevice","getResponsiveSize","size","isTouch","sizes","getInitialSystemTheme","GotchaButton","customStyles","showOnHover","touchBehavior","onClick","isOpen","isParentHovered","animated","queuedCount","setIsTouch","tapRevealed","setTapRevealed","setSystemTheme","isHovered","setIsHovered","isPressed","setIsPressed","hasPopped","setHasPopped","darkQuery","handler","e","shouldShow","handleClick","buttonSize","t","getTransform","baseStyles","jsxs","GotchaIcon","mounted","setMounted","Spinner","color","ScreenshotPreview","src","onRemove","FeedbackMode","placeholder","submitText","onSubmit","initialValues","isEditing","showText","showRating","enableBugFlag","bugFlagLabel","enableScreenshot","content","setContent","rating","setRating","isBug","setIsBug","screenshot","setScreenshot","capturingScreenshot","setCapturingScreenshot","canSubmit","handleScreenshotCapture","captureScreenshot","handleSubmit","inputStyles","buttonStyles","StarRating","onChange","large","hovered","setHovered","pulsing","setPulsing","pulseTimerRef","useRef","starSize","buttonPadding","star","isFilled","VoteMode","initialVote","labels","activeVote","setActiveVote","previousVote","setPreviousVote","handleVote","vote","getButtonStyles","voteType","isSelected","surface","border","iconSize","Fragment","ThumbsUpIcon","ThumbsDownIcon","PollMode","allowMultiple","initialSelected","selected","setSelected","handleToggle","option","prev","o","getOptionStyles","index","NpsMode","showFollowUp","followUpPlaceholder","lowLabel","highLabel","score","setScore","hoveredScore","setHoveredScore","npsColors","_","i","FollowUpPrompt","promptText","GotchaModal","mode","thankYouMessage","isSubmitted","phase","followUpConfig","followUpLoading","onFollowUpSubmit","voteLabels","npsQuestion","npsFollowUp","npsFollowUpPlaceholder","npsLowLabel","npsHighLabel","onClose","anchorRect","useFixedPosition","modalRef","firstFocusableRef","onCloseRef","isMobile","setIsMobile","showAbove","modal","handleKeyDown","focusableElements","firstElement","lastElement","defaultPrompt","modalPadding","modalWidth","animationClass","modalStyles","fadeUpStyle","isDefaultThankYou","Gotcha","onePerUser","followUp","position","visible","onOpen","onError","conditionsMet","setPhase","lastResponseId","setLastResponseId","setFollowUpLoading","setQueuedCount","setIsParentHovered","setAnchorRect","hasMounted","setHasMounted","containerRef","autoCloseTimerRef","lastSubmitDataRef","container","parent","handleMouseEnter","handleMouseLeave","submit","handleOpen","handleClose","handleFollowUpSubmit","effectiveSubmitText","positionStyles","modalProps","createPortal","useScore","refreshInterval","fetchScore","intervalId","SIZE_MAP","Stars","filledColor","emptyColor","clipId","stars","fill","PositiveBar","rate","height","trackColor","ThumbIcon","GotchaScore","variant","showCount","mq","s","ratingColor","mutedColor","starFilled","starEmpty","positiveColor","positiveTrack","baseStyle","countText","n","singular","label","voteCount","positiveRate","total","averageRating","totalResponses","displayRating","useGotcha","useGotchaTrigger","open","close"],"mappings":"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","file":"index.mjs","sourcesContent":["// API URL\nexport const API_BASE_URL = 'https://gotcha.cx/api/v1';\n\n// Error codes\nexport const ERROR_CODES = {\n INVALID_API_KEY: 'INVALID_API_KEY',\n ORIGIN_NOT_ALLOWED: 'ORIGIN_NOT_ALLOWED',\n RATE_LIMITED: 'RATE_LIMITED',\n QUOTA_EXCEEDED: 'QUOTA_EXCEEDED',\n INVALID_REQUEST: 'INVALID_REQUEST',\n USER_NOT_FOUND: 'USER_NOT_FOUND',\n INTERNAL_ERROR: 'INTERNAL_ERROR',\n} as const;\n\n// Local storage keys\nexport const STORAGE_KEYS = {\n ANONYMOUS_ID: 'gotcha_anonymous_id',\n OFFLINE_QUEUE: 'gotcha_offline_queue',\n HIDDEN_UNTIL: 'gotcha_hidden',\n VISIT_COUNT: 'gotcha_visits',\n} as const;\n\n// Default values\nexport const DEFAULTS = {\n POSITION: 'top-right' as const,\n SIZE: 'md' as const,\n THEME: 'light' as const,\n SHOW_ON_HOVER: true,\n TOUCH_BEHAVIOR: 'always-visible' as const,\n SUBMIT_TEXT: 'Submit',\n THANK_YOU_MESSAGE: 'Gotcha!',\n} as const;\n\n// Retry config\nexport const RETRY_CONFIG = {\n MAX_RETRIES: 2,\n BASE_DELAY_MS: 500,\n MAX_DELAY_MS: 5000,\n} as const;\n","export function safeGetItem(key: string): string | null {\n if (typeof window === 'undefined') return null;\n try {\n return localStorage.getItem(key);\n } catch {\n return null;\n }\n}\n\nexport function safeSetItem(key: string, value: string): void {\n if (typeof window === 'undefined') return;\n try {\n localStorage.setItem(key, value);\n } catch {\n // localStorage unavailable (incognito Safari, sandboxed iframes)\n }\n}\n\nexport function safeRemoveItem(key: string): void {\n if (typeof window === 'undefined') return;\n try {\n localStorage.removeItem(key);\n } catch {\n // silently fail\n }\n}\n","/**\n * Generate a UUID v4. Falls back to Math.random for insecure contexts\n * (HTTP, some WebViews) where crypto.randomUUID is unavailable.\n */\nexport function generateId(): string {\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\n return crypto.randomUUID();\n }\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n return (c === 'x' ? r : (r & 0x3) | 0x8).toString(16);\n });\n}\n","import { STORAGE_KEYS } from '../constants';\nimport { safeGetItem, safeSetItem, safeRemoveItem } from './localStorage';\nimport { generateId } from './generateId';\n\n/**\n * Get or create an anonymous user ID\n * Stored in localStorage for consistency across sessions\n */\nexport function getAnonymousId(): string {\n const stored = safeGetItem(STORAGE_KEYS.ANONYMOUS_ID);\n if (stored) return stored;\n\n const id = `anon_${generateId()}`;\n safeSetItem(STORAGE_KEYS.ANONYMOUS_ID, id);\n return id;\n}\n\n/**\n * Clear the anonymous ID (useful for testing)\n */\nexport function clearAnonymousId(): void {\n safeRemoveItem(STORAGE_KEYS.ANONYMOUS_ID);\n}\n","const MAX_ERRORS = 10;\nconst MAX_MESSAGE_LENGTH = 200;\n\ninterface CapturedError {\n message: string;\n source?: string;\n timestamp: number;\n}\n\nlet buffer: CapturedError[] = [];\nlet listening = false;\n\nfunction pushError(message: string, source?: string) {\n const entry: CapturedError = {\n message: message.slice(0, MAX_MESSAGE_LENGTH),\n source: source?.slice(0, MAX_MESSAGE_LENGTH),\n timestamp: Date.now(),\n };\n buffer.push(entry);\n if (buffer.length > MAX_ERRORS) {\n buffer.shift();\n }\n}\n\nfunction handleError(event: ErrorEvent) {\n pushError(event.message, event.filename);\n}\n\nfunction handleRejection(event: PromiseRejectionEvent) {\n const message = event.reason instanceof Error\n ? event.reason.message\n : String(event.reason);\n pushError(message);\n}\n\nexport function startErrorCapture(): void {\n if (typeof window === 'undefined' || listening) return;\n window.addEventListener('error', handleError);\n window.addEventListener('unhandledrejection', handleRejection);\n listening = true;\n}\n\nexport function stopErrorCapture(): void {\n if (typeof window === 'undefined' || !listening) return;\n window.removeEventListener('error', handleError);\n window.removeEventListener('unhandledrejection', handleRejection);\n listening = false;\n}\n\nexport function getRecentErrors(): CapturedError[] {\n return [...buffer].reverse();\n}\n","import { SubmissionContext } from '../types';\nimport { getRecentErrors } from './errorBuffer';\n\nexport function collectContext(): SubmissionContext {\n if (typeof window === 'undefined') return {};\n\n return {\n url: window.location.origin + window.location.pathname,\n userAgent: navigator.userAgent,\n viewport: { width: window.innerWidth, height: window.innerHeight },\n language: navigator.language,\n timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n screenResolution: { width: screen.width, height: screen.height },\n recentErrors: getRecentErrors(),\n };\n}\n","import { STORAGE_KEYS } from '../constants';\nimport { safeGetItem, safeSetItem } from './localStorage';\nimport { generateId } from './generateId';\n\nconst MAX_QUEUE_SIZE = 50;\nconst MAX_AGE_MS = 7 * 24 * 60 * 60 * 1000; // 7 days\n\nexport interface OfflineQueueItem {\n id: string;\n payload: Record<string, unknown>;\n type: 'create' | 'update';\n queuedAt: number;\n retries: number;\n}\n\nfunction readQueue(): OfflineQueueItem[] {\n const raw = safeGetItem(STORAGE_KEYS.OFFLINE_QUEUE);\n if (!raw) return [];\n try {\n const items = JSON.parse(raw) as OfflineQueueItem[];\n // Drop items older than 7 days\n const now = Date.now();\n return items.filter(item => now - item.queuedAt < MAX_AGE_MS);\n } catch {\n return [];\n }\n}\n\nfunction writeQueue(items: OfflineQueueItem[]): void {\n safeSetItem(STORAGE_KEYS.OFFLINE_QUEUE, JSON.stringify(items));\n}\n\nexport function enqueue(payload: Record<string, unknown>, type: 'create' | 'update' = 'create'): void {\n const items = readQueue();\n if (items.length >= MAX_QUEUE_SIZE) return;\n items.push({\n id: generateId(),\n payload,\n type,\n queuedAt: Date.now(),\n retries: 0,\n });\n writeQueue(items);\n}\n\nexport function dequeue(id: string): void {\n const items = readQueue().filter(item => item.id !== id);\n writeQueue(items);\n}\n\nexport function getQueuedItems(): OfflineQueueItem[] {\n return readQueue();\n}\n\nexport function getQueueLength(): number {\n return readQueue().length;\n}\n\nexport function incrementRetries(id: string): void {\n const items = readQueue().map(item =>\n item.id === id ? { ...item, retries: item.retries + 1 } : item\n );\n // Drop items with too many retries\n writeQueue(items.filter(item => item.retries <= 5));\n}\n","import { API_BASE_URL, RETRY_CONFIG } from '../constants';\nimport { SubmitResponsePayload, GotchaResponse, GotchaError, ExistingResponse, VoteType, ScoreData } from '../types';\nimport { getAnonymousId } from '../utils/anonymous';\nimport { generateId } from '../utils/generateId';\nimport { collectContext } from '../utils/contextCollector';\nimport { enqueue, getQueuedItems, dequeue, incrementRetries, getQueueLength } from '../utils/offlineQueue';\n\ninterface ApiClientConfig {\n apiKey: string;\n baseUrl?: string;\n debug?: boolean;\n}\n\ninterface RetryConfig {\n maxRetries: number;\n baseDelayMs: number;\n maxDelayMs: number;\n}\n\nconst DEFAULT_RETRY_CONFIG: RetryConfig = {\n maxRetries: RETRY_CONFIG.MAX_RETRIES,\n baseDelayMs: RETRY_CONFIG.BASE_DELAY_MS,\n maxDelayMs: RETRY_CONFIG.MAX_DELAY_MS,\n};\n\n/**\n * Fetch with automatic retry and exponential backoff\n */\nasync function fetchWithRetry(\n url: string,\n options: RequestInit,\n config: RetryConfig = DEFAULT_RETRY_CONFIG,\n debug: boolean = false\n): Promise<Response> {\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt <= config.maxRetries; attempt++) {\n try {\n if (debug && attempt > 0) {\n console.log(`[Gotcha] Retry attempt ${attempt}/${config.maxRetries}`);\n }\n\n const response = await fetch(url, options);\n\n // Don't retry client errors (4xx) except 429 (rate limit)\n if (response.status >= 400 && response.status < 500 && response.status !== 429) {\n return response;\n }\n\n // Success - return immediately\n if (response.ok) {\n return response;\n }\n\n lastError = new Error(`HTTP ${response.status}`);\n } catch (error) {\n // Network error - retry\n lastError = error as Error;\n if (debug) {\n console.log(`[Gotcha] Network error: ${lastError.message}`);\n }\n }\n\n // Don't delay after last attempt\n if (attempt < config.maxRetries) {\n const delay = Math.min(\n config.baseDelayMs * Math.pow(2, attempt),\n config.maxDelayMs\n );\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n\n throw lastError;\n}\n\nexport function createApiClient(config: ApiClientConfig) {\n const { apiKey, baseUrl = API_BASE_URL, debug = false } = config;\n\n let flushing = false;\n\n const headers = {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${apiKey}`,\n };\n\n async function request<T>(\n method: string,\n endpoint: string,\n body?: unknown\n ): Promise<T> {\n const url = `${baseUrl}${endpoint}`;\n const idempotencyKey = generateId();\n\n if (debug) {\n console.log(`[Gotcha] ${method} ${endpoint}`, body);\n }\n\n const response = await fetchWithRetry(\n url,\n {\n method,\n headers: {\n ...headers,\n 'Idempotency-Key': idempotencyKey,\n },\n body: body ? JSON.stringify(body) : undefined,\n },\n DEFAULT_RETRY_CONFIG,\n debug\n );\n\n let data: Record<string, unknown>;\n try {\n data = await response.json();\n } catch {\n throw { code: 'PARSE_ERROR', message: 'Invalid response from server', status: response.status } as GotchaError;\n }\n\n if (!response.ok) {\n const error = data.error as GotchaError;\n if (debug) {\n console.error(`[Gotcha] Error: ${error.code} - ${error.message}`);\n }\n throw error;\n }\n\n if (debug) {\n console.log(`[Gotcha] Response:`, data);\n }\n\n return data as T;\n }\n\n return {\n /**\n * Submit a response (feedback, vote, etc.)\n */\n async submitResponse(\n payload: Omit<SubmitResponsePayload, 'context'>\n ): Promise<GotchaResponse> {\n // Ensure user has an ID (anonymous if not provided)\n const user = payload.user || {};\n if (!user.id) {\n user.id = getAnonymousId();\n }\n\n const fullPayload: SubmitResponsePayload = {\n ...payload,\n user,\n context: collectContext(),\n // Only include isBug if true\n ...(payload.isBug ? { isBug: true } : {}),\n };\n\n // Queue if offline\n if (typeof navigator !== 'undefined' && !navigator.onLine) {\n enqueue(fullPayload as unknown as Record<string, unknown>, 'create');\n return {\n id: generateId(),\n status: 'queued' as const,\n createdAt: new Date().toISOString(),\n };\n }\n\n try {\n return await request<GotchaResponse>('POST', '/responses', fullPayload);\n } catch (err) {\n // On network failure, queue for later\n if (err instanceof TypeError && typeof navigator !== 'undefined' && !navigator.onLine) {\n enqueue(fullPayload as unknown as Record<string, unknown>, 'create');\n return {\n id: generateId(),\n status: 'queued' as const,\n createdAt: new Date().toISOString(),\n };\n }\n throw err;\n }\n },\n\n /**\n * Check if a user has an existing response for an element\n */\n async checkExistingResponse(\n elementId: string,\n userId: string\n ): Promise<ExistingResponse | null> {\n const url = `${baseUrl}/responses/check?elementId=${encodeURIComponent(elementId)}&userId=${encodeURIComponent(userId)}`;\n\n if (debug) {\n console.log(`[Gotcha] GET /responses/check`);\n }\n\n const response = await fetchWithRetry(\n url,\n {\n method: 'GET',\n headers,\n },\n DEFAULT_RETRY_CONFIG,\n debug\n );\n\n const data = await response.json();\n\n if (!response.ok) {\n const error = data.error as GotchaError;\n if (debug) {\n console.error(`[Gotcha] Error: ${error.code} - ${error.message}`);\n }\n throw error;\n }\n\n if (data.exists) {\n if (debug) {\n console.log(`[Gotcha] Found existing response:`, data.response);\n }\n return data.response as ExistingResponse;\n }\n\n return null;\n },\n\n /**\n * Update an existing response\n */\n async updateResponse(\n id: string,\n payload: {\n content?: string;\n title?: string;\n rating?: number;\n vote?: VoteType;\n pollSelected?: string[];\n },\n userId?: string\n ): Promise<GotchaResponse> {\n const url = `${baseUrl}/responses/${id}${userId ? `?userId=${encodeURIComponent(userId)}` : ''}`;\n\n if (debug) {\n console.log(`[Gotcha] PATCH /responses/${id}`, payload);\n }\n\n const response = await fetchWithRetry(\n url,\n {\n method: 'PATCH',\n headers,\n body: JSON.stringify(payload),\n },\n DEFAULT_RETRY_CONFIG,\n debug\n );\n\n const data = await response.json();\n\n if (!response.ok) {\n const error = data.error as GotchaError;\n if (debug) {\n console.error(`[Gotcha] Error: ${error.code} - ${error.message}`);\n }\n throw error;\n }\n\n if (debug) {\n console.log(`[Gotcha] Response updated:`, data);\n }\n\n return data as GotchaResponse;\n },\n\n /**\n * Get aggregate score data for an element\n */\n async getScore(elementId: string): Promise<ScoreData> {\n const url = `${baseUrl}/scores/${encodeURIComponent(elementId)}`;\n\n if (debug) {\n console.log(`[Gotcha] GET /scores/${elementId}`);\n }\n\n const response = await fetchWithRetry(\n url,\n {\n method: 'GET',\n headers,\n },\n DEFAULT_RETRY_CONFIG,\n debug\n );\n\n const data = await response.json();\n\n if (!response.ok) {\n const error = data.error as GotchaError;\n if (debug) {\n console.error(`[Gotcha] Error: ${error.code} - ${error.message}`);\n }\n throw error;\n }\n\n if (debug) {\n console.log(`[Gotcha] Score:`, data);\n }\n\n return data as ScoreData;\n },\n\n /**\n * Flag a response as a bug report\n */\n async flagAsBug(responseId: string): Promise<{ ticketId: string; status: string }> {\n const url = `${baseUrl}/responses/${encodeURIComponent(responseId)}/bug`;\n\n if (debug) {\n console.log(`[Gotcha] POST /responses/${responseId}/bug`);\n }\n\n const response = await fetchWithRetry(\n url,\n {\n method: 'POST',\n headers,\n },\n DEFAULT_RETRY_CONFIG,\n debug\n );\n\n const data = await response.json();\n\n if (!response.ok) {\n const error = data.error as GotchaError;\n if (debug) {\n console.error(`[Gotcha] Error: ${error.code} - ${error.message}`);\n }\n throw error;\n }\n\n if (debug) {\n console.log(`[Gotcha] Bug flagged:`, data);\n }\n\n return data as { ticketId: string; status: string };\n },\n\n /**\n * Flush queued offline submissions\n */\n async flushQueue(): Promise<void> {\n if (flushing) return;\n flushing = true;\n try {\n const items = getQueuedItems();\n for (const item of items) {\n try {\n if (item.type === 'update' && item.payload.responseId) {\n const { responseId, ...updatePayload } = item.payload;\n await request('PATCH', `/responses/${responseId}`, updatePayload);\n } else {\n await request('POST', '/responses', item.payload);\n }\n dequeue(item.id);\n } catch {\n incrementRetries(item.id);\n }\n }\n } finally {\n flushing = false;\n }\n },\n\n /**\n * Get count of queued offline submissions\n */\n getQueueLength,\n\n /**\n * Get the base URL (for debugging)\n */\n getBaseUrl(): string {\n return baseUrl;\n },\n };\n}\n\nexport type ApiClient = ReturnType<typeof createApiClient>;\n","const UNSAFE_KEYS = new Set(['__proto__', 'constructor', 'prototype']);\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function deepMerge(base: any, override: any): any {\n const result = { ...base };\n for (const key of Object.keys(override)) {\n if (UNSAFE_KEYS.has(key)) continue;\n const val = override[key];\n if (val !== undefined && val !== null && typeof val === 'object' && !Array.isArray(val)) {\n result[key] = deepMerge(base[key] ?? {}, val);\n } else if (val !== undefined) {\n result[key] = val;\n }\n }\n return result;\n}\n","// ============================================\n// THEME TOKEN SYSTEM\n// ============================================\n\nexport interface GotchaThemeColors {\n primary: string;\n primaryHover: string;\n primaryText: string;\n background: string;\n backgroundGradient: string;\n surface: string;\n surfaceHover: string;\n text: string;\n textSecondary: string;\n textDisabled: string;\n border: string;\n borderFocus: string;\n success: string;\n successSurface: string;\n error: string;\n errorSurface: string;\n errorBorder: string;\n warning: string;\n warningActive: string;\n warningSurface: string;\n warningBorder: string;\n starFilled: string;\n starEmpty: string;\n voteUp: string;\n voteUpSurface: string;\n voteUpBorder: string;\n voteDown: string;\n voteDownSurface: string;\n voteDownBorder: string;\n npsColors: string[];\n buttonBackground: string;\n buttonBackgroundHover: string;\n buttonBackgroundDisabled: string;\n buttonColor: string;\n buttonColorDisabled: string;\n buttonBorder: string;\n buttonShadow: string;\n backdropColor: string;\n closeButton: string;\n closeButtonHover: string;\n closeButtonBg: string;\n // Glass button\n glassBackground: string;\n glassBorder: string;\n glassColor: string;\n glassShadow: string;\n glassHoverShadow: string;\n // Input\n inputBackground: string;\n inputBackgroundFocus: string;\n inputBorder: string;\n inputBorderFocus: string;\n inputFocusRing: string;\n // Poll\n pollBorder: string;\n pollSelectedBorder: string;\n pollBackground: string;\n pollSelectedBackground: string;\n pollColor: string;\n pollSelectedColor: string;\n pollCheckBorder: string;\n pollCheckSelectedBorder: string;\n pollCheckSelectedBg: string;\n}\n\nexport interface GotchaThemeTypography {\n fontFamily: string;\n fontSize: {\n xs: number;\n sm: number;\n md: number;\n lg: number;\n };\n fontWeight: {\n normal: number;\n medium: number;\n semibold: number;\n bold: number;\n };\n}\n\nexport interface GotchaThemeBorders {\n radius: {\n sm: number;\n md: number;\n lg: number;\n full: string;\n };\n width: number;\n}\n\nexport interface GotchaThemeShadows {\n sm: string;\n md: string;\n lg: string;\n modal: string;\n button: string;\n}\n\nexport interface GotchaThemeAnimation {\n duration: {\n fast: string;\n normal: string;\n slow: string;\n };\n easing: {\n default: string;\n spring: string;\n };\n}\n\nexport interface GotchaThemeConfig {\n colors?: Partial<GotchaThemeColors>;\n typography?: Partial<GotchaThemeTypography>;\n borders?: Partial<GotchaThemeBorders>;\n shadows?: Partial<GotchaThemeShadows>;\n animation?: Partial<GotchaThemeAnimation>;\n}\n\nexport interface ResolvedTheme {\n colors: GotchaThemeColors;\n typography: GotchaThemeTypography;\n borders: GotchaThemeBorders;\n shadows: GotchaThemeShadows;\n animation: GotchaThemeAnimation;\n}\n\n// ── NPS score colors ─────────────────────────────────────────\nconst NPS_COLORS = [\n '#ef4444', '#f05540', '#f1663c', '#f27738', '#f38834',\n '#f59e0b', '#d4a30e', '#b3a812', '#79b841', '#45c870', '#10b981',\n];\n\n// ── Light preset ─────────────────────────────────────────────\nexport const LIGHT_TOKENS: ResolvedTheme = {\n colors: {\n primary: '#1e293b',\n primaryHover: '#334155',\n primaryText: '#ffffff',\n background: '#ffffff',\n backgroundGradient: 'linear-gradient(180deg, #ffffff 0%, #f8fafc 100%)',\n surface: '#fafbfc',\n surfaceHover: '#ffffff',\n text: '#111827',\n textSecondary: '#374151',\n textDisabled: '#94a3b8',\n border: '#e2e8f0',\n borderFocus: '#1e293b',\n success: '#059669',\n successSurface: 'rgba(5,150,105,0.08)',\n error: '#dc2626',\n errorSurface: '#fef2f2',\n errorBorder: 'rgba(220,38,38,0.1)',\n warning: '#d97706',\n warningActive: '#b45309',\n warningSurface: 'rgba(251,191,36,0.08)',\n warningBorder: 'rgba(217,119,6,0.25)',\n starFilled: '#f59e0b',\n starEmpty: '#e2e8f0',\n voteUp: '#10b981',\n voteUpSurface: 'rgba(16,185,129,0.06)',\n voteUpBorder: 'rgba(16,185,129,0.25)',\n voteDown: '#ef4444',\n voteDownSurface: 'rgba(239,68,68,0.06)',\n voteDownBorder: 'rgba(239,68,68,0.25)',\n npsColors: NPS_COLORS,\n buttonBackground: '#1e293b',\n buttonBackgroundHover: '#334155',\n buttonBackgroundDisabled: '#e2e8f0',\n buttonColor: '#ffffff',\n buttonColorDisabled: '#94a3b8',\n buttonBorder: 'none',\n buttonShadow: 'none',\n backdropColor: 'rgba(0,0,0,0.4)',\n closeButton: '#9ca3af',\n closeButtonHover: '#6b7280',\n closeButtonBg: 'rgba(0,0,0,0.04)',\n glassBackground: 'linear-gradient(160deg, rgba(255,255,255,0.7) 0%, rgba(200,210,230,0.4) 40%, rgba(180,192,220,0.5) 100%)',\n glassBorder: 'none',\n glassColor: 'rgba(0,0,0,0.75)',\n glassShadow: '0 3px 12px rgba(0,0,0,0.12), 0 0 1px rgba(0,0,0,0.2)',\n glassHoverShadow: '0 6px 20px rgba(0,0,0,0.18), 0 0 1px rgba(0,0,0,0.25)',\n inputBackground: '#fafbfc',\n inputBackgroundFocus: '#ffffff',\n inputBorder: '#e2e8f0',\n inputBorderFocus: '#1e293b',\n inputFocusRing: 'rgba(30,41,59,0.15)',\n pollBorder: '#e2e8f0',\n pollSelectedBorder: 'rgba(30,41,59,0.25)',\n pollBackground: '#fafbfc',\n pollSelectedBackground: 'rgba(30,41,59,0.05)',\n pollColor: '#374151',\n pollSelectedColor: '#1e293b',\n pollCheckBorder: '#cbd5e1',\n pollCheckSelectedBorder: '#1e293b',\n pollCheckSelectedBg: '#1e293b',\n },\n typography: {\n fontFamily: \"'DM Sans', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif\",\n fontSize: { xs: 11, sm: 13, md: 14, lg: 16 },\n fontWeight: { normal: 400, medium: 500, semibold: 600, bold: 700 },\n },\n borders: {\n radius: { sm: 8, md: 10, lg: 14, full: '50%' },\n width: 1,\n },\n shadows: {\n sm: '0 1px 2px rgba(0,0,0,0.04)',\n md: '0 4px 12px rgba(0,0,0,0.06)',\n lg: '0 12px 32px rgba(0,0,0,0.06)',\n modal: '0 1px 2px rgba(0,0,0,0.04), 0 4px 12px rgba(0,0,0,0.06), 0 12px 32px rgba(0,0,0,0.06), 0 24px 48px rgba(0,0,0,0.04)',\n button: '0 2px 8px rgba(0,0,0,0.06)',\n },\n animation: {\n duration: { fast: '0.15s', normal: '0.25s', slow: '0.4s' },\n easing: {\n default: 'cubic-bezier(0.4, 0, 0.2, 1)',\n spring: 'cubic-bezier(0.34, 1.56, 0.64, 1)',\n },\n },\n};\n\n// ── Dark preset ──────────────────────────────────────────────\nexport const DARK_TOKENS: ResolvedTheme = {\n colors: {\n primary: '#e2e8f0',\n primaryHover: '#cbd5e1',\n primaryText: '#1e293b',\n background: '#1a1f2e',\n backgroundGradient: 'linear-gradient(180deg, #1a1f2e 0%, #151925 100%)',\n surface: 'rgba(55,65,81,0.5)',\n surfaceHover: 'rgba(55,65,81,0.7)',\n text: '#f9fafb',\n textSecondary: '#d1d5db',\n textDisabled: '#6b7280',\n border: 'rgba(255,255,255,0.08)',\n borderFocus: 'rgba(255,255,255,0.2)',\n success: '#10b981',\n successSurface: 'rgba(16,185,129,0.1)',\n error: '#fecaca',\n errorSurface: 'rgba(127,29,29,0.3)',\n errorBorder: 'rgba(254,202,202,0.1)',\n warning: '#fbbf24',\n warningActive: '#fbbf24',\n warningSurface: 'rgba(245,158,11,0.08)',\n warningBorder: 'rgba(245,158,11,0.3)',\n starFilled: '#f59e0b',\n starEmpty: 'rgba(255,255,255,0.12)',\n voteUp: '#10b981',\n voteUpSurface: 'rgba(16,185,129,0.08)',\n voteUpBorder: 'rgba(16,185,129,0.3)',\n voteDown: '#ef4444',\n voteDownSurface: 'rgba(239,68,68,0.08)',\n voteDownBorder: 'rgba(239,68,68,0.3)',\n npsColors: NPS_COLORS,\n buttonBackground: '#e2e8f0',\n buttonBackgroundHover: '#cbd5e1',\n buttonBackgroundDisabled: '#374151',\n buttonColor: '#1e293b',\n buttonColorDisabled: '#6b7280',\n buttonBorder: 'none',\n buttonShadow: 'none',\n backdropColor: 'rgba(0,0,0,0.5)',\n closeButton: '#6b7280',\n closeButtonHover: '#9ca3af',\n closeButtonBg: 'rgba(255,255,255,0.06)',\n glassBackground: 'linear-gradient(180deg, rgba(255,255,255,0.16) 0%, rgba(255,255,255,0.04) 60%, rgba(0,0,0,0.05) 100%)',\n glassBorder: '1px solid rgba(255,255,255,0.15)',\n glassColor: 'rgba(255,255,255,0.88)',\n glassShadow: '0 4px 14px rgba(0,0,0,0.45), 0 1px 3px rgba(0,0,0,0.35)',\n glassHoverShadow: '0 8px 24px rgba(0,0,0,0.55), 0 1px 3px rgba(0,0,0,0.4)',\n inputBackground: 'rgba(55,65,81,0.5)',\n inputBackgroundFocus: 'rgba(55,65,81,0.7)',\n inputBorder: 'rgba(255,255,255,0.08)',\n inputBorderFocus: 'rgba(255,255,255,0.2)',\n inputFocusRing: 'rgba(255,255,255,0.06)',\n pollBorder: 'rgba(255,255,255,0.08)',\n pollSelectedBorder: 'rgba(226,232,240,0.25)',\n pollBackground: 'rgba(55,65,81,0.5)',\n pollSelectedBackground: 'rgba(226,232,240,0.08)',\n pollColor: '#d1d5db',\n pollSelectedColor: '#e2e8f0',\n pollCheckBorder: 'rgba(255,255,255,0.2)',\n pollCheckSelectedBorder: '#e2e8f0',\n pollCheckSelectedBg: '#e2e8f0',\n },\n typography: {\n fontFamily: \"'DM Sans', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif\",\n fontSize: { xs: 11, sm: 13, md: 14, lg: 16 },\n fontWeight: { normal: 400, medium: 500, semibold: 600, bold: 700 },\n },\n borders: {\n radius: { sm: 8, md: 10, lg: 14, full: '50%' },\n width: 1,\n },\n shadows: {\n sm: '0 1px 2px rgba(0,0,0,0.2)',\n md: '0 4px 12px rgba(0,0,0,0.3)',\n lg: '0 12px 32px rgba(0,0,0,0.2)',\n modal: '0 1px 2px rgba(0,0,0,0.2), 0 4px 12px rgba(0,0,0,0.3), 0 12px 32px rgba(0,0,0,0.2), 0 24px 48px rgba(0,0,0,0.15)',\n button: '0 2px 8px rgba(0,0,0,0.15)',\n },\n animation: {\n duration: { fast: '0.15s', normal: '0.25s', slow: '0.4s' },\n easing: {\n default: 'cubic-bezier(0.4, 0, 0.2, 1)',\n spring: 'cubic-bezier(0.34, 1.56, 0.64, 1)',\n },\n },\n};\n\n// ── Helper ───────────────────────────────────────────────────\n\nimport { deepMerge } from '../utils/deepMerge';\n\n/** Create a custom theme by merging partial overrides onto a preset */\nexport function createTheme(\n base: 'light' | 'dark',\n overrides: GotchaThemeConfig,\n): GotchaThemeConfig {\n const preset = base === 'dark' ? DARK_TOKENS : LIGHT_TOKENS;\n return deepMerge(preset, overrides) as GotchaThemeConfig;\n}\n","import { LIGHT_TOKENS, DARK_TOKENS, GotchaThemeConfig, ResolvedTheme } from './tokens';\nimport { deepMerge } from '../utils/deepMerge';\n\n/**\n * Resolve a complete theme from the base preset + optional provider & instance overrides.\n * Returns a fully-resolved object with no undefined values.\n */\nexport function resolveTheme(\n theme: 'light' | 'dark' | 'auto' | 'custom',\n systemTheme: 'light' | 'dark',\n providerConfig?: GotchaThemeConfig,\n): ResolvedTheme {\n const effectiveTheme = theme === 'auto' || theme === 'custom' ? systemTheme : theme;\n let resolved: ResolvedTheme = effectiveTheme === 'dark'\n ? deepMerge({}, DARK_TOKENS) as ResolvedTheme\n : deepMerge({}, LIGHT_TOKENS) as ResolvedTheme;\n\n if (providerConfig) {\n resolved = deepMerge(resolved, providerConfig) as ResolvedTheme;\n }\n\n return resolved;\n}\n","import { ResolvedTheme } from './tokens';\n\nconst STYLE_ID = 'gotcha-styles';\nconst FONT_ID = 'gotcha-dm-sans';\nconst FONT_FACE_ID = 'gotcha-carter-one';\n\n/**\n * The Carter One @font-face CSS with base64-embedded woff2.\n * Uses font-display: block to prevent any fallback font from showing.\n * Since the font is base64-encoded (instant decode), the block period is negligible.\n */\nconst CARTER_ONE_FONT_FACE = `\n@font-face {\n font-family: 'Carter One';\n font-style: normal;\n font-weight: 400;\n font-display: block;\n src: url(data:font/woff2;base64,d09GMgABAAAAAAK4AA4AAAAABOwAAAJlAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGhQbXhwaBmAANBEICoFUgW8BNgIkAwgLBgAEIAWCUgcgGwoEUVQMHgC+OLCNaQVfBAoIrXGAIhjLIIM0CxavPfqMrzmLh6/9fufu20XEQyQzNNPOUEmimUZJpKLdIu3RKOU3O1hXc5D3YTdAbu+mRHU5AAIwC231R25qGGbpnwecyr34QQKM3gHMKMzOM4ogDSwQSreJE9bjISamQdCMwAAgeI0+S7qoy5j8TCDK8Ff4Fwm5+ecJhCwh9EgmsJiTo6S+/WkCPCU8DpCqr+hWKM/FBMRyfLPqV2LSlzBEIhqLxeGhIADg+rwoHxx58Oipm4301FUpgID4K8fAChoJFSYwAhNYKyDLAjudDimd9wA18hGDDvNkBE6AByBJiLpXVM2jgyht94hWK9yPQD+5lb948fAQKnfCK1PjBQWRayfW+hltCzAs9B8eX54Xd5g7vrzpiTswCeXB/VG5PNObmFr711KPrLKC6/mxys5avigCA+uFj8HGq+ErmaRDt/31k1XtfRtcI0pNluOCFEOOmVEOTg5eYn77Hq9Y0SJxu+bSBW5skqWS0VLXOvNJxgyRhVECycL7u2cb2pmOGdolPK+ORsLma1IHQCAY6I5NjWKsNzQVPeDnvzc7Pth+aTYMKHpqoEcCwSM4A6sVYPt/AIoeTckToLx4hELyieAj16Z4TKDbKYzIJOAW2JNhIptMhjyRlbXedjaymDv75i5jb1xkyVYiV4okyfIhmnG0EGNDIyMkVgmkUIJcmbJkQmLEi5Ehjz7iJF06pJeel1ETYiCBP/+OePouYuTKlyAX4iVTAl8JkhRIFyN3UpqAdTHa1nfVAy3Kk3LL2Ejf0Gch0McAqJNIAwAA) format('woff2');\n unicode-range: U+0047;\n}`.trim();\n\n/**\n * Inject Carter One @font-face at module load time (top-level side effect).\n * This ensures the font is registered with the browser BEFORE any React\n * component renders, eliminating FOUT completely.\n */\nfunction injectFontFace(): void {\n if (typeof document === 'undefined') return;\n if (document.getElementById(FONT_FACE_ID)) return;\n\n const style = document.createElement('style');\n style.id = FONT_FACE_ID;\n style.textContent = CARTER_ONE_FONT_FACE;\n document.head.appendChild(style);\n}\n\n// Execute immediately when this module is imported\ninjectFontFace();\n\n/** Strip characters that could break out of a CSS value context */\nfunction sanitizeCSS(value: string): string {\n return value.replace(/[{}<>;@\\\\]/g, '');\n}\n\n/**\n * Generate the full CSS string for all Gotcha animations, fonts, and base styles.\n */\nexport function generateStyleTag(theme: ResolvedTheme): string {\n const easing = {\n default: sanitizeCSS(theme.animation.easing.default),\n spring: sanitizeCSS(theme.animation.easing.spring),\n };\n const duration = {\n normal: sanitizeCSS(theme.animation.duration.normal),\n };\n const fontFamily = sanitizeCSS(theme.typography.fontFamily);\n const textDisabled = sanitizeCSS(theme.colors.textDisabled);\n const borderColor = sanitizeCSS(theme.colors.border);\n\n return `\n/* ── Gotcha Keyframe Animations ────────────────────────────── */\n\n@keyframes gotcha-modal-in {\n from { opacity: 0; transform: translateX(-50%) scale(0.92) translateY(-6px); }\n to { opacity: 1; transform: translateX(-50%) scale(1) translateY(0); }\n}\n\n@keyframes gotcha-modal-in-above {\n from { opacity: 0; transform: translateX(-50%) scale(0.92) translateY(6px); }\n to { opacity: 1; transform: translateX(-50%) scale(1) translateY(0); }\n}\n\n@keyframes gotcha-modal-in-center {\n from { opacity: 0; transform: translate(-50%, -50%) scale(0.92); }\n to { opacity: 1; transform: translate(-50%, -50%) scale(1); }\n}\n\n@keyframes gotcha-success-pop {\n 0% { transform: scale(0); opacity: 0; }\n 50% { transform: scale(1.15); }\n 100% { transform: scale(1); opacity: 1; }\n}\n\n@keyframes gotcha-success-text {\n from { opacity: 0; transform: translateY(6px); }\n to { opacity: 1; transform: translateY(0); }\n}\n\n@keyframes gotcha-check-draw {\n from { stroke-dashoffset: 24; }\n to { stroke-dashoffset: 0; }\n}\n\n@keyframes gotcha-glow-pulse {\n 0%, 100% { box-shadow: 0 0 0 0 rgba(16,185,129,0.3); }\n 50% { box-shadow: 0 0 0 8px rgba(16,185,129,0); }\n}\n\n@keyframes gotcha-star-pulse {\n 0% { transform: scale(1); }\n 40% { transform: scale(1.3); }\n 100% { transform: scale(1); }\n}\n\n@keyframes gotcha-shimmer {\n 0% { background-position: -200% 0; }\n 100% { background-position: 200% 0; }\n}\n\n@keyframes gotcha-fade-up {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n@keyframes gotcha-overlay-in {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n@keyframes gotcha-expand-in {\n from { opacity: 0; max-height: 0; margin-top: 0; }\n to { opacity: 1; max-height: 200px; margin-top: 12px; }\n}\n\n@keyframes gotcha-bubble-pop {\n 0% { transform: scale(0); opacity: 0; filter: blur(4px); }\n 40% { opacity: 1; filter: blur(0px); }\n 65% { transform: scale(1.08); }\n 82% { transform: scale(0.97); }\n 100% { transform: scale(1); opacity: 1; filter: blur(0px); }\n}\n\n@keyframes gotcha-letter-in {\n 0% { opacity: 0; transform: scale(0.6) translateY(2px); filter: blur(3px); }\n 100% { opacity: 1; transform: scale(1) translateY(0); filter: blur(0px); }\n}\n\n@keyframes gotcha-arrive-glow {\n 0%, 100% { box-shadow: 0 3px 12px rgba(0,0,0,0.12), 0 0 1px rgba(0,0,0,0.2); }\n 50% { box-shadow: 0 4px 16px rgba(0,0,0,0.18), 0 0 1px rgba(0,0,0,0.25); }\n}\n\n@keyframes gotcha-spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n}\n\n@keyframes gotcha-dash {\n 0% { stroke-dasharray: 1, 62; stroke-dashoffset: 0; }\n 50% { stroke-dasharray: 40, 62; stroke-dashoffset: -12; }\n 100% { stroke-dasharray: 1, 62; stroke-dashoffset: -62; }\n}\n\n/* ── Base Styles ───────────────────────────────────────────── */\n\n[data-gotcha] {\n font-family: ${fontFamily};\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n[data-gotcha] *, [data-gotcha] *::before, [data-gotcha] *::after {\n box-sizing: border-box;\n}\n\n[data-gotcha] button {\n outline: none;\n}\n\n[data-gotcha] button:focus-visible {\n outline: none;\n box-shadow: 0 0 0 2px ${borderColor};\n}\n\n.gotcha-root textarea::placeholder {\n color: ${textDisabled};\n}\n\n/* ── Animation Utilities ───────────────────────────────────── */\n\n.gotcha-fade-up {\n animation: gotcha-fade-up ${duration.normal} ${easing.default} both;\n}\n\n.gotcha-modal-enter {\n animation: gotcha-modal-in 0.3s ${easing.spring} both;\n}\n\n.gotcha-modal-enter-above {\n animation: gotcha-modal-in-above 0.3s ${easing.spring} both;\n}\n\n.gotcha-modal-enter-center {\n animation: gotcha-modal-in-center 0.3s ${easing.spring} both;\n}\n\n.gotcha-overlay-enter {\n animation: gotcha-overlay-in 0.2s ${easing.default} both;\n}\n\n/* ── Reduced Motion ────────────────────────────────────────── */\n\n@media (prefers-reduced-motion: reduce) {\n [data-gotcha] *, [data-gotcha] *::before, [data-gotcha] *::after {\n animation-duration: 0.01ms !important;\n animation-iteration-count: 1 !important;\n transition-duration: 0.01ms !important;\n }\n}\n`.trim();\n}\n\n/**\n * Inject the style tag into the document head (idempotent).\n */\nexport function injectStyles(theme: ResolvedTheme): void {\n if (typeof document === 'undefined') return;\n\n // Inject DM Sans from Google Fonts with preconnect\n if (!document.getElementById(FONT_ID)) {\n // Preconnect to Google Fonts\n const preconnect = document.createElement('link');\n preconnect.rel = 'preconnect';\n preconnect.href = 'https://fonts.googleapis.com';\n document.head.appendChild(preconnect);\n\n const preconnectStatic = document.createElement('link');\n preconnectStatic.rel = 'preconnect';\n preconnectStatic.href = 'https://fonts.gstatic.com';\n preconnectStatic.crossOrigin = 'anonymous';\n document.head.appendChild(preconnectStatic);\n\n // Load DM Sans from Google Fonts (Carter One is base64-embedded above)\n const link = document.createElement('link');\n link.id = FONT_ID;\n link.rel = 'stylesheet';\n link.href = 'https://fonts.googleapis.com/css2?family=Carter+One&family=DM+Sans:wght@400;500;600;700&display=swap';\n document.head.appendChild(link);\n }\n\n // Inject or update style tag\n let styleEl = document.getElementById(STYLE_ID) as HTMLStyleElement | null;\n if (!styleEl) {\n styleEl = document.createElement('style');\n styleEl.id = STYLE_ID;\n document.head.appendChild(styleEl);\n }\n styleEl.textContent = generateStyleTag(theme);\n}\n","import React, { createContext, useContext, useMemo, useState, useCallback, useEffect } from 'react';\nimport { createApiClient, ApiClient } from '../api/client';\nimport { GotchaUser } from '../types';\nimport { GotchaThemeConfig } from '../theme/tokens';\nimport { resolveTheme } from '../theme/resolveTheme';\nimport { injectStyles } from '../theme/styles';\nimport { startErrorCapture, stopErrorCapture } from '../utils/errorBuffer';\n\nexport interface GotchaProviderProps {\n /** Your Gotcha API key */\n apiKey: string;\n /** React children */\n children: React.ReactNode;\n /** Override the API base URL (for testing/staging) */\n baseUrl?: string;\n /** Enable debug logging */\n debug?: boolean;\n /** Disable all Gotcha buttons globally */\n disabled?: boolean;\n /** Default user metadata applied to all submissions */\n defaultUser?: GotchaUser;\n /** Theme configuration overrides applied to all instances */\n themeConfig?: GotchaThemeConfig;\n}\n\nexport interface GotchaContextValue {\n client: ApiClient;\n disabled: boolean;\n defaultUser: GotchaUser;\n debug: boolean;\n // Modal management - only one open at a time\n activeModalId: string | null;\n openModal: (elementId: string) => void;\n closeModal: () => void;\n // Theme\n themeConfig?: GotchaThemeConfig;\n}\n\nconst GotchaContext = createContext<GotchaContextValue | null>(null);\n\nconst EMPTY_USER: GotchaUser = {};\n\nexport function GotchaProvider({\n apiKey,\n children,\n baseUrl,\n debug = false,\n disabled = false,\n defaultUser,\n themeConfig,\n}: GotchaProviderProps) {\n const [activeModalId, setActiveModalId] = useState<string | null>(null);\n\n if (baseUrl && !baseUrl.startsWith('https://') && !baseUrl.startsWith('/') && !baseUrl.includes('localhost')) {\n console.warn('[Gotcha] baseUrl should use HTTPS in production:', baseUrl);\n }\n\n const client = useMemo(\n () => createApiClient({ apiKey, baseUrl, debug }),\n [apiKey, baseUrl, debug]\n );\n\n // Stabilize defaultUser reference\n const stableDefaultUser = useMemo(\n () => defaultUser ?? EMPTY_USER,\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [JSON.stringify(defaultUser)]\n );\n\n // Inject styles on mount. Carter One @font-face is injected at module-load time\n // (styles.ts:37) so it's already available before this runs.\n useEffect(() => {\n const resolved = resolveTheme('light', 'light', themeConfig);\n injectStyles(resolved);\n }, [themeConfig]);\n\n // Capture JS errors for context enrichment\n useEffect(() => {\n startErrorCapture();\n return () => stopErrorCapture();\n }, []);\n\n // Flush offline queue on reconnect and on mount\n useEffect(() => {\n client.flushQueue();\n const handleOnline = () => client.flushQueue();\n window.addEventListener('online', handleOnline);\n return () => window.removeEventListener('online', handleOnline);\n }, [client]);\n\n const openModal = useCallback((elementId: string) => {\n setActiveModalId(elementId);\n }, []);\n\n const closeModal = useCallback(() => {\n setActiveModalId(null);\n }, []);\n\n const value: GotchaContextValue = useMemo(\n () => ({\n client,\n disabled,\n defaultUser: stableDefaultUser,\n debug,\n activeModalId,\n openModal,\n closeModal,\n themeConfig,\n }),\n [client, disabled, stableDefaultUser, debug, activeModalId, openModal, closeModal, themeConfig]\n );\n\n return (\n <GotchaContext.Provider value={value}>{children}</GotchaContext.Provider>\n );\n}\n\nexport function useGotchaContext(): GotchaContextValue {\n const context = useContext(GotchaContext);\n if (!context) {\n throw new Error('useGotchaContext must be used within a GotchaProvider');\n }\n return context;\n}\n","import { useState, useCallback, useEffect } from 'react';\nimport { useGotchaContext } from '../components/GotchaProvider';\nimport { ResponseMode, GotchaUser, GotchaResponse, VoteType, ExistingResponse } from '../types';\n\ninterface UseSubmitOptions {\n elementId: string;\n mode: ResponseMode;\n pollOptions?: string[];\n user?: GotchaUser;\n onePerUser?: boolean;\n /** When onePerUser is true, allow a new submission after this many days */\n cooldownDays?: number;\n onSuccess?: (response: GotchaResponse) => void;\n onError?: (error: Error) => void;\n}\n\ninterface SubmitData {\n content?: string;\n title?: string;\n rating?: number;\n vote?: VoteType;\n pollSelected?: string[];\n isBug?: boolean;\n screenshot?: string;\n}\n\nfunction isResponseExpired(createdAt: string, cooldownDays: number): boolean {\n const createdTime = new Date(createdAt).getTime();\n if (isNaN(createdTime)) return true;\n const ageMs = Date.now() - createdTime;\n const cooldownMs = cooldownDays * 24 * 60 * 60 * 1000;\n return ageMs >= cooldownMs;\n}\n\nexport function useSubmit(options: UseSubmitOptions) {\n const { client, defaultUser } = useGotchaContext();\n const [isLoading, setIsLoading] = useState(false);\n const [isCheckingExisting, setIsCheckingExisting] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [existingResponse, setExistingResponse] = useState<ExistingResponse | null>(null);\n\n // Check for existing response when user ID is provided and onePerUser is enabled\n useEffect(() => {\n if (process.env.NODE_ENV !== 'production' && options.cooldownDays && !options.onePerUser) {\n console.warn('[Gotcha] cooldownDays has no effect without onePerUser=true');\n }\n\n const userId = options.user?.id || defaultUser?.id;\n if (!userId || !options.onePerUser) {\n setExistingResponse(null);\n return;\n }\n\n let cancelled = false;\n\n const checkExisting = async () => {\n setIsCheckingExisting(true);\n try {\n const existing = await client.checkExistingResponse(options.elementId, userId);\n if (!cancelled) {\n if (existing && options.cooldownDays && options.cooldownDays > 0 &&\n isResponseExpired(existing.createdAt, options.cooldownDays)) {\n setExistingResponse(null);\n } else {\n setExistingResponse(existing);\n }\n }\n } catch {\n // Ignore errors - just means no existing response found\n if (!cancelled) {\n setExistingResponse(null);\n }\n } finally {\n if (!cancelled) {\n setIsCheckingExisting(false);\n }\n }\n };\n\n checkExisting();\n\n return () => {\n cancelled = true;\n };\n }, [client, options.elementId, options.user?.id, defaultUser?.id, options.onePerUser, options.cooldownDays]);\n\n const submit = useCallback(\n async (data: SubmitData) => {\n setIsLoading(true);\n setError(null);\n\n try {\n const userId = options.user?.id || defaultUser?.id;\n let response: GotchaResponse;\n\n // If onePerUser is enabled and we have an existing response, update instead of create\n if (options.onePerUser && existingResponse && userId) {\n response = await client.updateResponse(\n existingResponse.id,\n {\n content: data.content,\n title: data.title,\n rating: data.rating,\n vote: data.vote,\n pollSelected: data.pollSelected,\n },\n userId\n );\n } else {\n response = await client.submitResponse({\n elementId: options.elementId,\n mode: options.mode,\n content: data.content,\n title: data.title,\n rating: data.rating,\n vote: data.vote,\n pollOptions: options.pollOptions,\n pollSelected: data.pollSelected,\n isBug: data.isBug,\n screenshot: data.screenshot,\n user: { ...defaultUser, ...options.user },\n });\n }\n\n // Update existingResponse so isEditing flips to true after first submit (only for onePerUser)\n if (options.onePerUser) {\n setExistingResponse({\n id: response.id,\n mode: options.mode,\n content: data.content ?? null,\n title: data.title ?? null,\n rating: data.rating ?? null,\n vote: data.vote ?? null,\n pollSelected: data.pollSelected ?? null,\n createdAt: response.createdAt,\n });\n }\n\n options.onSuccess?.(response);\n return response;\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Something went wrong';\n setError(errorMessage);\n options.onError?.(err instanceof Error ? err : new Error(errorMessage));\n throw err;\n } finally {\n setIsLoading(false);\n }\n },\n [client, defaultUser, options, existingResponse]\n );\n\n return {\n submit,\n isLoading,\n isCheckingExisting,\n error,\n existingResponse,\n isEditing: !!existingResponse,\n clearError: () => setError(null),\n };\n}\n","import { useState, useCallback, useEffect, useMemo } from 'react';\nimport { STORAGE_KEYS } from '../constants';\nimport { getAnonymousId } from '../utils/anonymous';\nimport { safeGetItem, safeSetItem } from '../utils/localStorage';\n\ninterface UseHideAfterSubmitOptions {\n elementId: string;\n userId?: string;\n hideAfterSubmitDays?: number;\n}\n\nfunction getStorageKey(elementId: string, userId: string): string {\n return `${STORAGE_KEYS.HIDDEN_UNTIL}_${elementId}_${userId}`;\n}\n\nfunction checkIsHidden(elementId: string, resolvedUserId: string, hideAfterSubmitDays?: number): boolean {\n if (!hideAfterSubmitDays || hideAfterSubmitDays <= 0) return false;\n const key = getStorageKey(elementId, resolvedUserId);\n const hiddenUntilStr = safeGetItem(key);\n if (!hiddenUntilStr) return false;\n return new Date(hiddenUntilStr).getTime() > Date.now();\n}\n\nexport function useHideAfterSubmit(options: UseHideAfterSubmitOptions) {\n const { elementId, userId, hideAfterSubmitDays } = options;\n const resolvedUserId = useMemo(() => userId || getAnonymousId(), [userId]);\n\n const [isHidden, setIsHidden] = useState(() =>\n checkIsHidden(elementId, resolvedUserId, hideAfterSubmitDays)\n );\n\n // Re-evaluate when props change dynamically\n useEffect(() => {\n setIsHidden(checkIsHidden(elementId, resolvedUserId, hideAfterSubmitDays));\n }, [elementId, resolvedUserId, hideAfterSubmitDays]);\n\n const markHidden = useCallback(() => {\n if (!hideAfterSubmitDays || hideAfterSubmitDays <= 0) return;\n\n const key = getStorageKey(elementId, resolvedUserId);\n const hiddenUntil = new Date(\n Date.now() + hideAfterSubmitDays * 24 * 60 * 60 * 1000\n );\n safeSetItem(key, hiddenUntil.toISOString());\n setIsHidden(true);\n }, [elementId, resolvedUserId, hideAfterSubmitDays]);\n\n return { isHidden, markHidden };\n}\n","import { useState, useEffect } from 'react';\nimport { STORAGE_KEYS } from '../constants';\nimport { safeGetItem, safeSetItem } from '../utils/localStorage';\n\ninterface UseTriggerConditionsOptions {\n elementId: string;\n showAfterSeconds?: number;\n showAfterScrollPercent?: number;\n showAfterVisits?: number;\n}\n\nfunction getVisitKey(elementId: string): string {\n return `${STORAGE_KEYS.VISIT_COUNT}_${elementId}`;\n}\n\nexport function useTriggerConditions(options: UseTriggerConditionsOptions) {\n const { elementId, showAfterSeconds, showAfterScrollPercent, showAfterVisits } = options;\n\n const hasConditions = showAfterSeconds != null || showAfterScrollPercent != null || showAfterVisits != null;\n\n const [timeMet, setTimeMet] = useState(!showAfterSeconds);\n const [scrollMet, setScrollMet] = useState(!showAfterScrollPercent);\n const [visitsMet] = useState(() => {\n if (!showAfterVisits) return true;\n const key = getVisitKey(elementId);\n const current = parseInt(safeGetItem(key) || '0', 10);\n const next = current + 1;\n safeSetItem(key, String(next));\n return next >= showAfterVisits;\n });\n\n // Time delay\n useEffect(() => {\n if (!showAfterSeconds || showAfterSeconds <= 0) return;\n\n const start = Date.now();\n const targetMs = showAfterSeconds * 1000;\n\n const check = () => {\n if (Date.now() - start >= targetMs) {\n setTimeMet(true);\n } else {\n timer = setTimeout(check, Math.min(1000, targetMs - (Date.now() - start)));\n }\n };\n\n let timer = setTimeout(check, Math.min(1000, targetMs));\n return () => clearTimeout(timer);\n }, [showAfterSeconds]);\n\n // Scroll depth\n useEffect(() => {\n if (!showAfterScrollPercent || showAfterScrollPercent <= 0) return;\n\n const checkScroll = () => {\n const scrollHeight = document.documentElement.scrollHeight;\n const viewportHeight = window.innerHeight;\n\n // If page can't scroll, condition is auto-met\n if (scrollHeight <= viewportHeight) {\n setScrollMet(true);\n return;\n }\n\n const scrolled = (window.scrollY + viewportHeight) / scrollHeight * 100;\n if (scrolled >= showAfterScrollPercent) {\n setScrollMet(true);\n }\n };\n\n checkScroll();\n if (!scrollMet) {\n window.addEventListener('scroll', checkScroll, { passive: true });\n return () => window.removeEventListener('scroll', checkScroll);\n }\n }, [showAfterScrollPercent, scrollMet]);\n\n return {\n conditionsMet: !hasConditions || (timeMet && scrollMet && visitsMet),\n };\n}\n","/**\n * Simple class name utility\n * Combines class names, filtering out falsy values\n */\nexport function cn(...classes: (string | undefined | null | false)[]): string {\n return classes.filter(Boolean).join(' ');\n}\n","/**\n * Detect if the device supports touch\n */\nexport const isTouchDevice = (): boolean => {\n if (typeof window === 'undefined') return false;\n return 'ontouchstart' in window || navigator.maxTouchPoints > 0;\n};\n\n/**\n * Get the appropriate size based on device type\n */\nexport const getResponsiveSize = (\n size: 'sm' | 'md' | 'lg',\n isTouch: boolean\n): number => {\n const sizes = {\n sm: { desktop: 24, mobile: 28 },\n md: { desktop: 32, mobile: 34 },\n lg: { desktop: 40, mobile: 40 },\n };\n\n return isTouch ? sizes[size].mobile : sizes[size].desktop;\n};\n","import React, { useState, useEffect, useMemo } from 'react';\nimport { Size, Theme, GotchaStyles } from '../types';\nimport { cn } from '../utils/cn';\nimport { isTouchDevice, getResponsiveSize } from '../utils/device';\nimport { resolveTheme } from '../theme/resolveTheme';\nimport { useGotchaContext } from './GotchaProvider';\n\nexport interface GotchaButtonProps {\n size: Size;\n theme: Theme;\n customStyles?: GotchaStyles;\n showOnHover: boolean;\n touchBehavior: 'always-visible' | 'tap-to-reveal';\n onClick: () => void;\n isOpen: boolean;\n isParentHovered?: boolean;\n /** Enable entrance animations (default: true) */\n animated?: boolean;\n /** Number of queued offline submissions */\n queuedCount?: number;\n}\n\nfunction getInitialSystemTheme(): 'light' | 'dark' {\n if (typeof window === 'undefined') return 'light';\n return window.matchMedia('(prefers-color-scheme: dark)').matches\n ? 'dark'\n : 'light';\n}\n\nexport function GotchaButton({\n size,\n theme,\n customStyles,\n showOnHover,\n touchBehavior,\n onClick,\n isOpen,\n isParentHovered = false,\n animated = true,\n queuedCount = 0,\n}: GotchaButtonProps) {\n const [isTouch, setIsTouch] = useState(false);\n const [tapRevealed, setTapRevealed] = useState(false);\n const [systemTheme, setSystemTheme] = useState<'light' | 'dark'>(getInitialSystemTheme);\n const [isHovered, setIsHovered] = useState(false);\n const [isPressed, setIsPressed] = useState(false);\n const [hasPopped, setHasPopped] = useState(false);\n\n const { themeConfig } = useGotchaContext();\n\n useEffect(() => {\n setIsTouch(isTouchDevice());\n\n if (typeof window === 'undefined') return;\n const darkQuery = window.matchMedia('(prefers-color-scheme: dark)');\n const handler = (e: MediaQueryListEvent) =>\n setSystemTheme(e.matches ? 'dark' : 'light');\n darkQuery.addEventListener('change', handler);\n return () => darkQuery.removeEventListener('change', handler);\n }, []);\n\n // Determine visibility\n const shouldShow = (() => {\n if (isOpen) return true;\n if (!isTouch && showOnHover) return isParentHovered;\n if (isTouch && touchBehavior === 'tap-to-reveal') return tapRevealed;\n return true;\n })();\n\n // Mark bubble pop as done after first appearance\n useEffect(() => {\n if (shouldShow && !hasPopped) {\n const timer = setTimeout(() => setHasPopped(true), 600);\n return () => clearTimeout(timer);\n }\n }, [shouldShow, hasPopped]);\n\n const handleClick = () => {\n if (isTouch && touchBehavior === 'tap-to-reveal' && !tapRevealed) {\n setTapRevealed(true);\n return;\n }\n onClick();\n };\n\n const buttonSize = getResponsiveSize(size, isTouch);\n const t = useMemo(\n () => resolveTheme(theme, systemTheme, themeConfig),\n [theme, systemTheme, themeConfig]\n );\n\n // Compute transform based on state\n const getTransform = () => {\n if (!shouldShow) return 'scale(0.6)';\n if (isPressed) return 'scale(0.95)';\n if (isHovered) return 'scale(1.08)';\n return 'scale(1)';\n };\n\n const baseStyles: React.CSSProperties = {\n width: buttonSize,\n height: buttonSize,\n borderRadius: '50%',\n border: t.colors.glassBorder,\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n background: t.colors.glassBackground,\n backdropFilter: 'blur(20px) saturate(180%)',\n WebkitBackdropFilter: 'blur(20px) saturate(180%)',\n color: t.colors.glassColor,\n boxShadow: isHovered ? t.colors.glassHoverShadow : t.colors.glassShadow,\n transition: hasPopped ? `all 0.3s ${t.animation.easing.spring}` : 'none',\n opacity: shouldShow ? 1 : 0,\n transform: getTransform(),\n filter: isPressed ? 'brightness(0.95)' : 'brightness(1)',\n pointerEvents: shouldShow ? 'auto' : 'none',\n ...(animated && shouldShow && !hasPopped ? {\n animation: 'gotcha-bubble-pop 500ms cubic-bezier(0.175, 0.885, 0.32, 1.275) both, gotcha-arrive-glow 1200ms ease-in-out 600ms both',\n } : {}),\n ...customStyles?.button,\n };\n\n return (\n <button\n type=\"button\"\n onClick={handleClick}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => { setIsHovered(false); setIsPressed(false); }}\n onMouseDown={() => setIsPressed(true)}\n onMouseUp={() => setIsPressed(false)}\n onTouchStart={() => setIsPressed(true)}\n onTouchEnd={() => setIsPressed(false)}\n style={baseStyles}\n className={cn('gotcha-button', isOpen && 'gotcha-button--open')}\n aria-label=\"Give feedback on this feature\"\n aria-expanded={isOpen}\n aria-haspopup=\"dialog\"\n >\n <GotchaIcon size={buttonSize * 0.65} animated={animated} />\n {queuedCount > 0 && (\n <div\n aria-label={`${queuedCount} queued`}\n style={{\n position: 'absolute',\n top: -2,\n right: -2,\n width: 8,\n height: 8,\n borderRadius: '50%',\n backgroundColor: t.colors.warning,\n border: '1.5px solid rgba(255,255,255,0.9)',\n }}\n />\n )}\n </button>\n );\n}\n\nfunction GotchaIcon({ size, animated = true }: { size: number; animated?: boolean }) {\n const [mounted, setMounted] = useState(false);\n useEffect(() => { setMounted(true); }, []);\n\n return (\n <span\n aria-hidden=\"true\"\n style={{\n fontFamily: \"'Carter One', cursive\",\n fontSize: size,\n lineHeight: 1,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n marginTop: size * 0.05,\n marginRight: size * 0.05,\n userSelect: 'none',\n opacity: animated ? 0 : (mounted ? 1 : 0),\n ...(animated && mounted ? {\n animation: 'gotcha-letter-in 350ms cubic-bezier(0.25, 0.46, 0.45, 0.94) 200ms both',\n } : {}),\n }}\n >\n G\n </span>\n );\n}\n","import React from 'react';\n\ninterface SpinnerProps {\n size?: number;\n color?: string;\n}\n\nexport function Spinner({ size = 16, color = 'currentColor' }: SpinnerProps) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n style={{\n animation: 'gotcha-spin 0.8s linear infinite',\n }}\n >\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke={color}\n strokeWidth=\"2\"\n strokeOpacity=\"0.12\"\n />\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke={color}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n style={{\n animation: 'gotcha-dash 1.2s ease-in-out infinite',\n }}\n />\n </svg>\n );\n}\n","import React from 'react';\nimport { ResolvedTheme } from '../theme/tokens';\n\ninterface ScreenshotPreviewProps {\n src: string;\n onRemove: () => void;\n resolvedTheme: ResolvedTheme;\n}\n\nexport function ScreenshotPreview({ src, onRemove, resolvedTheme: t }: ScreenshotPreviewProps) {\n return (\n <div style={{\n position: 'relative',\n marginTop: 10,\n borderRadius: t.borders.radius.md,\n overflow: 'hidden',\n border: `1px solid ${t.colors.border}`,\n }}>\n <img\n src={src}\n alt=\"Screenshot\"\n style={{\n display: 'block',\n width: '100%',\n maxHeight: 120,\n objectFit: 'cover',\n }}\n />\n <button\n type=\"button\"\n onClick={onRemove}\n aria-label=\"Remove screenshot\"\n style={{\n position: 'absolute',\n top: 4,\n right: 4,\n width: 22,\n height: 22,\n borderRadius: '50%',\n border: 'none',\n backgroundColor: 'rgba(0,0,0,0.6)',\n color: '#fff',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: 12,\n lineHeight: 1,\n }}\n >\n <svg width={10} height={10} viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M1 1L13 13M1 13L13 1\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n </svg>\n </button>\n </div>\n );\n}\n","import React, { useState, useEffect, useRef } from 'react';\nimport { GotchaStyles } from '../../types';\nimport { ResolvedTheme } from '../../theme/tokens';\nimport { isTouchDevice } from '../../utils/device';\nimport { Spinner } from '../Spinner';\nimport { ScreenshotPreview } from '../ScreenshotPreview';\n\ninterface FeedbackModeProps {\n resolvedTheme: ResolvedTheme;\n placeholder?: string;\n submitText: string;\n isLoading: boolean;\n onSubmit: (data: { content?: string; rating?: number; isBug?: boolean; screenshot?: string }) => void;\n customStyles?: GotchaStyles;\n initialValues?: {\n content?: string | null;\n rating?: number | null;\n };\n isEditing?: boolean;\n showText?: boolean;\n showRating?: boolean;\n enableBugFlag?: boolean;\n bugFlagLabel?: string;\n enableScreenshot?: boolean;\n}\n\nexport function FeedbackMode({\n resolvedTheme: t,\n placeholder,\n submitText,\n isLoading,\n onSubmit,\n customStyles,\n initialValues,\n isEditing = false,\n showText = true,\n showRating = true,\n enableBugFlag = false,\n bugFlagLabel,\n enableScreenshot = false,\n}: FeedbackModeProps) {\n const [content, setContent] = useState(initialValues?.content || '');\n const [rating, setRating] = useState<number | null>(initialValues?.rating ?? null);\n const [isBug, setIsBug] = useState(false);\n const [isTouch, setIsTouch] = useState(false);\n const [screenshot, setScreenshot] = useState<string | null>(null);\n const [capturingScreenshot, setCapturingScreenshot] = useState(false);\n\n useEffect(() => {\n setIsTouch(isTouchDevice());\n }, []);\n\n useEffect(() => {\n if (initialValues?.content !== undefined) {\n setContent(initialValues.content || '');\n }\n if (initialValues?.rating !== undefined) {\n setRating(initialValues.rating ?? null);\n }\n }, [initialValues?.content, initialValues?.rating]);\n\n const canSubmit = (() => {\n if (showText && showRating) return content.trim().length > 0 || rating !== null;\n if (showText) return content.trim().length > 0;\n if (showRating) return rating !== null;\n return false;\n })();\n\n const handleScreenshotCapture = async () => {\n setCapturingScreenshot(true);\n try {\n const { captureScreenshot } = await import('../../utils/screenshot');\n const result = await captureScreenshot();\n if (result) setScreenshot(result);\n } catch {\n // Capture failed silently\n } finally {\n setCapturingScreenshot(false);\n }\n };\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n if (!canSubmit) return;\n onSubmit({\n content: showText && content.trim() ? content.trim() : undefined,\n rating: showRating && rating !== null ? rating : undefined,\n isBug: isBug || undefined,\n screenshot: screenshot || undefined,\n });\n };\n\n const inputStyles: React.CSSProperties = {\n width: '100%',\n padding: isTouch ? '12px 14px' : '10px 12px',\n border: `1px solid ${t.colors.inputBorder}`,\n borderRadius: t.borders.radius.md,\n backgroundColor: t.colors.inputBackground,\n color: t.colors.text,\n fontSize: isTouch ? t.typography.fontSize.lg : t.typography.fontSize.md,\n resize: 'none',\n minHeight: isTouch ? 100 : 80,\n fontFamily: t.typography.fontFamily,\n outline: 'none',\n transition: `border-color ${t.animation.duration.fast} ${t.animation.easing.default}, box-shadow ${t.animation.duration.fast} ${t.animation.easing.default}`,\n lineHeight: 1.5,\n boxShadow: `inset 0 1px 2px rgba(0,0,0,0.04)`,\n ...customStyles?.input,\n };\n\n const buttonStyles: React.CSSProperties = {\n width: '100%',\n padding: isTouch ? '14px 16px' : '10px 16px',\n border: t.colors.buttonBorder,\n borderRadius: t.borders.radius.md,\n backgroundColor: t.colors.buttonBackground,\n color: t.colors.buttonColor,\n fontSize: isTouch ? t.typography.fontSize.lg : t.typography.fontSize.md,\n fontWeight: t.typography.fontWeight.medium,\n fontFamily: t.typography.fontFamily,\n cursor: isLoading ? 'not-allowed' : 'pointer',\n transition: `all ${t.animation.duration.fast} ${t.animation.easing.default}`,\n letterSpacing: '0.01em',\n ...customStyles?.submitButton,\n };\n\n return (\n <form onSubmit={handleSubmit}>\n {/* Rating */}\n {showRating && (\n <div style={{\n marginBottom: showText ? (isTouch ? 16 : 12) : 0,\n ...(!showText ? { display: 'flex', justifyContent: 'center', padding: '8px 0' } : {}),\n }}>\n <StarRating value={rating} onChange={setRating} theme={t} isTouch={isTouch} large={!showText} />\n </div>\n )}\n\n {/* Text input */}\n {showText && (\n <textarea\n value={content}\n onChange={(e) => setContent(e.target.value)}\n placeholder={placeholder || 'Share your thoughts...'}\n maxLength={5000}\n style={inputStyles}\n disabled={isLoading}\n aria-label=\"Your feedback\"\n onFocus={(e) => {\n e.currentTarget.style.borderColor = t.colors.inputBorderFocus;\n e.currentTarget.style.boxShadow = `0 0 0 3px ${t.colors.inputFocusRing}`;\n e.currentTarget.style.backgroundColor = t.colors.inputBackgroundFocus;\n }}\n onBlur={(e) => {\n e.currentTarget.style.borderColor = t.colors.inputBorder;\n e.currentTarget.style.boxShadow = 'inset 0 1px 2px rgba(0,0,0,0.04)';\n e.currentTarget.style.backgroundColor = t.colors.inputBackground;\n }}\n />\n )}\n\n {/* Bug flag toggle */}\n {enableBugFlag && (\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={isBug}\n onClick={() => setIsBug(!isBug)}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 7,\n width: '100%',\n marginTop: 10,\n padding: '7px 10px',\n border: `1px solid ${\n isBug ? t.colors.warningBorder : t.colors.border\n }`,\n borderRadius: 7,\n backgroundColor: isBug ? t.colors.warningSurface : 'transparent',\n cursor: 'pointer',\n transition: `all ${t.animation.duration.fast} ${t.animation.easing.default}`,\n fontFamily: t.typography.fontFamily,\n ...customStyles?.bugFlag,\n }}\n onMouseEnter={(e) => {\n if (!isBug) {\n e.currentTarget.style.backgroundColor = t.colors.surfaceHover === t.colors.inputBackgroundFocus\n ? 'rgba(0,0,0,0.02)' : t.colors.surfaceHover;\n }\n }}\n onMouseLeave={(e) => {\n if (!isBug) {\n e.currentTarget.style.backgroundColor = 'transparent';\n }\n }}\n >\n <svg\n width={14}\n height={14}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke={isBug ? t.colors.warningActive : t.colors.textDisabled}\n strokeWidth={1.75}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={{ flexShrink: 0, transition: `stroke ${t.animation.duration.fast}` }}\n >\n <path d=\"M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126zM12 15.75h.007v.008H12v-.008z\" />\n </svg>\n <span\n style={{\n fontSize: 12,\n fontWeight: isBug ? t.typography.fontWeight.medium : t.typography.fontWeight.normal,\n color: isBug ? t.colors.warningActive : t.colors.textDisabled,\n transition: `color ${t.animation.duration.fast}`,\n letterSpacing: '0.01em',\n }}\n >\n {isBug ? 'Issue reported' : (bugFlagLabel || 'Report an issue')}\n </span>\n <div\n style={{\n marginLeft: 'auto',\n width: 28,\n height: 16,\n borderRadius: 8,\n backgroundColor: isBug ? t.colors.warning : t.colors.border,\n position: 'relative',\n transition: `background-color ${t.animation.duration.fast} ${t.animation.easing.default}`,\n flexShrink: 0,\n }}\n >\n <div\n style={{\n position: 'absolute',\n top: 2,\n left: isBug ? 14 : 2,\n width: 12,\n height: 12,\n borderRadius: '50%',\n backgroundColor: isBug ? '#ffffff' : t.colors.textDisabled,\n transition: `left ${t.animation.duration.fast} ${t.animation.easing.default}, background-color ${t.animation.duration.fast}`,\n boxShadow: '0 1px 2px rgba(0,0,0,0.15)',\n }}\n />\n </div>\n </button>\n )}\n\n {/* Screenshot capture — shown when bug flag is active */}\n {enableBugFlag && enableScreenshot && isBug && !screenshot && (\n <button\n type=\"button\"\n onClick={handleScreenshotCapture}\n disabled={capturingScreenshot}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n width: '100%',\n marginTop: 8,\n padding: '7px 10px',\n border: `1px solid ${t.colors.border}`,\n borderRadius: 7,\n backgroundColor: 'transparent',\n cursor: capturingScreenshot ? 'not-allowed' : 'pointer',\n fontFamily: t.typography.fontFamily,\n fontSize: 12,\n color: t.colors.textSecondary,\n transition: `all ${t.animation.duration.fast} ${t.animation.easing.default}`,\n }}\n onMouseEnter={(e) => { e.currentTarget.style.backgroundColor = t.colors.surfaceHover; }}\n onMouseLeave={(e) => { e.currentTarget.style.backgroundColor = 'transparent'; }}\n >\n {capturingScreenshot ? (\n <Spinner size={14} color={t.colors.textSecondary} />\n ) : (\n <svg width={14} height={14} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={1.75} strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"2\" y=\"3\" width=\"20\" height=\"14\" rx=\"2\" />\n <circle cx=\"12\" cy=\"10\" r=\"3\" />\n <path d=\"M2 17l4-4 3 3 4-4 9 9\" />\n </svg>\n )}\n {capturingScreenshot ? 'Capturing...' : 'Capture screenshot'}\n </button>\n )}\n\n {/* Screenshot preview */}\n {enableBugFlag && enableScreenshot && isBug && screenshot && (\n <ScreenshotPreview\n src={screenshot}\n onRemove={() => setScreenshot(null)}\n resolvedTheme={t}\n />\n )}\n\n {/* Submit button */}\n <button\n type=\"submit\"\n disabled={isLoading || !canSubmit}\n style={{\n ...buttonStyles,\n marginTop: 12,\n opacity: isLoading ? 0.8 : 1,\n backgroundColor: !canSubmit ? t.colors.buttonBackgroundDisabled : t.colors.buttonBackground,\n color: !canSubmit ? t.colors.buttonColorDisabled : t.colors.buttonColor,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 8,\n ...(isLoading ? {\n backgroundImage: `linear-gradient(90deg, transparent 0%, rgba(255,255,255,0.1) 50%, transparent 100%)`,\n backgroundSize: '200% 100%',\n animation: 'gotcha-shimmer 1.5s ease infinite',\n } : {}),\n }}\n onMouseEnter={(e) => {\n if (!e.currentTarget.disabled) {\n e.currentTarget.style.backgroundColor = t.colors.buttonBackgroundHover;\n e.currentTarget.style.transform = 'translateY(-1px)';\n e.currentTarget.style.boxShadow = t.shadows.button;\n }\n }}\n onMouseLeave={(e) => {\n if (!e.currentTarget.disabled) {\n e.currentTarget.style.backgroundColor = t.colors.buttonBackground;\n e.currentTarget.style.transform = 'translateY(0)';\n e.currentTarget.style.boxShadow = 'none';\n }\n }}\n >\n {isLoading && <Spinner size={isTouch ? 18 : 16} color={t.colors.buttonColor} />}\n {isLoading ? (isEditing ? 'Updating...' : 'Submitting...') : (isEditing ? 'Update' : submitText)}\n </button>\n </form>\n );\n}\n\ninterface StarRatingProps {\n value: number | null;\n onChange: (rating: number) => void;\n theme: ResolvedTheme;\n isTouch: boolean;\n large?: boolean;\n}\n\nfunction StarRating({ value, onChange, theme: t, isTouch, large = false }: StarRatingProps) {\n const [hovered, setHovered] = useState<number | null>(null);\n const [pulsing, setPulsing] = useState<number | null>(null);\n const pulseTimerRef = useRef<ReturnType<typeof setTimeout>>();\n const starSize = large ? (isTouch ? 36 : 28) : (isTouch ? 28 : 18);\n const buttonPadding = large ? (isTouch ? 8 : 5) : (isTouch ? 8 : 3);\n\n useEffect(() => {\n return () => { clearTimeout(pulseTimerRef.current); };\n }, []);\n\n const handleClick = (star: number) => {\n setPulsing(star);\n onChange(star);\n clearTimeout(pulseTimerRef.current);\n pulseTimerRef.current = setTimeout(() => setPulsing(null), 300);\n };\n\n return (\n <div\n style={{\n display: 'flex',\n gap: large ? (isTouch ? 8 : 6) : (isTouch ? 6 : 2),\n }}\n role=\"group\"\n aria-label=\"Rating\"\n >\n {[1, 2, 3, 4, 5].map((star) => {\n const isFilled = (hovered ?? value ?? 0) >= star;\n return (\n <button\n key={star}\n type=\"button\"\n onClick={() => handleClick(star)}\n onMouseEnter={() => setHovered(star)}\n onMouseLeave={() => setHovered(null)}\n aria-label={`Rate ${star} out of 5`}\n aria-pressed={value === star}\n style={{\n background: 'none',\n border: 'none',\n cursor: 'pointer',\n padding: buttonPadding,\n color: isFilled ? t.colors.starFilled : t.colors.starEmpty,\n transition: `color 0.15s ${t.animation.easing.default}`,\n transform: pulsing === star ? 'scale(1)' : ((hovered !== null && hovered >= star) ? 'scale(1.1)' : 'scale(1)'),\n animation: pulsing === star ? `gotcha-star-pulse 0.3s ${t.animation.easing.spring}` : 'none',\n filter: isFilled ? `drop-shadow(0 0 3px ${t.colors.starFilled}40)` : 'none',\n transitionDelay: `${(star - 1) * 30}ms`,\n }}\n >\n <svg width={starSize} height={starSize} viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z\" />\n </svg>\n </button>\n );\n })}\n </div>\n );\n}\n","import React, { useEffect, useState } from 'react';\nimport { ResolvedTheme } from '../../theme/tokens';\nimport { isTouchDevice } from '../../utils/device';\nimport { Spinner } from '../Spinner';\n\ninterface VoteModeProps {\n resolvedTheme: ResolvedTheme;\n isLoading: boolean;\n onSubmit: (data: { vote: 'up' | 'down' }) => void;\n initialVote?: 'up' | 'down' | null;\n isEditing?: boolean;\n labels?: { up: string; down: string };\n}\n\nexport function VoteMode({ resolvedTheme: t, isLoading, onSubmit, initialVote, isEditing = false, labels }: VoteModeProps) {\n const [isTouch, setIsTouch] = useState(false);\n const [activeVote, setActiveVote] = useState<'up' | 'down' | null>(initialVote || null);\n const [previousVote, setPreviousVote] = useState<'up' | 'down' | null>(initialVote || null);\n\n useEffect(() => {\n setIsTouch(isTouchDevice());\n }, []);\n\n useEffect(() => {\n if (initialVote !== undefined) {\n setPreviousVote(initialVote);\n setActiveVote(initialVote);\n }\n }, [initialVote]);\n\n useEffect(() => {\n if (!isLoading && !isEditing) {\n setActiveVote(null);\n }\n }, [isLoading, isEditing]);\n\n const handleVote = (vote: 'up' | 'down') => {\n setActiveVote(vote);\n onSubmit({ vote });\n };\n\n const getButtonStyles = (voteType: 'up' | 'down'): React.CSSProperties => {\n const isSelected = previousVote === voteType;\n const color = voteType === 'up' ? t.colors.voteUp : t.colors.voteDown;\n const surface = voteType === 'up' ? t.colors.voteUpSurface : t.colors.voteDownSurface;\n const border = voteType === 'up' ? t.colors.voteUpBorder : t.colors.voteDownBorder;\n\n return {\n flex: 1,\n minWidth: 0,\n overflow: 'hidden' as const,\n padding: isTouch ? '14px 18px' : '10px 14px',\n border: isSelected\n ? `2px solid ${border}`\n : `1px solid ${t.colors.border}`,\n borderRadius: t.borders.radius.lg - 2,\n background: isSelected\n ? `linear-gradient(135deg, ${surface}, ${surface})`\n : t.colors.surface,\n color: isSelected ? color : t.colors.textSecondary,\n fontSize: isTouch ? 28 : 24,\n fontFamily: t.typography.fontFamily,\n cursor: isLoading ? 'not-allowed' : 'pointer',\n transition: `all 0.2s ${t.animation.easing.default}`,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: isTouch ? 10 : 8,\n };\n };\n\n const iconSize = isTouch ? 24 : 20;\n\n return (\n <div\n style={{\n display: 'flex',\n gap: isTouch ? 12 : 10,\n }}\n role=\"group\"\n aria-label=\"Vote\"\n >\n <button\n type=\"button\"\n onClick={() => handleVote('up')}\n disabled={isLoading}\n style={getButtonStyles('up')}\n aria-label=\"Vote up - I like this\"\n aria-pressed={previousVote === 'up'}\n onMouseEnter={(e) => {\n if (!isLoading) {\n e.currentTarget.style.transform = 'translateY(-2px) scale(1.02)';\n e.currentTarget.style.boxShadow = t.shadows.button;\n }\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.transform = 'translateY(0) scale(1)';\n e.currentTarget.style.boxShadow = 'none';\n }}\n >\n {isLoading && activeVote === 'up' ? (\n <>\n <Spinner size={iconSize} color={t.colors.text} />\n <span style={{ fontSize: isTouch ? 15 : 13, fontWeight: t.typography.fontWeight.medium, letterSpacing: '0.01em' }}>\n {isEditing ? 'Updating...' : 'Sending...'}\n </span>\n </>\n ) : (\n <>\n <ThumbsUpIcon size={iconSize} />\n <span style={{ fontSize: isTouch ? 15 : 13, fontWeight: t.typography.fontWeight.medium, letterSpacing: '0.01em' }}>\n {labels?.up || (previousVote === 'up' ? 'Liked' : 'Like')}\n </span>\n </>\n )}\n </button>\n\n <button\n type=\"button\"\n onClick={() => handleVote('down')}\n disabled={isLoading}\n style={getButtonStyles('down')}\n aria-label=\"Vote down - I don't like this\"\n aria-pressed={previousVote === 'down'}\n onMouseEnter={(e) => {\n if (!isLoading) {\n e.currentTarget.style.transform = 'translateY(-2px) scale(1.02)';\n e.currentTarget.style.boxShadow = t.shadows.button;\n }\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.transform = 'translateY(0) scale(1)';\n e.currentTarget.style.boxShadow = 'none';\n }}\n >\n {isLoading && activeVote === 'down' ? (\n <>\n <Spinner size={iconSize} color={t.colors.text} />\n <span style={{ fontSize: isTouch ? 15 : 13, fontWeight: t.typography.fontWeight.medium, letterSpacing: '0.01em' }}>\n {isEditing ? 'Updating...' : 'Sending...'}\n </span>\n </>\n ) : (\n <>\n <ThumbsDownIcon size={iconSize} />\n <span style={{ fontSize: isTouch ? 15 : 13, fontWeight: t.typography.fontWeight.medium, letterSpacing: '0.01em' }}>\n {labels?.down || (previousVote === 'down' ? 'Disliked' : 'Dislike')}\n </span>\n </>\n )}\n </button>\n </div>\n );\n}\n\nfunction ThumbsUpIcon({ size = 24 }: { size?: number }) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.75\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3\" />\n </svg>\n );\n}\n\nfunction ThumbsDownIcon({ size = 24 }: { size?: number }) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.75\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17\" />\n </svg>\n );\n}\n","import React, { useState, useEffect } from 'react';\nimport { ResolvedTheme } from '../../theme/tokens';\nimport { isTouchDevice } from '../../utils/device';\nimport { Spinner } from '../Spinner';\n\ninterface PollModeProps {\n resolvedTheme: ResolvedTheme;\n options: string[];\n allowMultiple: boolean;\n isLoading: boolean;\n onSubmit: (data: { pollSelected: string[] }) => void;\n initialSelected?: string[] | null;\n isEditing?: boolean;\n}\n\nexport function PollMode({\n resolvedTheme: t,\n options,\n allowMultiple,\n isLoading,\n onSubmit,\n initialSelected,\n isEditing = false,\n}: PollModeProps) {\n const [selected, setSelected] = useState<string[]>(initialSelected || []);\n const [isTouch, setIsTouch] = useState(false);\n\n useEffect(() => {\n setIsTouch(isTouchDevice());\n }, []);\n\n useEffect(() => {\n if (initialSelected) {\n setSelected(initialSelected);\n }\n }, [initialSelected]);\n\n const handleToggle = (option: string) => {\n if (allowMultiple) {\n setSelected((prev) =>\n prev.includes(option) ? prev.filter((o) => o !== option) : [...prev, option]\n );\n } else {\n setSelected((prev) => (prev.includes(option) ? [] : [option]));\n }\n };\n\n const handleSubmit = () => {\n if (selected.length === 0) return;\n onSubmit({ pollSelected: selected });\n };\n\n const getOptionStyles = (option: string, index: number): React.CSSProperties => {\n const isSelected = selected.includes(option);\n return {\n width: '100%',\n padding: isTouch ? '12px 14px' : '9px 12px',\n border: `1px solid ${isSelected ? t.colors.pollSelectedBorder : t.colors.pollBorder}`,\n borderRadius: t.borders.radius.lg - 2,\n backgroundColor: isSelected ? t.colors.pollSelectedBackground : t.colors.pollBackground,\n color: isSelected ? t.colors.pollSelectedColor : t.colors.pollColor,\n fontSize: isTouch ? 15 : t.typography.fontSize.sm,\n fontWeight: isSelected ? t.typography.fontWeight.semibold : t.typography.fontWeight.medium,\n fontFamily: t.typography.fontFamily,\n cursor: isLoading ? 'not-allowed' : 'pointer',\n transition: `all 0.2s ${t.animation.easing.default}`,\n textAlign: 'left' as const,\n letterSpacing: '0.01em',\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n animation: `gotcha-fade-up ${t.animation.duration.normal} ${t.animation.easing.default} both`,\n animationDelay: `${index * 0.05}s`,\n };\n };\n\n return (\n <div>\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n gap: isTouch ? 8 : 6,\n }}\n role=\"group\"\n aria-label={allowMultiple ? 'Select one or more options' : 'Select an option'}\n >\n {options.map((option, index) => {\n const isSelected = selected.includes(option);\n return (\n <button\n key={option}\n type=\"button\"\n onClick={() => handleToggle(option)}\n disabled={isLoading}\n style={getOptionStyles(option, index)}\n aria-pressed={isSelected}\n onMouseEnter={(e) => {\n if (!isLoading) {\n e.currentTarget.style.transform = 'translateX(2px)';\n }\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.transform = 'translateX(0)';\n }}\n >\n <span\n style={{\n width: 16,\n height: 16,\n borderRadius: allowMultiple ? 4 : '50%',\n border: `2px solid ${isSelected ? t.colors.pollCheckSelectedBorder : t.colors.pollCheckBorder}`,\n backgroundColor: isSelected ? t.colors.pollCheckSelectedBg : 'transparent',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n transition: `all ${t.animation.duration.fast}`,\n }}\n >\n {isSelected && (\n <svg width={10} height={10} viewBox=\"0 0 12 12\" fill=\"none\">\n <path\n d=\"M2 6l3 3 5-5\"\n stroke=\"#fff\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )}\n </span>\n {option}\n </button>\n );\n })}\n </div>\n\n <button\n type=\"button\"\n onClick={handleSubmit}\n disabled={isLoading || selected.length === 0}\n style={{\n width: '100%',\n marginTop: 12,\n padding: isTouch ? '14px 16px' : '10px 16px',\n border: t.colors.buttonBorder,\n borderRadius: t.borders.radius.md,\n backgroundColor: selected.length === 0 ? t.colors.buttonBackgroundDisabled : t.colors.buttonBackground,\n color: selected.length === 0 ? t.colors.buttonColorDisabled : t.colors.buttonColor,\n fontSize: isTouch ? t.typography.fontSize.lg : t.typography.fontSize.md,\n fontWeight: t.typography.fontWeight.medium,\n fontFamily: t.typography.fontFamily,\n cursor: isLoading || selected.length === 0 ? 'not-allowed' : 'pointer',\n transition: `all ${t.animation.duration.fast} ${t.animation.easing.default}`,\n letterSpacing: '0.01em',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 8,\n opacity: isLoading ? 0.8 : 1,\n ...(isLoading ? {\n backgroundImage: `linear-gradient(90deg, transparent 0%, rgba(255,255,255,0.1) 50%, transparent 100%)`,\n backgroundSize: '200% 100%',\n animation: 'gotcha-shimmer 1.5s ease infinite',\n } : {}),\n }}\n onMouseEnter={(e) => {\n if (!e.currentTarget.disabled) {\n e.currentTarget.style.backgroundColor = t.colors.buttonBackgroundHover;\n e.currentTarget.style.transform = 'translateY(-1px)';\n e.currentTarget.style.boxShadow = t.shadows.button;\n }\n }}\n onMouseLeave={(e) => {\n if (!e.currentTarget.disabled) {\n e.currentTarget.style.backgroundColor = selected.length === 0\n ? t.colors.buttonBackgroundDisabled\n : t.colors.buttonBackground;\n e.currentTarget.style.transform = 'translateY(0)';\n e.currentTarget.style.boxShadow = 'none';\n }\n }}\n >\n {isLoading && <Spinner size={isTouch ? 18 : 16} color={t.colors.buttonColor} />}\n {isLoading ? (isEditing ? 'Updating...' : 'Submitting...') : (isEditing ? 'Update' : 'Submit')}\n </button>\n </div>\n );\n}\n","import React, { useState, useEffect } from 'react';\nimport { GotchaStyles } from '../../types';\nimport { ResolvedTheme } from '../../theme/tokens';\nimport { isTouchDevice } from '../../utils/device';\nimport { Spinner } from '../Spinner';\n\ninterface NpsModeProps {\n resolvedTheme: ResolvedTheme;\n submitText: string;\n isLoading: boolean;\n onSubmit: (data: { rating?: number; content?: string }) => void;\n customStyles?: GotchaStyles;\n showFollowUp?: boolean;\n followUpPlaceholder?: string;\n lowLabel?: string;\n highLabel?: string;\n initialValues?: {\n rating?: number | null;\n content?: string | null;\n };\n isEditing?: boolean;\n}\n\nexport function NpsMode({\n resolvedTheme: t,\n submitText,\n isLoading,\n onSubmit,\n customStyles,\n showFollowUp = true,\n followUpPlaceholder,\n lowLabel = 'Not likely',\n highLabel = 'Very likely',\n initialValues,\n isEditing = false,\n}: NpsModeProps) {\n const [score, setScore] = useState<number | null>(initialValues?.rating ?? null);\n const [content, setContent] = useState(initialValues?.content || '');\n const [isTouch, setIsTouch] = useState(false);\n const [hoveredScore, setHoveredScore] = useState<number | null>(null);\n\n useEffect(() => {\n setIsTouch(isTouchDevice());\n }, []);\n\n useEffect(() => {\n if (initialValues?.rating !== undefined) {\n setScore(initialValues.rating ?? null);\n }\n if (initialValues?.content !== undefined) {\n setContent(initialValues.content || '');\n }\n }, [initialValues?.rating, initialValues?.content]);\n\n const canSubmit = score !== null;\n const npsColors = t.colors.npsColors;\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n if (!canSubmit) return;\n onSubmit({\n rating: score ?? undefined,\n content: showFollowUp && content.trim() ? content.trim() : undefined,\n });\n };\n\n return (\n <form onSubmit={handleSubmit}>\n {/* Score scale */}\n <div>\n {/* Number buttons — always single row */}\n <div\n style={{\n display: 'flex',\n gap: isTouch ? 4 : 6,\n justifyContent: 'center',\n }}\n role=\"group\"\n aria-label=\"NPS Score\"\n >\n {Array.from({ length: 11 }, (_, i) => {\n const selected = score === i;\n const hovered = hoveredScore === i;\n const color = npsColors[i];\n\n return (\n <button\n key={i}\n type=\"button\"\n onClick={() => setScore(i)}\n onMouseEnter={() => setHoveredScore(i)}\n onMouseLeave={() => setHoveredScore(null)}\n aria-label={`Score ${i} out of 10`}\n aria-pressed={selected}\n style={{\n flex: 1,\n minWidth: 0,\n height: isTouch ? 34 : 32,\n borderRadius: t.borders.radius.sm,\n border: selected\n ? `2px solid ${color}`\n : `1.5px solid ${color}25`,\n backgroundColor: selected\n ? color\n : hovered\n ? `${color}25`\n : `${color}0c`,\n color: selected\n ? '#fff'\n : hovered\n ? color\n : `${color}bb`,\n fontSize: 12,\n fontWeight: selected ? t.typography.fontWeight.bold : t.typography.fontWeight.semibold,\n fontFamily: t.typography.fontFamily,\n fontVariantNumeric: 'tabular-nums',\n cursor: 'pointer',\n padding: 0,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n transition: `all 0.2s ${t.animation.easing.spring}`,\n transform: selected ? 'scale(1.08)' : hovered ? 'scale(1.04)' : 'scale(1)',\n boxShadow: selected\n ? `0 0 12px ${color}40`\n : 'none',\n ...customStyles?.npsButton,\n ...(selected ? customStyles?.npsButtonSelected : {}),\n }}\n >\n {i}\n </button>\n );\n })}\n </div>\n\n {/* Labels */}\n <div\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n marginTop: 6,\n padding: '0 2px',\n ...customStyles?.npsLabels,\n }}\n >\n <span style={{\n fontSize: t.typography.fontSize.xs,\n color: t.colors.textDisabled,\n fontWeight: t.typography.fontWeight.medium,\n letterSpacing: '0.02em',\n }}>\n {lowLabel}\n </span>\n <span style={{\n fontSize: t.typography.fontSize.xs,\n color: t.colors.textDisabled,\n fontWeight: t.typography.fontWeight.medium,\n letterSpacing: '0.02em',\n }}>\n {highLabel}\n </span>\n </div>\n </div>\n\n {/* Follow-up textarea — animated reveal */}\n {showFollowUp && score !== null && (\n <textarea\n value={content}\n onChange={(e) => setContent(e.target.value)}\n placeholder={followUpPlaceholder || 'What\\'s the main reason for your score?'}\n maxLength={5000}\n style={{\n width: '100%',\n padding: isTouch ? '12px 14px' : '10px 12px',\n border: `1px solid ${t.colors.inputBorder}`,\n borderRadius: t.borders.radius.md,\n backgroundColor: t.colors.inputBackground,\n color: t.colors.text,\n fontSize: isTouch ? t.typography.fontSize.lg : t.typography.fontSize.md,\n resize: 'vertical' as const,\n minHeight: isTouch ? 80 : 60,\n fontFamily: t.typography.fontFamily,\n outline: 'none',\n transition: `border-color ${t.animation.duration.fast} ${t.animation.easing.default}, box-shadow ${t.animation.duration.fast} ${t.animation.easing.default}`,\n lineHeight: 1.5,\n animation: `gotcha-expand-in 0.3s ${t.animation.easing.default} both`,\n overflow: 'hidden',\n ...customStyles?.input,\n }}\n disabled={isLoading}\n aria-label=\"Follow-up feedback\"\n onFocus={(e) => {\n e.currentTarget.style.borderColor = t.colors.inputBorderFocus;\n e.currentTarget.style.boxShadow = `0 0 0 3px ${t.colors.inputFocusRing}`;\n e.currentTarget.style.backgroundColor = t.colors.inputBackgroundFocus;\n }}\n onBlur={(e) => {\n e.currentTarget.style.borderColor = t.colors.inputBorder;\n e.currentTarget.style.boxShadow = 'none';\n e.currentTarget.style.backgroundColor = t.colors.inputBackground;\n }}\n />\n )}\n\n {/* Submit button */}\n <button\n type=\"submit\"\n disabled={isLoading || !canSubmit}\n style={{\n width: '100%',\n padding: isTouch ? '14px 16px' : '10px 16px',\n border: t.colors.buttonBorder,\n borderRadius: t.borders.radius.md,\n backgroundColor: !canSubmit ? t.colors.buttonBackgroundDisabled : t.colors.buttonBackground,\n color: !canSubmit ? t.colors.buttonColorDisabled : t.colors.buttonColor,\n fontSize: isTouch ? t.typography.fontSize.lg : t.typography.fontSize.md,\n fontWeight: t.typography.fontWeight.medium,\n fontFamily: t.typography.fontFamily,\n cursor: isLoading ? 'not-allowed' : 'pointer',\n transition: `all ${t.animation.duration.fast} ${t.animation.easing.default}`,\n letterSpacing: '0.01em',\n opacity: isLoading ? 0.8 : 1,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 8,\n marginTop: 12,\n ...(isLoading ? {\n backgroundImage: `linear-gradient(90deg, transparent 0%, rgba(255,255,255,0.1) 50%, transparent 100%)`,\n backgroundSize: '200% 100%',\n animation: 'gotcha-shimmer 1.5s ease infinite',\n } : {}),\n ...customStyles?.submitButton,\n }}\n onMouseEnter={(e) => {\n if (!e.currentTarget.disabled) {\n e.currentTarget.style.backgroundColor = t.colors.buttonBackgroundHover;\n e.currentTarget.style.transform = 'translateY(-1px)';\n e.currentTarget.style.boxShadow = t.shadows.button;\n }\n }}\n onMouseLeave={(e) => {\n if (!e.currentTarget.disabled) {\n e.currentTarget.style.backgroundColor = !canSubmit ? t.colors.buttonBackgroundDisabled : t.colors.buttonBackground;\n e.currentTarget.style.transform = 'translateY(0)';\n e.currentTarget.style.boxShadow = 'none';\n }\n }}\n >\n {isLoading && <Spinner size={isTouch ? 18 : 16} color={t.colors.buttonColor} />}\n {isLoading ? (isEditing ? 'Updating...' : 'Submitting...') : (isEditing ? 'Update' : submitText)}\n </button>\n </form>\n );\n}\n","import React, { useState, useEffect } from 'react';\nimport { ResolvedTheme } from '../theme/tokens';\nimport { isTouchDevice } from '../utils/device';\nimport { Spinner } from './Spinner';\n\ninterface FollowUpPromptProps {\n resolvedTheme: ResolvedTheme;\n promptText: string;\n placeholder?: string;\n isLoading: boolean;\n onSubmit: (content: string) => void;\n}\n\nexport function FollowUpPrompt({\n resolvedTheme: t,\n promptText,\n placeholder,\n isLoading,\n onSubmit,\n}: FollowUpPromptProps) {\n const [content, setContent] = useState('');\n const [isTouch, setIsTouch] = useState(false);\n\n useEffect(() => {\n setIsTouch(isTouchDevice());\n }, []);\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n if (!content.trim()) return;\n onSubmit(content.trim());\n };\n\n return (\n <form onSubmit={handleSubmit}>\n <p style={{\n margin: '0 0 12px 0',\n fontSize: t.typography.fontSize.sm,\n color: t.colors.textSecondary,\n lineHeight: 1.4,\n fontFamily: t.typography.fontFamily,\n }}>\n {promptText}\n </p>\n\n <textarea\n value={content}\n onChange={(e) => setContent(e.target.value)}\n placeholder={placeholder || 'Tell us more...'}\n maxLength={5000}\n disabled={isLoading}\n aria-label=\"Follow-up feedback\"\n style={{\n width: '100%',\n padding: isTouch ? '12px 14px' : '10px 12px',\n border: `1px solid ${t.colors.inputBorder}`,\n borderRadius: t.borders.radius.md,\n backgroundColor: t.colors.inputBackground,\n color: t.colors.text,\n fontSize: isTouch ? t.typography.fontSize.lg : t.typography.fontSize.md,\n resize: 'none',\n minHeight: isTouch ? 100 : 80,\n fontFamily: t.typography.fontFamily,\n outline: 'none',\n transition: `border-color ${t.animation.duration.fast} ${t.animation.easing.default}, box-shadow ${t.animation.duration.fast} ${t.animation.easing.default}`,\n lineHeight: 1.5,\n boxShadow: 'inset 0 1px 2px rgba(0,0,0,0.04)',\n }}\n onFocus={(e) => {\n e.currentTarget.style.borderColor = t.colors.inputBorderFocus;\n e.currentTarget.style.boxShadow = `0 0 0 3px ${t.colors.inputFocusRing}`;\n e.currentTarget.style.backgroundColor = t.colors.inputBackgroundFocus;\n }}\n onBlur={(e) => {\n e.currentTarget.style.borderColor = t.colors.inputBorder;\n e.currentTarget.style.boxShadow = 'inset 0 1px 2px rgba(0,0,0,0.04)';\n e.currentTarget.style.backgroundColor = t.colors.inputBackground;\n }}\n />\n\n <button\n type=\"submit\"\n disabled={isLoading || !content.trim()}\n style={{\n width: '100%',\n marginTop: 12,\n padding: isTouch ? '14px 16px' : '10px 16px',\n border: t.colors.buttonBorder,\n borderRadius: t.borders.radius.md,\n backgroundColor: !content.trim() ? t.colors.buttonBackgroundDisabled : t.colors.buttonBackground,\n color: !content.trim() ? t.colors.buttonColorDisabled : t.colors.buttonColor,\n fontSize: isTouch ? t.typography.fontSize.lg : t.typography.fontSize.md,\n fontWeight: t.typography.fontWeight.medium,\n fontFamily: t.typography.fontFamily,\n cursor: isLoading ? 'not-allowed' : 'pointer',\n transition: `all ${t.animation.duration.fast} ${t.animation.easing.default}`,\n letterSpacing: '0.01em',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 8,\n opacity: isLoading ? 0.8 : 1,\n }}\n onMouseEnter={(e) => {\n if (!e.currentTarget.disabled) {\n e.currentTarget.style.backgroundColor = t.colors.buttonBackgroundHover;\n e.currentTarget.style.transform = 'translateY(-1px)';\n e.currentTarget.style.boxShadow = t.shadows.button;\n }\n }}\n onMouseLeave={(e) => {\n if (!e.currentTarget.disabled) {\n e.currentTarget.style.backgroundColor = t.colors.buttonBackground;\n e.currentTarget.style.transform = 'translateY(0)';\n e.currentTarget.style.boxShadow = 'none';\n }\n }}\n >\n {isLoading && <Spinner size={isTouch ? 18 : 16} color={t.colors.buttonColor} />}\n {isLoading ? 'Sending...' : 'Submit'}\n </button>\n </form>\n );\n}\n","import React, { useRef, useEffect, useState, useMemo } from 'react';\nimport { Theme, GotchaStyles, ResponseMode, ExistingResponse } from '../types';\nimport { ResolvedTheme } from '../theme/tokens';\nimport { resolveTheme } from '../theme/resolveTheme';\nimport { injectStyles } from '../theme/styles';\nimport { cn } from '../utils/cn';\nimport { useGotchaContext } from './GotchaProvider';\nimport { FeedbackMode } from './modes/FeedbackMode';\nimport { VoteMode } from './modes/VoteMode';\nimport { PollMode } from './modes/PollMode';\nimport { Spinner } from './Spinner';\nimport { NpsMode } from './modes/NpsMode';\nimport { FollowUpPrompt } from './FollowUpPrompt';\n\nexport interface GotchaModalProps {\n mode: ResponseMode;\n theme: Theme;\n customStyles?: GotchaStyles;\n promptText?: string;\n placeholder?: string;\n submitText: string;\n thankYouMessage: string;\n // State\n isLoading: boolean;\n isCheckingExisting?: boolean;\n isSubmitted: boolean;\n phase?: 'form' | 'followUp' | 'success';\n followUpConfig?: { promptText: string; placeholder?: string };\n followUpLoading?: boolean;\n onFollowUpSubmit?: (content: string) => void;\n error: string | null;\n // Edit mode\n existingResponse?: ExistingResponse | null;\n isEditing?: boolean;\n // Vote mode\n voteLabels?: { up: string; down: string };\n // Feedback mode field visibility\n showText?: boolean;\n showRating?: boolean;\n // Poll mode\n options?: string[];\n allowMultiple?: boolean;\n // NPS mode\n npsQuestion?: string;\n npsFollowUp?: boolean;\n npsFollowUpPlaceholder?: string;\n npsLowLabel?: string;\n npsHighLabel?: string;\n // Bug flagging\n enableBugFlag?: boolean;\n bugFlagLabel?: string;\n enableScreenshot?: boolean;\n // Handlers\n onSubmit: (data: { content?: string; rating?: number; vote?: 'up' | 'down'; pollSelected?: string[]; isBug?: boolean; screenshot?: string }) => void;\n onClose: () => void;\n // Position info from parent\n anchorRect?: DOMRect;\n /**\n * When true (desktop portal), use fixed positioning relative to the viewport\n * instead of absolute positioning relative to the container.\n */\n useFixedPosition?: boolean;\n}\n\nexport function GotchaModal({\n mode,\n theme,\n customStyles,\n promptText,\n placeholder,\n submitText,\n thankYouMessage,\n isLoading,\n isCheckingExisting = false,\n isSubmitted,\n phase = 'form',\n followUpConfig,\n followUpLoading = false,\n onFollowUpSubmit,\n error,\n existingResponse,\n isEditing = false,\n showText = true,\n showRating = true,\n voteLabels,\n options,\n allowMultiple = false,\n npsQuestion,\n npsFollowUp = true,\n npsFollowUpPlaceholder,\n npsLowLabel,\n npsHighLabel,\n enableBugFlag = false,\n bugFlagLabel,\n enableScreenshot = false,\n onSubmit,\n onClose,\n anchorRect,\n useFixedPosition = false,\n}: GotchaModalProps) {\n const modalRef = useRef<HTMLDivElement>(null);\n const firstFocusableRef = useRef<HTMLButtonElement>(null);\n const onCloseRef = useRef(onClose);\n onCloseRef.current = onClose;\n\n const [isMobile, setIsMobile] = useState(false);\n const [systemTheme, setSystemTheme] = useState<'light' | 'dark'>('light');\n\n const { themeConfig } = useGotchaContext();\n\n // Detect mobile and system theme after mount (SSR-safe)\n useEffect(() => {\n setIsMobile(window.innerWidth < 640);\n\n const darkQuery = window.matchMedia('(prefers-color-scheme: dark)');\n setSystemTheme(darkQuery.matches ? 'dark' : 'light');\n\n const handler = (e: MediaQueryListEvent) => setSystemTheme(e.matches ? 'dark' : 'light');\n darkQuery.addEventListener('change', handler);\n return () => darkQuery.removeEventListener('change', handler);\n }, []);\n\n // Resolve theme with provider config\n const t: ResolvedTheme = useMemo(\n () => resolveTheme(theme, systemTheme, themeConfig),\n [theme, systemTheme, themeConfig]\n );\n\n // Re-inject styles when theme changes\n useEffect(() => {\n injectStyles(t);\n }, [t]);\n\n // Determine if modal should appear above or below\n // Only compute on client after mount (anchorRect is only set on client)\n const showAbove = (() => {\n if (typeof window === 'undefined' || !anchorRect) return false;\n const spaceBelow = window.innerHeight - anchorRect.bottom;\n return spaceBelow < 300;\n })();\n\n // Focus trap — use ref for onClose so effect runs once\n useEffect(() => {\n const modal = modalRef.current;\n if (!modal) return;\n\n firstFocusableRef.current?.focus();\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n onCloseRef.current();\n return;\n }\n\n if (e.key === 'Tab') {\n const focusableElements = modal.querySelectorAll<HTMLElement>(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\n );\n const firstElement = focusableElements[0];\n const lastElement = focusableElements[focusableElements.length - 1];\n\n if (e.shiftKey && document.activeElement === firstElement) {\n e.preventDefault();\n lastElement?.focus();\n } else if (!e.shiftKey && document.activeElement === lastElement) {\n e.preventDefault();\n firstElement?.focus();\n }\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, []);\n\n const defaultPrompt = mode === 'vote'\n ? 'What do you think?'\n : mode === 'poll'\n ? 'Cast your vote'\n : mode === 'nps'\n ? (npsQuestion || 'How likely are you to recommend us?')\n : 'What do you think of this feature?';\n\n const modalPadding = isMobile ? 24 : 20;\n const modalWidth = mode === 'nps' ? 420 : 340;\n\n // Animation class\n const animationClass = isMobile\n ? 'gotcha-modal-enter-center'\n : showAbove\n ? 'gotcha-modal-enter-above'\n : 'gotcha-modal-enter';\n\n const viewportHeight = typeof window !== 'undefined' ? window.innerHeight : 0;\n\n const modalStyles: React.CSSProperties = isMobile\n ? {\n position: 'fixed',\n left: '50%',\n top: '50%',\n transform: 'translate(-50%, -50%)',\n width: 'calc(100vw - 32px)',\n maxWidth: modalWidth,\n padding: modalPadding,\n borderRadius: t.borders.radius.lg + 2,\n background: t.colors.backgroundGradient,\n color: t.colors.text,\n boxShadow: t.shadows.modal,\n border: `${t.borders.width}px solid ${t.colors.border}`,\n zIndex: 9999,\n fontFamily: t.typography.fontFamily,\n ...customStyles?.modal,\n textAlign: 'left' as const,\n }\n : useFixedPosition && anchorRect && viewportHeight\n ? {\n position: 'fixed',\n left: anchorRect.left + anchorRect.width / 2,\n width: modalWidth,\n padding: modalPadding,\n borderRadius: t.borders.radius.lg,\n background: t.colors.backgroundGradient,\n color: t.colors.text,\n boxShadow: t.shadows.modal,\n border: `${t.borders.width}px solid ${t.colors.border}`,\n zIndex: 99999,\n fontFamily: t.typography.fontFamily,\n ...(showAbove\n ? { bottom: viewportHeight - anchorRect.top + 8, transform: 'translateX(-50%)' }\n : { top: anchorRect.bottom + 8, transform: 'translateX(-50%)' }),\n ...customStyles?.modal,\n textAlign: 'left' as const,\n }\n : {\n position: 'absolute' as const,\n left: '50%',\n width: modalWidth,\n padding: modalPadding,\n borderRadius: t.borders.radius.lg,\n background: t.colors.backgroundGradient,\n color: t.colors.text,\n boxShadow: t.shadows.modal,\n border: `${t.borders.width}px solid ${t.colors.border}`,\n zIndex: 9999,\n fontFamily: t.typography.fontFamily,\n ...(showAbove\n ? { bottom: '100%', marginBottom: 8, transform: 'translateX(-50%)' }\n : { top: '100%', marginTop: 8, transform: 'translateX(-50%)' }),\n ...customStyles?.modal,\n textAlign: 'left' as const,\n };\n\n // Stagger delay for form elements (desktop only — mobile centering is disrupted by staggered opacity)\n const fadeUpStyle = (index: number): React.CSSProperties =>\n isMobile\n ? {}\n : {\n animation: `gotcha-fade-up ${t.animation.duration.normal} ${t.animation.easing.default} both`,\n animationDelay: `${index * 0.05}s`,\n };\n\n // \"Gotcha!\" success branding\n const isDefaultThankYou = thankYouMessage === 'Gotcha!' || thankYouMessage === 'Thanks for your feedback!';\n\n return (\n <div\n ref={modalRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={isSubmitted ? 'Feedback submitted' : undefined}\n aria-labelledby={isSubmitted ? undefined : 'gotcha-modal-title'}\n data-gotcha\n style={modalStyles}\n className={cn('gotcha-modal', animationClass)}\n >\n {/* Close button */}\n <button\n ref={firstFocusableRef}\n type=\"button\"\n onClick={onClose}\n aria-label=\"Close feedback form\"\n style={{\n position: 'absolute',\n top: isMobile ? 10 : 6,\n right: isMobile ? 10 : 6,\n width: isMobile ? 40 : 36,\n height: isMobile ? 40 : 36,\n border: 'none',\n background: 'transparent',\n outline: 'none',\n cursor: 'pointer',\n zIndex: 10,\n color: t.colors.closeButton,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: t.borders.radius.sm,\n transition: `all ${t.animation.duration.fast} ${t.animation.easing.default}`,\n ...customStyles?.closeButton,\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = t.colors.closeButtonBg;\n e.currentTarget.style.color = t.colors.closeButtonHover;\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent';\n e.currentTarget.style.color = t.colors.closeButton;\n }}\n >\n <svg width={isMobile ? 16 : 14} height={isMobile ? 16 : 14} viewBox=\"0 0 14 14\" fill=\"none\">\n <path\n d=\"M1 1L13 13M1 13L13 1\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n </button>\n\n {/* Title */}\n {!isSubmitted && (\n <h2\n id=\"gotcha-modal-title\"\n style={{\n margin: '0 0 16px 0',\n fontSize: isMobile ? t.typography.fontSize.lg : t.typography.fontSize.md,\n fontWeight: t.typography.fontWeight.semibold,\n paddingRight: isMobile ? 44 : 38,\n letterSpacing: '-0.02em',\n lineHeight: 1.4,\n textAlign: 'left',\n fontFamily: t.typography.fontFamily,\n ...fadeUpStyle(0),\n ...customStyles?.title,\n }}\n >\n {promptText || defaultPrompt}\n </h2>\n )}\n\n {/* Success state — \"Gotcha!\" branding moment */}\n {isSubmitted && (\n <div\n style={{\n textAlign: 'center',\n padding: '28px 0 20px',\n }}\n >\n {/* Animated checkmark circle */}\n <div\n style={{\n width: 52,\n height: 52,\n borderRadius: '50%',\n backgroundColor: t.colors.successSurface,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n margin: '0 auto 16px',\n animation: `gotcha-success-pop 0.4s ${t.animation.easing.spring} both, gotcha-glow-pulse 0.8s ease 0.4s`,\n ...customStyles?.successIcon,\n }}\n >\n <svg\n width=\"26\"\n height=\"26\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n >\n <path\n d=\"M20 6L9 17L4 12\"\n stroke={t.colors.success}\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={{\n strokeDasharray: 24,\n strokeDashoffset: 0,\n animation: `gotcha-check-draw 0.4s ease 0.2s both`,\n }}\n />\n </svg>\n </div>\n\n {/* Primary message */}\n <p\n style={{\n margin: 0,\n fontSize: isDefaultThankYou ? 22 : t.typography.fontSize.md,\n fontWeight: isDefaultThankYou ? t.typography.fontWeight.bold : t.typography.fontWeight.medium,\n color: t.colors.text,\n fontFamily: isDefaultThankYou ? \"'Carter One', cursive\" : t.typography.fontFamily,\n animation: `gotcha-success-text 0.3s ease 0.3s both`,\n ...customStyles?.successMessage,\n }}\n >\n {isDefaultThankYou ? 'Gotcha!' : thankYouMessage}\n </p>\n\n {/* Subtitle (only for default message) */}\n {isDefaultThankYou && (\n <p\n style={{\n margin: '6px 0 0',\n fontSize: t.typography.fontSize.sm,\n fontWeight: t.typography.fontWeight.normal,\n color: t.colors.textSecondary,\n animation: `gotcha-success-text 0.3s ease 0.45s both`,\n }}\n >\n Thanks for your feedback!\n </p>\n )}\n </div>\n )}\n\n {/* Error state */}\n {error && !isSubmitted && (\n <div\n style={{\n padding: '8px 10px',\n marginBottom: 12,\n borderRadius: t.borders.radius.sm,\n backgroundColor: t.colors.errorSurface,\n border: `1px solid ${t.colors.errorBorder}`,\n color: t.colors.error,\n fontSize: t.typography.fontSize.sm,\n lineHeight: 1.4,\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n ...fadeUpStyle(1),\n ...customStyles?.errorMessage,\n }}\n >\n <svg width={14} height={14} viewBox=\"0 0 24 24\" fill=\"none\" style={{ flexShrink: 0 }}>\n <path d=\"M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126zM12 15.75h.007v.008H12v-.008z\" stroke=\"currentColor\" strokeWidth={1.5} strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n {error}\n </div>\n )}\n\n {/* Follow-up question */}\n {phase === 'followUp' && followUpConfig && onFollowUpSubmit && (\n <div style={fadeUpStyle(1)}>\n <FollowUpPrompt\n resolvedTheme={t}\n promptText={followUpConfig.promptText}\n placeholder={followUpConfig.placeholder}\n isLoading={followUpLoading}\n onSubmit={onFollowUpSubmit}\n />\n </div>\n )}\n\n {/* Loading state while checking for existing response */}\n {phase === 'form' && isCheckingExisting && (\n <div style={{\n display: 'flex',\n justifyContent: 'center',\n padding: '24px 0',\n ...fadeUpStyle(1),\n }}>\n <Spinner size={24} color={t.colors.textSecondary} />\n </div>\n )}\n\n {/* Form content based on mode */}\n {phase === 'form' && !isCheckingExisting && (\n <div style={fadeUpStyle(1)}>\n {mode === 'feedback' && (\n <FeedbackMode\n resolvedTheme={t}\n placeholder={placeholder}\n submitText={submitText}\n isLoading={isLoading}\n onSubmit={onSubmit}\n customStyles={customStyles}\n initialValues={existingResponse ? {\n content: existingResponse.content,\n rating: existingResponse.rating,\n } : undefined}\n isEditing={isEditing}\n showText={showText}\n showRating={showRating}\n enableBugFlag={enableBugFlag}\n bugFlagLabel={bugFlagLabel}\n enableScreenshot={enableScreenshot}\n />\n )}\n {mode === 'vote' && (\n <VoteMode\n resolvedTheme={t}\n isLoading={isLoading}\n onSubmit={onSubmit}\n initialVote={existingResponse?.vote || undefined}\n isEditing={isEditing}\n labels={voteLabels}\n />\n )}\n {mode === 'nps' && (\n <NpsMode\n resolvedTheme={t}\n submitText={submitText}\n isLoading={isLoading}\n onSubmit={onSubmit}\n showFollowUp={npsFollowUp}\n followUpPlaceholder={npsFollowUpPlaceholder}\n lowLabel={npsLowLabel}\n highLabel={npsHighLabel}\n customStyles={customStyles}\n initialValues={existingResponse ? {\n rating: existingResponse.rating,\n content: existingResponse.content,\n } : undefined}\n isEditing={isEditing}\n />\n )}\n {mode === 'poll' && options && options.length > 0 && (\n <PollMode\n resolvedTheme={t}\n options={options}\n allowMultiple={allowMultiple}\n isLoading={isLoading}\n onSubmit={onSubmit}\n initialSelected={existingResponse?.pollSelected || undefined}\n isEditing={isEditing}\n />\n )}\n </div>\n )}\n\n {/* Screen reader announcement */}\n <div aria-live=\"polite\" className=\"sr-only\" style={{ position: 'absolute', left: -9999 }}>\n {isSubmitted && 'Thank you! Your feedback has been submitted.'}\n {error && `Error: ${error}`}\n </div>\n </div>\n );\n}\n","import React, { useState, useCallback, useEffect, useRef } from 'react';\nimport { createPortal } from 'react-dom';\nimport {\n ResponseMode,\n GotchaUser,\n Position,\n Size,\n Theme,\n TouchBehavior,\n GotchaStyles,\n GotchaResponse,\n GotchaError,\n} from '../types';\nimport { DEFAULTS } from '../constants';\nimport { useGotchaContext } from './GotchaProvider';\nimport { useSubmit } from '../hooks/useSubmit';\nimport { useHideAfterSubmit } from '../hooks/useHideAfterSubmit';\nimport { useTriggerConditions } from '../hooks/useTriggerConditions';\nimport { GotchaButton } from './GotchaButton';\nimport { GotchaModal } from './GotchaModal';\n\nexport interface GotchaProps {\n /** Unique identifier for this element */\n elementId: string;\n\n // User data\n /** User metadata for segmentation */\n user?: GotchaUser;\n\n // Behavior\n /** Feedback mode */\n mode?: ResponseMode;\n\n // Feedback mode field visibility\n /** Show the text input in feedback mode (default: true) */\n showText?: boolean;\n /** Show the star rating in feedback mode (default: true) */\n showRating?: boolean;\n\n // Vote mode specific\n /** Custom labels for vote buttons (default: Like/Dislike) */\n voteLabels?: { up: string; down: string };\n\n // Poll mode specific\n /** Required if mode is 'poll' (2-6 options) */\n options?: string[];\n /** Allow selecting multiple options */\n allowMultiple?: boolean;\n\n // NPS mode specific\n /** Custom NPS question (default: \"How likely are you to recommend us?\") */\n npsQuestion?: string;\n /** Show follow-up textarea after score selection (default: true) */\n npsFollowUp?: boolean;\n /** Placeholder for NPS follow-up textarea */\n npsFollowUpPlaceholder?: string;\n /** Label for low end of NPS scale (default: \"Not likely\") */\n npsLowLabel?: string;\n /** Label for high end of NPS scale (default: \"Very likely\") */\n npsHighLabel?: string;\n\n // Appearance\n /** Button position relative to parent */\n position?: Position;\n /** Button size */\n size?: Size;\n /** Color theme */\n theme?: Theme;\n /** Custom style overrides */\n customStyles?: GotchaStyles;\n /** Control visibility programmatically */\n visible?: boolean;\n /** Only show when parent is hovered (default: true) */\n showOnHover?: boolean;\n /** Mobile behavior (default: 'always-visible') */\n touchBehavior?: TouchBehavior;\n\n // Content\n /** Custom prompt text */\n promptText?: string;\n /** Input placeholder text */\n placeholder?: string;\n /** Submit button text */\n submitText?: string;\n /** Post-submission message */\n thankYouMessage?: string;\n\n // Bug flagging\n /** Show \"Report an issue\" toggle in feedback form (default: false) */\n enableBugFlag?: boolean;\n /** Custom label for the bug flag toggle (default: \"Report an issue\") */\n bugFlagLabel?: string;\n /** Enable screenshot capture when bug flag is toggled (requires html2canvas peer dep, falls back to native API) */\n enableScreenshot?: boolean;\n\n // Deduplication\n /** When true and user has already responded, show submitted state and allow review/edit instead of new submission */\n onePerUser?: boolean;\n /** When onePerUser is true, allow a new submission after this many days. Has no effect without onePerUser. */\n cooldownDays?: number;\n /** After submission, hide the widget for this many days (client-side, localStorage).\n * Independent of cooldownDays — the widget stays hidden for the full duration even if cooldown expires sooner. */\n hideAfterSubmitDays?: number;\n\n // Trigger conditions\n /** Delay showing widget by N seconds after page load */\n showAfterSeconds?: number;\n /** Show widget after user scrolls past this percentage (0-100) */\n showAfterScrollPercent?: number;\n /** Show widget after user has visited N times (uses localStorage) */\n showAfterVisits?: number;\n\n // Follow-up\n /** Show a follow-up question after low rating or negative vote */\n followUp?: {\n /** Rating threshold (inclusive) — e.g., 2 means ratings 1-2 trigger follow-up */\n ratingThreshold?: number;\n /** Also trigger on negative vote */\n onNegativeVote?: boolean;\n /** The prompt text shown */\n promptText: string;\n /** Placeholder for the follow-up textarea */\n placeholder?: string;\n };\n\n // Animation\n /** Enable entrance animations on the button and modal (default: true) */\n animated?: boolean;\n\n // Callbacks\n /** Called after successful submission */\n onSubmit?: (response: GotchaResponse) => void;\n /** Called when modal opens */\n onOpen?: () => void;\n /** Called when modal closes */\n onClose?: () => void;\n /** Called on error */\n onError?: (error: GotchaError) => void;\n}\n\nexport function Gotcha({\n elementId,\n user,\n mode = 'feedback',\n showText = true,\n showRating = true,\n voteLabels,\n options,\n allowMultiple = false,\n npsQuestion,\n npsFollowUp = true,\n npsFollowUpPlaceholder,\n npsLowLabel,\n npsHighLabel,\n enableBugFlag = false,\n bugFlagLabel,\n enableScreenshot = false,\n onePerUser = false,\n cooldownDays,\n hideAfterSubmitDays,\n showAfterSeconds,\n showAfterScrollPercent,\n showAfterVisits,\n followUp,\n animated = true,\n position = DEFAULTS.POSITION,\n size = DEFAULTS.SIZE,\n theme = DEFAULTS.THEME,\n customStyles,\n visible = true,\n showOnHover = DEFAULTS.SHOW_ON_HOVER,\n touchBehavior = DEFAULTS.TOUCH_BEHAVIOR,\n promptText,\n placeholder,\n submitText = DEFAULTS.SUBMIT_TEXT,\n thankYouMessage = DEFAULTS.THANK_YOU_MESSAGE,\n onSubmit,\n onOpen,\n onClose,\n onError,\n}: GotchaProps) {\n const { disabled, activeModalId, openModal, closeModal, defaultUser, client } = useGotchaContext();\n\n const { conditionsMet } = useTriggerConditions({\n elementId,\n showAfterSeconds,\n showAfterScrollPercent,\n showAfterVisits,\n });\n\n const { isHidden, markHidden } = useHideAfterSubmit({\n elementId,\n userId: user?.id || defaultUser?.id,\n hideAfterSubmitDays,\n });\n const [phase, setPhase] = useState<'form' | 'followUp' | 'success'>('form');\n const [lastResponseId, setLastResponseId] = useState<string | null>(null);\n const [followUpLoading, setFollowUpLoading] = useState(false);\n const [queuedCount, setQueuedCount] = useState(0);\n const [isParentHovered, setIsParentHovered] = useState(false);\n const [anchorRect, setAnchorRect] = useState<DOMRect | null>(null);\n const [isMobile, setIsMobile] = useState(false);\n const [hasMounted, setHasMounted] = useState(false);\n const containerRef = useRef<HTMLDivElement>(null);\n const autoCloseTimerRef = useRef<ReturnType<typeof setTimeout>>();\n const lastSubmitDataRef = useRef<{ rating?: number; vote?: 'up' | 'down' } | null>(null);\n\n // SSR-safe mount detection\n useEffect(() => {\n setHasMounted(true);\n setIsMobile(window.innerWidth < 640);\n return () => {\n clearTimeout(autoCloseTimerRef.current);\n };\n }, []);\n\n // Track offline queue length\n useEffect(() => {\n setQueuedCount(client.getQueueLength());\n const handleOnline = () => {\n // Queue will be flushed by provider; update count after a delay\n setTimeout(() => setQueuedCount(client.getQueueLength()), 2000);\n };\n window.addEventListener('online', handleOnline);\n return () => window.removeEventListener('online', handleOnline);\n }, [client]);\n\n const isOpen = activeModalId === elementId;\n\n // Reset phase when modal is closed externally (e.g., another modal opens)\n useEffect(() => {\n if (!isOpen) {\n setPhase('form');\n clearTimeout(autoCloseTimerRef.current);\n }\n }, [isOpen]);\n\n // Scroll lock on mobile when modal is open\n useEffect(() => {\n if (!isOpen || !isMobile) return;\n const prev = document.body.style.overflow;\n document.body.style.overflow = 'hidden';\n return () => { document.body.style.overflow = prev; };\n }, [isOpen, isMobile]);\n\n // Attach hover listeners to the parent element\n useEffect(() => {\n if (!showOnHover) return;\n\n const container = containerRef.current;\n if (!container) return;\n\n const parent = container.parentElement;\n if (!parent) return;\n\n const handleMouseEnter = () => setIsParentHovered(true);\n const handleMouseLeave = () => setIsParentHovered(false);\n\n parent.addEventListener('mouseenter', handleMouseEnter);\n parent.addEventListener('mouseleave', handleMouseLeave);\n\n return () => {\n parent.removeEventListener('mouseenter', handleMouseEnter);\n parent.removeEventListener('mouseleave', handleMouseLeave);\n };\n }, [showOnHover]);\n\n const { submit, isLoading, isCheckingExisting, error, existingResponse, isEditing } = useSubmit({\n elementId,\n mode,\n pollOptions: options,\n user,\n onePerUser,\n cooldownDays,\n onSuccess: (response) => {\n setLastResponseId(response.id);\n if (hideAfterSubmitDays) markHidden();\n onSubmit?.(response);\n\n // Check if follow-up should trigger\n const shouldFollowUp = followUp && lastSubmitDataRef.current && (\n (followUp.ratingThreshold != null && lastSubmitDataRef.current.rating != null &&\n lastSubmitDataRef.current.rating <= followUp.ratingThreshold) ||\n (followUp.onNegativeVote && lastSubmitDataRef.current.vote === 'down')\n );\n\n if (shouldFollowUp && mode !== 'poll') {\n setPhase('followUp');\n } else {\n setPhase('success');\n autoCloseTimerRef.current = setTimeout(() => {\n closeModal();\n setPhase('form');\n }, 3000);\n }\n },\n onError: (err) => {\n console.warn('[Gotcha] Submission failed:', err instanceof Error ? err.message : err);\n onError?.(err as unknown as GotchaError);\n },\n });\n\n const handleOpen = useCallback(() => {\n if (containerRef.current) {\n setAnchorRect(containerRef.current.getBoundingClientRect());\n }\n openModal(elementId);\n onOpen?.();\n }, [elementId, openModal, onOpen]);\n\n const handleClose = useCallback(() => {\n clearTimeout(autoCloseTimerRef.current);\n closeModal();\n setPhase('form');\n onClose?.();\n }, [closeModal, onClose]);\n\n // Wrap submit to capture rating/vote for follow-up check\n const handleSubmit = useCallback(\n (data: { content?: string; rating?: number; vote?: 'up' | 'down'; pollSelected?: string[]; isBug?: boolean }) => {\n lastSubmitDataRef.current = { rating: data.rating, vote: data.vote };\n submit(data);\n },\n [submit]\n );\n\n // Handle follow-up submission\n const handleFollowUpSubmit = useCallback(\n async (content: string) => {\n if (!lastResponseId) return;\n setFollowUpLoading(true);\n try {\n await client.updateResponse(lastResponseId, { content });\n } catch (err) {\n // If follow-up fails, still show success — initial response is already saved\n console.warn('[Gotcha] Follow-up submission failed:', err instanceof Error ? err.message : err);\n } finally {\n setFollowUpLoading(false);\n setPhase('success');\n autoCloseTimerRef.current = setTimeout(() => {\n closeModal();\n setPhase('form');\n }, 3000);\n }\n },\n [lastResponseId, closeModal, client]\n );\n\n const effectiveSubmitText = (onePerUser && isEditing) ? 'Update' : submitText;\n\n if (disabled || !visible || isHidden || !conditionsMet) return null;\n\n const positionStyles: Record<Position, React.CSSProperties> = {\n 'top-right': { position: 'absolute', top: 0, right: 0, transform: 'translate(50%, -50%)' },\n 'top-left': { position: 'absolute', top: 0, left: 0, transform: 'translate(-50%, -50%)' },\n 'bottom-right': { position: 'absolute', bottom: 0, right: 0, transform: 'translate(50%, 50%)' },\n 'bottom-left': { position: 'absolute', bottom: 0, left: 0, transform: 'translate(-50%, 50%)' },\n 'inline': { position: 'relative', display: 'inline-flex' },\n };\n\n const modalProps = {\n mode,\n theme,\n customStyles,\n promptText,\n placeholder,\n submitText: effectiveSubmitText,\n thankYouMessage,\n isLoading,\n isCheckingExisting: onePerUser && isCheckingExisting,\n isSubmitted: phase === 'success',\n phase,\n followUpConfig: followUp,\n followUpLoading,\n onFollowUpSubmit: handleFollowUpSubmit,\n error,\n existingResponse: onePerUser ? existingResponse : null,\n isEditing: onePerUser && isEditing,\n showText,\n showRating,\n voteLabels,\n options,\n allowMultiple,\n npsQuestion,\n npsFollowUp,\n npsFollowUpPlaceholder,\n npsLowLabel,\n npsHighLabel,\n enableBugFlag,\n bugFlagLabel,\n enableScreenshot,\n onSubmit: handleSubmit,\n onClose: handleClose,\n anchorRect: anchorRect || undefined,\n useFixedPosition: !isMobile,\n };\n\n return (\n <div\n ref={containerRef}\n style={{\n ...positionStyles[position],\n zIndex: isOpen ? 10000 : 'auto',\n }}\n className=\"gotcha-container\"\n data-gotcha-element={elementId}\n >\n <GotchaButton\n size={size}\n theme={theme}\n customStyles={customStyles}\n showOnHover={showOnHover}\n touchBehavior={touchBehavior}\n onClick={handleOpen}\n isOpen={isOpen}\n isParentHovered={isParentHovered}\n animated={animated}\n queuedCount={queuedCount}\n />\n\n {/* Desktop: portal without backdrop, anchored via fixed positioning */}\n {isOpen && !isMobile && hasMounted && createPortal(\n <GotchaModal {...modalProps} />,\n document.body\n )}\n\n {/* Mobile: frosted glass backdrop portal */}\n {isOpen && isMobile && hasMounted && createPortal(\n <div\n role=\"presentation\"\n style={{\n position: 'fixed',\n inset: 0,\n zIndex: 99999,\n backgroundColor: 'rgba(0,0,0,0.4)',\n backdropFilter: 'blur(8px)',\n WebkitBackdropFilter: 'blur(8px)',\n }}\n className=\"gotcha-overlay-enter\"\n onClick={handleClose}\n >\n <div onClick={(e) => e.stopPropagation()}>\n <GotchaModal {...modalProps} />\n </div>\n </div>,\n document.body\n )}\n </div>\n );\n}\n","import { useState, useEffect } from 'react';\nimport { useGotchaContext } from '../components/GotchaProvider';\nimport { ScoreData } from '../types';\n\ninterface UseScoreOptions {\n elementId: string;\n refreshInterval?: number;\n}\n\ninterface UseScoreResult {\n score: ScoreData | null;\n isLoading: boolean;\n error: string | null;\n}\n\nexport function useScore({ elementId, refreshInterval }: UseScoreOptions): UseScoreResult {\n const { client } = useGotchaContext();\n const [score, setScore] = useState<ScoreData | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n\n const fetchScore = async () => {\n try {\n const data = await client.getScore(elementId);\n if (!cancelled) {\n setScore(data);\n setError(null);\n }\n } catch (err) {\n if (!cancelled) {\n setError(err instanceof Error ? err.message : 'Failed to load score');\n }\n } finally {\n if (!cancelled) {\n setIsLoading(false);\n }\n }\n };\n\n fetchScore();\n\n let intervalId: ReturnType<typeof setInterval> | undefined;\n if (refreshInterval && refreshInterval > 0) {\n intervalId = setInterval(fetchScore, refreshInterval);\n }\n\n return () => {\n cancelled = true;\n if (intervalId) clearInterval(intervalId);\n };\n }, [client, elementId, refreshInterval]);\n\n return { score, isLoading, error };\n}\n","import React, { useState, useEffect, useMemo } from 'react';\nimport { Theme, Size } from '../types';\nimport { useScore } from '../hooks/useScore';\nimport { resolveTheme } from '../theme/resolveTheme';\nimport { useGotchaContext } from './GotchaProvider';\n\nexport type ScoreVariant = 'stars' | 'number' | 'compact' | 'votes';\n\nexport interface GotchaScoreProps {\n elementId: string;\n variant?: ScoreVariant;\n showCount?: boolean;\n size?: Size;\n theme?: Theme;\n refreshInterval?: number;\n style?: React.CSSProperties;\n}\n\nconst SIZE_MAP: Record<Size, {\n fontSize: number;\n ratingFontSize: number;\n starSize: number;\n gap: number;\n pillPx: number;\n pillPy: number;\n barHeight: number;\n iconSize: number;\n}> = {\n sm: { fontSize: 11, ratingFontSize: 13, starSize: 13, gap: 5, pillPx: 8, pillPy: 4, barHeight: 3, iconSize: 12 },\n md: { fontSize: 12.5, ratingFontSize: 15, starSize: 15, gap: 6, pillPx: 10, pillPy: 5, barHeight: 4, iconSize: 14 },\n lg: { fontSize: 14, ratingFontSize: 18, starSize: 18, gap: 8, pillPx: 12, pillPy: 6, barHeight: 5, iconSize: 16 },\n};\n\n/** Crisp, rounded 5-point star SVG with partial fill via clipPath */\nfunction Stars({ rating, size, filledColor, emptyColor }: {\n rating: number;\n size: number;\n filledColor: string;\n emptyColor: string;\n}) {\n const clipId = `gotcha-star-clip-${Math.random().toString(36).slice(2, 8)}`;\n const stars = [];\n for (let i = 1; i <= 5; i++) {\n const fill = Math.min(1, Math.max(0, rating - (i - 1)));\n const id = `${clipId}-${i}`;\n stars.push(\n <svg key={i} width={size} height={size} viewBox=\"0 0 24 24\" style={{ display: 'block' }}>\n <defs>\n <clipPath id={id}>\n <rect x=\"0\" y=\"0\" width={24 * fill} height=\"24\" />\n </clipPath>\n </defs>\n <path\n d=\"M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z\"\n fill={emptyColor}\n />\n <path\n d=\"M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z\"\n fill={filledColor}\n clipPath={`url(#${id})`}\n />\n </svg>\n );\n }\n return <span style={{ display: 'inline-flex', gap: Math.max(1, size * 0.08), alignItems: 'center' }}>{stars}</span>;\n}\n\n/** Compact positive rate bar */\nfunction PositiveBar({ rate, height, filledColor, trackColor }: {\n rate: number;\n height: number;\n filledColor: string;\n trackColor: string;\n}) {\n return (\n <span style={{\n display: 'inline-block',\n width: 48,\n height,\n borderRadius: height,\n backgroundColor: trackColor,\n overflow: 'hidden',\n verticalAlign: 'middle',\n }}>\n <span style={{\n display: 'block',\n width: `${rate}%`,\n height: '100%',\n borderRadius: height,\n background: filledColor,\n transition: 'width 0.6s cubic-bezier(0.4, 0, 0.2, 1)',\n }} />\n </span>\n );\n}\n\n/** Thumbs up SVG icon */\nfunction ThumbIcon({ size, color }: { size: number; color: string }) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill={color} style={{ display: 'block' }}>\n <path d=\"M2 20h2c.55 0 1-.45 1-1v-9c0-.55-.45-1-1-1H2v11zm19.83-7.12c.11-.25.17-.52.17-.8V11c0-1.1-.9-2-2-2h-5.5l.92-4.65c.05-.22.02-.46-.08-.66a4.8 4.8 0 00-.88-1.12L14 2 7.59 8.41C7.21 8.79 7 9.3 7 9.83v7.84C7 18.95 8.05 20 9.34 20h8.11c.7 0 1.36-.37 1.72-.97l2.66-6.15z\" />\n </svg>\n );\n}\n\nexport function GotchaScore({\n elementId,\n variant = 'stars',\n showCount = true,\n size = 'md',\n theme = 'auto',\n refreshInterval,\n style,\n}: GotchaScoreProps) {\n const { score, isLoading } = useScore({ elementId, refreshInterval });\n const [systemTheme, setSystemTheme] = useState<'light' | 'dark'>('light');\n\n useEffect(() => {\n if (typeof window === 'undefined') return;\n const mq = window.matchMedia('(prefers-color-scheme: dark)');\n setSystemTheme(mq.matches ? 'dark' : 'light');\n const handler = (e: MediaQueryListEvent) => setSystemTheme(e.matches ? 'dark' : 'light');\n mq.addEventListener('change', handler);\n return () => mq.removeEventListener('change', handler);\n }, []);\n\n const { themeConfig } = useGotchaContext();\n const t = useMemo(() => resolveTheme(theme, systemTheme, themeConfig), [theme, systemTheme, themeConfig]);\n\n if (isLoading || !score) return null;\n const s = SIZE_MAP[size];\n\n // Color tokens from resolved theme\n const ratingColor = t.colors.text;\n const mutedColor = t.colors.textDisabled;\n const starFilled = t.colors.starFilled;\n const starEmpty = t.colors.starEmpty;\n const positiveColor = t.colors.voteUp;\n const positiveTrack = t.colors.starEmpty;\n\n const baseStyle: React.CSSProperties = {\n display: 'inline-flex',\n alignItems: 'center',\n gap: s.gap,\n fontFamily: t.typography.fontFamily,\n lineHeight: 1,\n letterSpacing: '-0.01em',\n WebkitFontSmoothing: 'antialiased',\n ...style,\n };\n\n const countText = (n: number, singular: string) => {\n const label = n === 1 ? singular : `${singular}s`;\n return `${n.toLocaleString()} ${label}`;\n };\n\n // ── Votes variant ──────────────────────────────────────────────\n if (variant === 'votes') {\n const { voteCount, positiveRate } = score;\n const total = voteCount.up + voteCount.down;\n if (total === 0) return null;\n\n return (\n <span style={baseStyle}>\n <ThumbIcon size={s.iconSize} color={positiveColor} />\n <span style={{ fontSize: s.ratingFontSize, fontWeight: 600, color: positiveColor, fontVariantNumeric: 'tabular-nums' }}>\n {positiveRate}%\n </span>\n <PositiveBar rate={positiveRate ?? 0} height={s.barHeight} filledColor={positiveColor} trackColor={positiveTrack} />\n {showCount && (\n <span style={{ fontSize: s.fontSize, color: mutedColor, fontWeight: 400 }}>\n {countText(total, 'vote')}\n </span>\n )}\n </span>\n );\n }\n\n // ── Rating-based variants ──────────────────────────────────────\n const { averageRating, totalResponses } = score;\n if (averageRating === null || totalResponses === 0) return null;\n\n const displayRating = averageRating.toFixed(1);\n\n // ── Compact ────────────────────────────────────────────────────\n if (variant === 'compact') {\n return (\n <span style={baseStyle}>\n <svg width={s.starSize} height={s.starSize} viewBox=\"0 0 24 24\" style={{ display: 'block', flexShrink: 0 }}>\n <path\n d=\"M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z\"\n fill={starFilled}\n />\n </svg>\n <span style={{ fontSize: s.ratingFontSize, fontWeight: 700, color: ratingColor, fontVariantNumeric: 'tabular-nums' }}>\n {displayRating}\n </span>\n {showCount && (\n <span style={{ fontSize: s.fontSize, color: mutedColor, fontWeight: 400 }}>\n ({totalResponses.toLocaleString()})\n </span>\n )}\n </span>\n );\n }\n\n // ── Number ─────────────────────────────────────────────────────\n if (variant === 'number') {\n return (\n <span style={baseStyle}>\n <span style={{ fontSize: s.ratingFontSize, fontWeight: 700, color: ratingColor, fontVariantNumeric: 'tabular-nums' }}>\n {displayRating}\n </span>\n <span style={{ fontSize: s.fontSize, color: mutedColor, fontWeight: 400 }}>/ 5</span>\n {showCount && (\n <span style={{\n fontSize: s.fontSize,\n color: mutedColor,\n fontWeight: 400,\n marginLeft: 2,\n }}>\n ({countText(totalResponses, 'response')})\n </span>\n )}\n </span>\n );\n }\n\n // ── Stars (default) ────────────────────────────────────────────\n return (\n <span style={baseStyle}>\n <Stars rating={averageRating} size={s.starSize} filledColor={starFilled} emptyColor={starEmpty} />\n <span style={{ fontSize: s.ratingFontSize, fontWeight: 700, color: ratingColor, fontVariantNumeric: 'tabular-nums' }}>\n {displayRating}\n </span>\n {showCount && (\n <span style={{ fontSize: s.fontSize, color: mutedColor, fontWeight: 400 }}>\n ({countText(totalResponses, 'response')})\n </span>\n )}\n </span>\n );\n}\n","import { useGotchaContext } from '../components/GotchaProvider';\n\n/**\n * Hook to access Gotcha context\n * Must be used within a GotchaProvider\n */\nexport function useGotcha() {\n const { client, disabled, defaultUser, debug, openModal, closeModal, activeModalId } = useGotchaContext();\n\n return {\n /** The API client for manual submissions */\n client,\n /** Whether Gotcha is globally disabled */\n disabled,\n /** Default user metadata */\n defaultUser,\n /** Whether debug mode is enabled */\n debug,\n /** Submit feedback programmatically */\n submitFeedback: client.submitResponse.bind(client),\n /** Open a specific Gotcha modal by elementId */\n openModal,\n /** Close the currently open modal */\n closeModal,\n /** The currently open modal's elementId, or null */\n activeModalId,\n };\n}\n","import { useCallback } from 'react';\nimport { useGotchaContext } from '../components/GotchaProvider';\n\n/**\n * Hook to programmatically open/close a specific Gotcha widget.\n * The corresponding <Gotcha elementId=\"...\"> must be mounted for the modal to render.\n */\nexport function useGotchaTrigger(elementId: string) {\n const { activeModalId, openModal, closeModal } = useGotchaContext();\n\n const open = useCallback(() => openModal(elementId), [openModal, elementId]);\n const close = useCallback(() => closeModal(), [closeModal]);\n\n return {\n open,\n close,\n isOpen: activeModalId === elementId,\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/constants.ts","../src/utils/localStorage.ts","../src/utils/generateId.ts","../src/utils/anonymous.ts","../src/utils/errorBuffer.ts","../src/utils/contextCollector.ts","../src/utils/offlineQueue.ts","../src/api/client.ts","../src/utils/deepMerge.ts","../src/theme/tokens.ts","../src/theme/resolveTheme.ts","../src/theme/styles.ts","../src/components/GotchaProvider.tsx","../src/hooks/useSubmit.ts","../src/hooks/useHideAfterSubmit.ts","../src/hooks/useTriggerConditions.ts","../src/utils/cn.ts","../src/utils/device.ts","../src/components/GotchaButton.tsx","../src/components/Spinner.tsx","../src/components/ScreenshotPreview.tsx","../src/components/modes/FeedbackMode.tsx","../src/components/modes/VoteMode.tsx","../src/components/modes/PollMode.tsx","../src/components/modes/NpsMode.tsx","../src/components/FollowUpPrompt.tsx","../src/components/GotchaModal.tsx","../src/components/Gotcha.tsx","../src/hooks/useScore.ts","../src/components/GotchaScore.tsx","../src/hooks/useGotcha.ts","../src/hooks/useGotchaTrigger.ts"],"names":["API_BASE_URL","STORAGE_KEYS","DEFAULTS","RETRY_CONFIG","safeGetItem","key","safeSetItem","value","generateId","c","getAnonymousId","stored","id","buffer","listening","pushError","message","source","entry","handleError","event","handleRejection","startErrorCapture","stopErrorCapture","getRecentErrors","collectContext","MAX_QUEUE_SIZE","MAX_AGE_MS","readQueue","raw","items","now","item","writeQueue","enqueue","payload","type","dequeue","getQueuedItems","getQueueLength","incrementRetries","DEFAULT_RETRY_CONFIG","fetchWithRetry","url","options","config","debug","lastError","attempt","response","error","delay","resolve","createApiClient","apiKey","baseUrl","flushing","headers","request","method","endpoint","body","idempotencyKey","data","user","fullPayload","err","elementId","userId","responseId","updatePayload","UNSAFE_KEYS","deepMerge","base","override","result","val","NPS_COLORS","LIGHT_TOKENS","DARK_TOKENS","createTheme","overrides","resolveTheme","theme","systemTheme","providerConfig","resolved","STYLE_ID","FONT_ID","FONT_FACE_ID","CARTER_ONE_FONT_FACE","injectFontFace","style","sanitizeCSS","generateStyleTag","easing","duration","fontFamily","textDisabled","borderColor","injectStyles","preconnect","preconnectStatic","link","styleEl","GotchaContext","createContext","EMPTY_USER","GotchaProvider","children","disabled","defaultUser","themeConfig","activeModalId","setActiveModalId","useState","client","useMemo","stableDefaultUser","useEffect","handleOnline","openModal","useCallback","closeModal","jsx","useGotchaContext","context","useContext","isResponseExpired","createdAt","cooldownDays","createdTime","ageMs","cooldownMs","useSubmit","isLoading","setIsLoading","isCheckingExisting","setIsCheckingExisting","setError","existingResponse","setExistingResponse","cancelled","existing","errorMessage","getStorageKey","checkIsHidden","resolvedUserId","hideAfterSubmitDays","hiddenUntilStr","useHideAfterSubmit","isHidden","setIsHidden","markHidden","hiddenUntil","getVisitKey","useTriggerConditions","showAfterSeconds","showAfterScrollPercent","showAfterVisits","hasConditions","timeMet","setTimeMet","scrollMet","setScrollMet","visitsMet","next","start","targetMs","check","timer","checkScroll","scrollHeight","viewportHeight","cn","classes","isTouchDevice","getResponsiveSize","size","isTouch","sizes","getInitialSystemTheme","GotchaButton","customStyles","showOnHover","touchBehavior","onClick","isOpen","isParentHovered","animated","queuedCount","setIsTouch","tapRevealed","setTapRevealed","setSystemTheme","isHovered","setIsHovered","isPressed","setIsPressed","hasPopped","setHasPopped","darkQuery","handler","e","shouldShow","handleClick","buttonSize","t","getTransform","baseStyles","jsxs","GotchaIcon","mounted","setMounted","Spinner","color","ScreenshotPreview","src","onRemove","FeedbackMode","placeholder","submitText","onSubmit","initialValues","isEditing","showText","showRating","enableBugFlag","bugFlagLabel","enableScreenshot","content","setContent","rating","setRating","isBug","setIsBug","screenshot","setScreenshot","capturingScreenshot","setCapturingScreenshot","canSubmit","handleScreenshotCapture","captureScreenshot","handleSubmit","inputStyles","buttonStyles","StarRating","onChange","large","hovered","setHovered","pulsing","setPulsing","pulseTimerRef","useRef","starSize","buttonPadding","star","isFilled","VoteMode","initialVote","labels","activeVote","setActiveVote","previousVote","setPreviousVote","handleVote","vote","getButtonStyles","voteType","isSelected","surface","border","iconSize","Fragment","ThumbsUpIcon","ThumbsDownIcon","PollMode","allowMultiple","initialSelected","selected","setSelected","handleToggle","option","prev","o","getOptionStyles","index","NpsMode","showFollowUp","followUpPlaceholder","lowLabel","highLabel","score","setScore","hoveredScore","setHoveredScore","npsColors","_","i","FollowUpPrompt","promptText","GotchaModal","mode","thankYouMessage","isSubmitted","phase","followUpConfig","followUpLoading","onFollowUpSubmit","voteLabels","npsQuestion","npsFollowUp","npsFollowUpPlaceholder","npsLowLabel","npsHighLabel","onClose","anchorRect","useFixedPosition","modalRef","firstFocusableRef","onCloseRef","isMobile","setIsMobile","showAbove","modal","handleKeyDown","focusableElements","firstElement","lastElement","defaultPrompt","modalPadding","modalWidth","animationClass","modalStyles","fadeUpStyle","isDefaultThankYou","Gotcha","onePerUser","followUp","position","visible","onOpen","onError","conditionsMet","setPhase","lastResponseId","setLastResponseId","setFollowUpLoading","setQueuedCount","setIsParentHovered","setAnchorRect","hasMounted","setHasMounted","containerRef","autoCloseTimerRef","lastSubmitDataRef","container","parent","handleMouseEnter","handleMouseLeave","submit","handleOpen","button","handleClose","handleFollowUpSubmit","effectiveSubmitText","positionStyles","modalProps","createPortal","useScore","refreshInterval","fetchScore","intervalId","SIZE_MAP","Stars","filledColor","emptyColor","clipId","stars","fill","PositiveBar","rate","height","trackColor","ThumbIcon","GotchaScore","variant","showCount","mq","s","ratingColor","mutedColor","starFilled","starEmpty","positiveColor","positiveTrack","baseStyle","countText","n","singular","label","voteCount","positiveRate","total","averageRating","totalResponses","displayRating","useGotcha","useGotchaTrigger","open","close"],"mappings":"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","file":"index.mjs","sourcesContent":["// API URL\nexport const API_BASE_URL = 'https://gotcha.cx/api/v1';\n\n// Error codes\nexport const ERROR_CODES = {\n INVALID_API_KEY: 'INVALID_API_KEY',\n ORIGIN_NOT_ALLOWED: 'ORIGIN_NOT_ALLOWED',\n RATE_LIMITED: 'RATE_LIMITED',\n QUOTA_EXCEEDED: 'QUOTA_EXCEEDED',\n INVALID_REQUEST: 'INVALID_REQUEST',\n USER_NOT_FOUND: 'USER_NOT_FOUND',\n INTERNAL_ERROR: 'INTERNAL_ERROR',\n} as const;\n\n// Local storage keys\nexport const STORAGE_KEYS = {\n ANONYMOUS_ID: 'gotcha_anonymous_id',\n OFFLINE_QUEUE: 'gotcha_offline_queue',\n HIDDEN_UNTIL: 'gotcha_hidden',\n VISIT_COUNT: 'gotcha_visits',\n} as const;\n\n// Default values\nexport const DEFAULTS = {\n POSITION: 'top-right' as const,\n SIZE: 'md' as const,\n THEME: 'light' as const,\n SHOW_ON_HOVER: true,\n TOUCH_BEHAVIOR: 'always-visible' as const,\n SUBMIT_TEXT: 'Submit',\n THANK_YOU_MESSAGE: 'Gotcha!',\n} as const;\n\n// Retry config\nexport const RETRY_CONFIG = {\n MAX_RETRIES: 2,\n BASE_DELAY_MS: 500,\n MAX_DELAY_MS: 5000,\n} as const;\n","export function safeGetItem(key: string): string | null {\n if (typeof window === 'undefined') return null;\n try {\n return localStorage.getItem(key);\n } catch {\n return null;\n }\n}\n\nexport function safeSetItem(key: string, value: string): void {\n if (typeof window === 'undefined') return;\n try {\n localStorage.setItem(key, value);\n } catch {\n // localStorage unavailable (incognito Safari, sandboxed iframes)\n }\n}\n\nexport function safeRemoveItem(key: string): void {\n if (typeof window === 'undefined') return;\n try {\n localStorage.removeItem(key);\n } catch {\n // silently fail\n }\n}\n","/**\n * Generate a UUID v4. Falls back to Math.random for insecure contexts\n * (HTTP, some WebViews) where crypto.randomUUID is unavailable.\n */\nexport function generateId(): string {\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\n return crypto.randomUUID();\n }\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n return (c === 'x' ? r : (r & 0x3) | 0x8).toString(16);\n });\n}\n","import { STORAGE_KEYS } from '../constants';\nimport { safeGetItem, safeSetItem, safeRemoveItem } from './localStorage';\nimport { generateId } from './generateId';\n\n/**\n * Get or create an anonymous user ID\n * Stored in localStorage for consistency across sessions\n */\nexport function getAnonymousId(): string {\n const stored = safeGetItem(STORAGE_KEYS.ANONYMOUS_ID);\n if (stored) return stored;\n\n const id = `anon_${generateId()}`;\n safeSetItem(STORAGE_KEYS.ANONYMOUS_ID, id);\n return id;\n}\n\n/**\n * Clear the anonymous ID (useful for testing)\n */\nexport function clearAnonymousId(): void {\n safeRemoveItem(STORAGE_KEYS.ANONYMOUS_ID);\n}\n","const MAX_ERRORS = 10;\nconst MAX_MESSAGE_LENGTH = 200;\n\ninterface CapturedError {\n message: string;\n source?: string;\n timestamp: number;\n}\n\nlet buffer: CapturedError[] = [];\nlet listening = false;\n\nfunction pushError(message: string, source?: string) {\n const entry: CapturedError = {\n message: message.slice(0, MAX_MESSAGE_LENGTH),\n source: source?.slice(0, MAX_MESSAGE_LENGTH),\n timestamp: Date.now(),\n };\n buffer.push(entry);\n if (buffer.length > MAX_ERRORS) {\n buffer.shift();\n }\n}\n\nfunction handleError(event: ErrorEvent) {\n pushError(event.message, event.filename);\n}\n\nfunction handleRejection(event: PromiseRejectionEvent) {\n const message = event.reason instanceof Error\n ? event.reason.message\n : String(event.reason);\n pushError(message);\n}\n\nexport function startErrorCapture(): void {\n if (typeof window === 'undefined' || listening) return;\n window.addEventListener('error', handleError);\n window.addEventListener('unhandledrejection', handleRejection);\n listening = true;\n}\n\nexport function stopErrorCapture(): void {\n if (typeof window === 'undefined' || !listening) return;\n window.removeEventListener('error', handleError);\n window.removeEventListener('unhandledrejection', handleRejection);\n listening = false;\n}\n\nexport function getRecentErrors(): CapturedError[] {\n return [...buffer].reverse();\n}\n","import { SubmissionContext } from '../types';\nimport { getRecentErrors } from './errorBuffer';\n\nexport function collectContext(): SubmissionContext {\n if (typeof window === 'undefined') return {};\n\n return {\n url: window.location.origin + window.location.pathname,\n userAgent: navigator.userAgent,\n viewport: { width: window.innerWidth, height: window.innerHeight },\n language: navigator.language,\n timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n screenResolution: { width: screen.width, height: screen.height },\n recentErrors: getRecentErrors(),\n };\n}\n","import { STORAGE_KEYS } from '../constants';\nimport { safeGetItem, safeSetItem } from './localStorage';\nimport { generateId } from './generateId';\n\nconst MAX_QUEUE_SIZE = 50;\nconst MAX_AGE_MS = 7 * 24 * 60 * 60 * 1000; // 7 days\n\nexport interface OfflineQueueItem {\n id: string;\n payload: Record<string, unknown>;\n type: 'create' | 'update';\n queuedAt: number;\n retries: number;\n}\n\nfunction readQueue(): OfflineQueueItem[] {\n const raw = safeGetItem(STORAGE_KEYS.OFFLINE_QUEUE);\n if (!raw) return [];\n try {\n const items = JSON.parse(raw) as OfflineQueueItem[];\n // Drop items older than 7 days\n const now = Date.now();\n return items.filter(item => now - item.queuedAt < MAX_AGE_MS);\n } catch {\n return [];\n }\n}\n\nfunction writeQueue(items: OfflineQueueItem[]): void {\n safeSetItem(STORAGE_KEYS.OFFLINE_QUEUE, JSON.stringify(items));\n}\n\nexport function enqueue(payload: Record<string, unknown>, type: 'create' | 'update' = 'create'): void {\n const items = readQueue();\n if (items.length >= MAX_QUEUE_SIZE) return;\n items.push({\n id: generateId(),\n payload,\n type,\n queuedAt: Date.now(),\n retries: 0,\n });\n writeQueue(items);\n}\n\nexport function dequeue(id: string): void {\n const items = readQueue().filter(item => item.id !== id);\n writeQueue(items);\n}\n\nexport function getQueuedItems(): OfflineQueueItem[] {\n return readQueue();\n}\n\nexport function getQueueLength(): number {\n return readQueue().length;\n}\n\nexport function incrementRetries(id: string): void {\n const items = readQueue().map(item =>\n item.id === id ? { ...item, retries: item.retries + 1 } : item\n );\n // Drop items with too many retries\n writeQueue(items.filter(item => item.retries <= 5));\n}\n","import { API_BASE_URL, RETRY_CONFIG } from '../constants';\nimport { SubmitResponsePayload, GotchaResponse, GotchaError, ExistingResponse, VoteType, ScoreData } from '../types';\nimport { getAnonymousId } from '../utils/anonymous';\nimport { generateId } from '../utils/generateId';\nimport { collectContext } from '../utils/contextCollector';\nimport { enqueue, getQueuedItems, dequeue, incrementRetries, getQueueLength } from '../utils/offlineQueue';\n\ninterface ApiClientConfig {\n apiKey: string;\n baseUrl?: string;\n debug?: boolean;\n}\n\ninterface RetryConfig {\n maxRetries: number;\n baseDelayMs: number;\n maxDelayMs: number;\n}\n\nconst DEFAULT_RETRY_CONFIG: RetryConfig = {\n maxRetries: RETRY_CONFIG.MAX_RETRIES,\n baseDelayMs: RETRY_CONFIG.BASE_DELAY_MS,\n maxDelayMs: RETRY_CONFIG.MAX_DELAY_MS,\n};\n\n/**\n * Fetch with automatic retry and exponential backoff\n */\nasync function fetchWithRetry(\n url: string,\n options: RequestInit,\n config: RetryConfig = DEFAULT_RETRY_CONFIG,\n debug: boolean = false\n): Promise<Response> {\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt <= config.maxRetries; attempt++) {\n try {\n if (debug && attempt > 0) {\n console.log(`[Gotcha] Retry attempt ${attempt}/${config.maxRetries}`);\n }\n\n const response = await fetch(url, options);\n\n // Don't retry client errors (4xx) except 429 (rate limit)\n if (response.status >= 400 && response.status < 500 && response.status !== 429) {\n return response;\n }\n\n // Success - return immediately\n if (response.ok) {\n return response;\n }\n\n lastError = new Error(`HTTP ${response.status}`);\n } catch (error) {\n // Network error - retry\n lastError = error as Error;\n if (debug) {\n console.log(`[Gotcha] Network error: ${lastError.message}`);\n }\n }\n\n // Don't delay after last attempt\n if (attempt < config.maxRetries) {\n const delay = Math.min(\n config.baseDelayMs * Math.pow(2, attempt),\n config.maxDelayMs\n );\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n\n throw lastError;\n}\n\nexport function createApiClient(config: ApiClientConfig) {\n const { apiKey, baseUrl = API_BASE_URL, debug = false } = config;\n\n let flushing = false;\n\n const headers = {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${apiKey}`,\n };\n\n async function request<T>(\n method: string,\n endpoint: string,\n body?: unknown\n ): Promise<T> {\n const url = `${baseUrl}${endpoint}`;\n const idempotencyKey = generateId();\n\n if (debug) {\n console.log(`[Gotcha] ${method} ${endpoint}`, body);\n }\n\n const response = await fetchWithRetry(\n url,\n {\n method,\n headers: {\n ...headers,\n 'Idempotency-Key': idempotencyKey,\n },\n body: body ? JSON.stringify(body) : undefined,\n },\n DEFAULT_RETRY_CONFIG,\n debug\n );\n\n let data: Record<string, unknown>;\n try {\n data = await response.json();\n } catch {\n throw { code: 'PARSE_ERROR', message: 'Invalid response from server', status: response.status } as GotchaError;\n }\n\n if (!response.ok) {\n const error = data.error as GotchaError;\n if (debug) {\n console.error(`[Gotcha] Error: ${error.code} - ${error.message}`);\n }\n throw error;\n }\n\n if (debug) {\n console.log(`[Gotcha] Response:`, data);\n }\n\n return data as T;\n }\n\n return {\n /**\n * Submit a response (feedback, vote, etc.)\n */\n async submitResponse(\n payload: Omit<SubmitResponsePayload, 'context'>\n ): Promise<GotchaResponse> {\n // Ensure user has an ID (anonymous if not provided)\n const user = payload.user || {};\n if (!user.id) {\n user.id = getAnonymousId();\n }\n\n const fullPayload: SubmitResponsePayload = {\n ...payload,\n user,\n context: collectContext(),\n // Only include isBug if true\n ...(payload.isBug ? { isBug: true } : {}),\n };\n\n // Queue if offline\n if (typeof navigator !== 'undefined' && !navigator.onLine) {\n enqueue(fullPayload as unknown as Record<string, unknown>, 'create');\n return {\n id: generateId(),\n status: 'queued' as const,\n createdAt: new Date().toISOString(),\n };\n }\n\n try {\n return await request<GotchaResponse>('POST', '/responses', fullPayload);\n } catch (err) {\n // On network failure, queue for later\n if (err instanceof TypeError && typeof navigator !== 'undefined' && !navigator.onLine) {\n enqueue(fullPayload as unknown as Record<string, unknown>, 'create');\n return {\n id: generateId(),\n status: 'queued' as const,\n createdAt: new Date().toISOString(),\n };\n }\n throw err;\n }\n },\n\n /**\n * Check if a user has an existing response for an element\n */\n async checkExistingResponse(\n elementId: string,\n userId: string\n ): Promise<ExistingResponse | null> {\n const url = `${baseUrl}/responses/check?elementId=${encodeURIComponent(elementId)}&userId=${encodeURIComponent(userId)}`;\n\n if (debug) {\n console.log(`[Gotcha] GET /responses/check`);\n }\n\n const response = await fetchWithRetry(\n url,\n {\n method: 'GET',\n headers,\n },\n DEFAULT_RETRY_CONFIG,\n debug\n );\n\n const data = await response.json();\n\n if (!response.ok) {\n const error = data.error as GotchaError;\n if (debug) {\n console.error(`[Gotcha] Error: ${error.code} - ${error.message}`);\n }\n throw error;\n }\n\n if (data.exists) {\n if (debug) {\n console.log(`[Gotcha] Found existing response:`, data.response);\n }\n return data.response as ExistingResponse;\n }\n\n return null;\n },\n\n /**\n * Update an existing response\n */\n async updateResponse(\n id: string,\n payload: {\n content?: string;\n title?: string;\n rating?: number;\n vote?: VoteType;\n pollSelected?: string[];\n },\n userId?: string\n ): Promise<GotchaResponse> {\n const url = `${baseUrl}/responses/${id}${userId ? `?userId=${encodeURIComponent(userId)}` : ''}`;\n\n if (debug) {\n console.log(`[Gotcha] PATCH /responses/${id}`, payload);\n }\n\n const response = await fetchWithRetry(\n url,\n {\n method: 'PATCH',\n headers,\n body: JSON.stringify(payload),\n },\n DEFAULT_RETRY_CONFIG,\n debug\n );\n\n const data = await response.json();\n\n if (!response.ok) {\n const error = data.error as GotchaError;\n if (debug) {\n console.error(`[Gotcha] Error: ${error.code} - ${error.message}`);\n }\n throw error;\n }\n\n if (debug) {\n console.log(`[Gotcha] Response updated:`, data);\n }\n\n return data as GotchaResponse;\n },\n\n /**\n * Get aggregate score data for an element\n */\n async getScore(elementId: string): Promise<ScoreData> {\n const url = `${baseUrl}/scores/${encodeURIComponent(elementId)}`;\n\n if (debug) {\n console.log(`[Gotcha] GET /scores/${elementId}`);\n }\n\n const response = await fetchWithRetry(\n url,\n {\n method: 'GET',\n headers,\n },\n DEFAULT_RETRY_CONFIG,\n debug\n );\n\n const data = await response.json();\n\n if (!response.ok) {\n const error = data.error as GotchaError;\n if (debug) {\n console.error(`[Gotcha] Error: ${error.code} - ${error.message}`);\n }\n throw error;\n }\n\n if (debug) {\n console.log(`[Gotcha] Score:`, data);\n }\n\n return data as ScoreData;\n },\n\n /**\n * Flag a response as a bug report\n */\n async flagAsBug(responseId: string): Promise<{ ticketId: string; status: string }> {\n const url = `${baseUrl}/responses/${encodeURIComponent(responseId)}/bug`;\n\n if (debug) {\n console.log(`[Gotcha] POST /responses/${responseId}/bug`);\n }\n\n const response = await fetchWithRetry(\n url,\n {\n method: 'POST',\n headers,\n },\n DEFAULT_RETRY_CONFIG,\n debug\n );\n\n const data = await response.json();\n\n if (!response.ok) {\n const error = data.error as GotchaError;\n if (debug) {\n console.error(`[Gotcha] Error: ${error.code} - ${error.message}`);\n }\n throw error;\n }\n\n if (debug) {\n console.log(`[Gotcha] Bug flagged:`, data);\n }\n\n return data as { ticketId: string; status: string };\n },\n\n /**\n * Flush queued offline submissions\n */\n async flushQueue(): Promise<void> {\n if (flushing) return;\n flushing = true;\n try {\n const items = getQueuedItems();\n for (const item of items) {\n try {\n if (item.type === 'update' && item.payload.responseId) {\n const { responseId, ...updatePayload } = item.payload;\n await request('PATCH', `/responses/${responseId}`, updatePayload);\n } else {\n await request('POST', '/responses', item.payload);\n }\n dequeue(item.id);\n } catch {\n incrementRetries(item.id);\n }\n }\n } finally {\n flushing = false;\n }\n },\n\n /**\n * Get count of queued offline submissions\n */\n getQueueLength,\n\n /**\n * Get the base URL (for debugging)\n */\n getBaseUrl(): string {\n return baseUrl;\n },\n };\n}\n\nexport type ApiClient = ReturnType<typeof createApiClient>;\n","const UNSAFE_KEYS = new Set(['__proto__', 'constructor', 'prototype']);\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function deepMerge(base: any, override: any): any {\n const result = { ...base };\n for (const key of Object.keys(override)) {\n if (UNSAFE_KEYS.has(key)) continue;\n const val = override[key];\n if (val !== undefined && val !== null && typeof val === 'object' && !Array.isArray(val)) {\n result[key] = deepMerge(base[key] ?? {}, val);\n } else if (val !== undefined) {\n result[key] = val;\n }\n }\n return result;\n}\n","// ============================================\n// THEME TOKEN SYSTEM\n// ============================================\n\nexport interface GotchaThemeColors {\n primary: string;\n primaryHover: string;\n primaryText: string;\n background: string;\n backgroundGradient: string;\n surface: string;\n surfaceHover: string;\n text: string;\n textSecondary: string;\n textDisabled: string;\n border: string;\n borderFocus: string;\n success: string;\n successSurface: string;\n error: string;\n errorSurface: string;\n errorBorder: string;\n warning: string;\n warningActive: string;\n warningSurface: string;\n warningBorder: string;\n starFilled: string;\n starEmpty: string;\n voteUp: string;\n voteUpSurface: string;\n voteUpBorder: string;\n voteDown: string;\n voteDownSurface: string;\n voteDownBorder: string;\n npsColors: string[];\n buttonBackground: string;\n buttonBackgroundHover: string;\n buttonBackgroundDisabled: string;\n buttonColor: string;\n buttonColorDisabled: string;\n buttonBorder: string;\n buttonShadow: string;\n backdropColor: string;\n closeButton: string;\n closeButtonHover: string;\n closeButtonBg: string;\n // Glass button\n glassBackground: string;\n glassBorder: string;\n glassColor: string;\n glassShadow: string;\n glassHoverShadow: string;\n // Input\n inputBackground: string;\n inputBackgroundFocus: string;\n inputBorder: string;\n inputBorderFocus: string;\n inputFocusRing: string;\n // Poll\n pollBorder: string;\n pollSelectedBorder: string;\n pollBackground: string;\n pollSelectedBackground: string;\n pollColor: string;\n pollSelectedColor: string;\n pollCheckBorder: string;\n pollCheckSelectedBorder: string;\n pollCheckSelectedBg: string;\n}\n\nexport interface GotchaThemeTypography {\n fontFamily: string;\n fontSize: {\n xs: number;\n sm: number;\n md: number;\n lg: number;\n };\n fontWeight: {\n normal: number;\n medium: number;\n semibold: number;\n bold: number;\n };\n}\n\nexport interface GotchaThemeBorders {\n radius: {\n sm: number;\n md: number;\n lg: number;\n full: string;\n };\n width: number;\n}\n\nexport interface GotchaThemeShadows {\n sm: string;\n md: string;\n lg: string;\n modal: string;\n button: string;\n}\n\nexport interface GotchaThemeAnimation {\n duration: {\n fast: string;\n normal: string;\n slow: string;\n };\n easing: {\n default: string;\n spring: string;\n };\n}\n\nexport interface GotchaThemeConfig {\n colors?: Partial<GotchaThemeColors>;\n typography?: Partial<GotchaThemeTypography>;\n borders?: Partial<GotchaThemeBorders>;\n shadows?: Partial<GotchaThemeShadows>;\n animation?: Partial<GotchaThemeAnimation>;\n}\n\nexport interface ResolvedTheme {\n colors: GotchaThemeColors;\n typography: GotchaThemeTypography;\n borders: GotchaThemeBorders;\n shadows: GotchaThemeShadows;\n animation: GotchaThemeAnimation;\n}\n\n// ── NPS score colors ─────────────────────────────────────────\nconst NPS_COLORS = [\n '#ef4444', '#f05540', '#f1663c', '#f27738', '#f38834',\n '#f59e0b', '#d4a30e', '#b3a812', '#79b841', '#45c870', '#10b981',\n];\n\n// ── Light preset ─────────────────────────────────────────────\nexport const LIGHT_TOKENS: ResolvedTheme = {\n colors: {\n primary: '#1e293b',\n primaryHover: '#334155',\n primaryText: '#ffffff',\n background: '#ffffff',\n backgroundGradient: 'linear-gradient(180deg, #ffffff 0%, #f8fafc 100%)',\n surface: '#fafbfc',\n surfaceHover: '#ffffff',\n text: '#111827',\n textSecondary: '#374151',\n textDisabled: '#94a3b8',\n border: '#e2e8f0',\n borderFocus: '#1e293b',\n success: '#059669',\n successSurface: 'rgba(5,150,105,0.08)',\n error: '#dc2626',\n errorSurface: '#fef2f2',\n errorBorder: 'rgba(220,38,38,0.1)',\n warning: '#d97706',\n warningActive: '#b45309',\n warningSurface: 'rgba(251,191,36,0.08)',\n warningBorder: 'rgba(217,119,6,0.25)',\n starFilled: '#f59e0b',\n starEmpty: '#e2e8f0',\n voteUp: '#10b981',\n voteUpSurface: 'rgba(16,185,129,0.06)',\n voteUpBorder: 'rgba(16,185,129,0.25)',\n voteDown: '#ef4444',\n voteDownSurface: 'rgba(239,68,68,0.06)',\n voteDownBorder: 'rgba(239,68,68,0.25)',\n npsColors: NPS_COLORS,\n buttonBackground: '#1e293b',\n buttonBackgroundHover: '#334155',\n buttonBackgroundDisabled: '#e2e8f0',\n buttonColor: '#ffffff',\n buttonColorDisabled: '#94a3b8',\n buttonBorder: 'none',\n buttonShadow: 'none',\n backdropColor: 'rgba(0,0,0,0.4)',\n closeButton: '#9ca3af',\n closeButtonHover: '#6b7280',\n closeButtonBg: 'rgba(0,0,0,0.04)',\n glassBackground: 'linear-gradient(160deg, rgba(255,255,255,0.7) 0%, rgba(200,210,230,0.4) 40%, rgba(180,192,220,0.5) 100%)',\n glassBorder: 'none',\n glassColor: 'rgba(0,0,0,0.75)',\n glassShadow: '0 3px 12px rgba(0,0,0,0.12), 0 0 1px rgba(0,0,0,0.2)',\n glassHoverShadow: '0 6px 20px rgba(0,0,0,0.18), 0 0 1px rgba(0,0,0,0.25)',\n inputBackground: '#fafbfc',\n inputBackgroundFocus: '#ffffff',\n inputBorder: '#e2e8f0',\n inputBorderFocus: '#1e293b',\n inputFocusRing: 'rgba(30,41,59,0.15)',\n pollBorder: '#e2e8f0',\n pollSelectedBorder: 'rgba(30,41,59,0.25)',\n pollBackground: '#fafbfc',\n pollSelectedBackground: 'rgba(30,41,59,0.05)',\n pollColor: '#374151',\n pollSelectedColor: '#1e293b',\n pollCheckBorder: '#cbd5e1',\n pollCheckSelectedBorder: '#1e293b',\n pollCheckSelectedBg: '#1e293b',\n },\n typography: {\n fontFamily: \"'DM Sans', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif\",\n fontSize: { xs: 11, sm: 13, md: 14, lg: 16 },\n fontWeight: { normal: 400, medium: 500, semibold: 600, bold: 700 },\n },\n borders: {\n radius: { sm: 8, md: 10, lg: 14, full: '50%' },\n width: 1,\n },\n shadows: {\n sm: '0 1px 2px rgba(0,0,0,0.04)',\n md: '0 4px 12px rgba(0,0,0,0.06)',\n lg: '0 12px 32px rgba(0,0,0,0.06)',\n modal: '0 1px 2px rgba(0,0,0,0.04), 0 4px 12px rgba(0,0,0,0.06), 0 12px 32px rgba(0,0,0,0.06), 0 24px 48px rgba(0,0,0,0.04)',\n button: '0 2px 8px rgba(0,0,0,0.06)',\n },\n animation: {\n duration: { fast: '0.15s', normal: '0.25s', slow: '0.4s' },\n easing: {\n default: 'cubic-bezier(0.4, 0, 0.2, 1)',\n spring: 'cubic-bezier(0.34, 1.56, 0.64, 1)',\n },\n },\n};\n\n// ── Dark preset ──────────────────────────────────────────────\nexport const DARK_TOKENS: ResolvedTheme = {\n colors: {\n primary: '#e2e8f0',\n primaryHover: '#cbd5e1',\n primaryText: '#1e293b',\n background: '#1a1f2e',\n backgroundGradient: 'linear-gradient(180deg, #1a1f2e 0%, #151925 100%)',\n surface: 'rgba(55,65,81,0.5)',\n surfaceHover: 'rgba(55,65,81,0.7)',\n text: '#f9fafb',\n textSecondary: '#d1d5db',\n textDisabled: '#6b7280',\n border: 'rgba(255,255,255,0.08)',\n borderFocus: 'rgba(255,255,255,0.2)',\n success: '#10b981',\n successSurface: 'rgba(16,185,129,0.1)',\n error: '#fecaca',\n errorSurface: 'rgba(127,29,29,0.3)',\n errorBorder: 'rgba(254,202,202,0.1)',\n warning: '#fbbf24',\n warningActive: '#fbbf24',\n warningSurface: 'rgba(245,158,11,0.08)',\n warningBorder: 'rgba(245,158,11,0.3)',\n starFilled: '#f59e0b',\n starEmpty: 'rgba(255,255,255,0.12)',\n voteUp: '#10b981',\n voteUpSurface: 'rgba(16,185,129,0.08)',\n voteUpBorder: 'rgba(16,185,129,0.3)',\n voteDown: '#ef4444',\n voteDownSurface: 'rgba(239,68,68,0.08)',\n voteDownBorder: 'rgba(239,68,68,0.3)',\n npsColors: NPS_COLORS,\n buttonBackground: '#e2e8f0',\n buttonBackgroundHover: '#cbd5e1',\n buttonBackgroundDisabled: '#374151',\n buttonColor: '#1e293b',\n buttonColorDisabled: '#6b7280',\n buttonBorder: 'none',\n buttonShadow: 'none',\n backdropColor: 'rgba(0,0,0,0.5)',\n closeButton: '#6b7280',\n closeButtonHover: '#9ca3af',\n closeButtonBg: 'rgba(255,255,255,0.06)',\n glassBackground: 'linear-gradient(180deg, rgba(255,255,255,0.16) 0%, rgba(255,255,255,0.04) 60%, rgba(0,0,0,0.05) 100%)',\n glassBorder: '1px solid rgba(255,255,255,0.15)',\n glassColor: 'rgba(255,255,255,0.88)',\n glassShadow: '0 4px 14px rgba(0,0,0,0.45), 0 1px 3px rgba(0,0,0,0.35)',\n glassHoverShadow: '0 8px 24px rgba(0,0,0,0.55), 0 1px 3px rgba(0,0,0,0.4)',\n inputBackground: 'rgba(55,65,81,0.5)',\n inputBackgroundFocus: 'rgba(55,65,81,0.7)',\n inputBorder: 'rgba(255,255,255,0.08)',\n inputBorderFocus: 'rgba(255,255,255,0.2)',\n inputFocusRing: 'rgba(255,255,255,0.06)',\n pollBorder: 'rgba(255,255,255,0.08)',\n pollSelectedBorder: 'rgba(226,232,240,0.25)',\n pollBackground: 'rgba(55,65,81,0.5)',\n pollSelectedBackground: 'rgba(226,232,240,0.08)',\n pollColor: '#d1d5db',\n pollSelectedColor: '#e2e8f0',\n pollCheckBorder: 'rgba(255,255,255,0.2)',\n pollCheckSelectedBorder: '#e2e8f0',\n pollCheckSelectedBg: '#e2e8f0',\n },\n typography: {\n fontFamily: \"'DM Sans', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif\",\n fontSize: { xs: 11, sm: 13, md: 14, lg: 16 },\n fontWeight: { normal: 400, medium: 500, semibold: 600, bold: 700 },\n },\n borders: {\n radius: { sm: 8, md: 10, lg: 14, full: '50%' },\n width: 1,\n },\n shadows: {\n sm: '0 1px 2px rgba(0,0,0,0.2)',\n md: '0 4px 12px rgba(0,0,0,0.3)',\n lg: '0 12px 32px rgba(0,0,0,0.2)',\n modal: '0 1px 2px rgba(0,0,0,0.2), 0 4px 12px rgba(0,0,0,0.3), 0 12px 32px rgba(0,0,0,0.2), 0 24px 48px rgba(0,0,0,0.15)',\n button: '0 2px 8px rgba(0,0,0,0.15)',\n },\n animation: {\n duration: { fast: '0.15s', normal: '0.25s', slow: '0.4s' },\n easing: {\n default: 'cubic-bezier(0.4, 0, 0.2, 1)',\n spring: 'cubic-bezier(0.34, 1.56, 0.64, 1)',\n },\n },\n};\n\n// ── Helper ───────────────────────────────────────────────────\n\nimport { deepMerge } from '../utils/deepMerge';\n\n/** Create a custom theme by merging partial overrides onto a preset */\nexport function createTheme(\n base: 'light' | 'dark',\n overrides: GotchaThemeConfig,\n): GotchaThemeConfig {\n const preset = base === 'dark' ? DARK_TOKENS : LIGHT_TOKENS;\n return deepMerge(preset, overrides) as GotchaThemeConfig;\n}\n","import { LIGHT_TOKENS, DARK_TOKENS, GotchaThemeConfig, ResolvedTheme } from './tokens';\nimport { deepMerge } from '../utils/deepMerge';\n\n/**\n * Resolve a complete theme from the base preset + optional provider & instance overrides.\n * Returns a fully-resolved object with no undefined values.\n */\nexport function resolveTheme(\n theme: 'light' | 'dark' | 'auto' | 'custom',\n systemTheme: 'light' | 'dark',\n providerConfig?: GotchaThemeConfig,\n): ResolvedTheme {\n const effectiveTheme = theme === 'auto' || theme === 'custom' ? systemTheme : theme;\n let resolved: ResolvedTheme = effectiveTheme === 'dark'\n ? deepMerge({}, DARK_TOKENS) as ResolvedTheme\n : deepMerge({}, LIGHT_TOKENS) as ResolvedTheme;\n\n if (providerConfig) {\n resolved = deepMerge(resolved, providerConfig) as ResolvedTheme;\n }\n\n return resolved;\n}\n","import { ResolvedTheme } from './tokens';\n\nconst STYLE_ID = 'gotcha-styles';\nconst FONT_ID = 'gotcha-dm-sans';\nconst FONT_FACE_ID = 'gotcha-carter-one';\n\n/**\n * The Carter One @font-face CSS with base64-embedded woff2.\n * Uses font-display: block to prevent any fallback font from showing.\n * Since the font is base64-encoded (instant decode), the block period is negligible.\n */\nconst CARTER_ONE_FONT_FACE = `\n@font-face {\n font-family: 'Carter One';\n font-style: normal;\n font-weight: 400;\n font-display: block;\n src: url(data:font/woff2;base64,d09GMgABAAAAAAK4AA4AAAAABOwAAAJlAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGhQbXhwaBmAANBEICoFUgW8BNgIkAwgLBgAEIAWCUgcgGwoEUVQMHgC+OLCNaQVfBAoIrXGAIhjLIIM0CxavPfqMrzmLh6/9fufu20XEQyQzNNPOUEmimUZJpKLdIu3RKOU3O1hXc5D3YTdAbu+mRHU5AAIwC231R25qGGbpnwecyr34QQKM3gHMKMzOM4ogDSwQSreJE9bjISamQdCMwAAgeI0+S7qoy5j8TCDK8Ff4Fwm5+ecJhCwh9EgmsJiTo6S+/WkCPCU8DpCqr+hWKM/FBMRyfLPqV2LSlzBEIhqLxeGhIADg+rwoHxx58Oipm4301FUpgID4K8fAChoJFSYwAhNYKyDLAjudDimd9wA18hGDDvNkBE6AByBJiLpXVM2jgyht94hWK9yPQD+5lb948fAQKnfCK1PjBQWRayfW+hltCzAs9B8eX54Xd5g7vrzpiTswCeXB/VG5PNObmFr711KPrLKC6/mxys5avigCA+uFj8HGq+ErmaRDt/31k1XtfRtcI0pNluOCFEOOmVEOTg5eYn77Hq9Y0SJxu+bSBW5skqWS0VLXOvNJxgyRhVECycL7u2cb2pmOGdolPK+ORsLma1IHQCAY6I5NjWKsNzQVPeDnvzc7Pth+aTYMKHpqoEcCwSM4A6sVYPt/AIoeTckToLx4hELyieAj16Z4TKDbKYzIJOAW2JNhIptMhjyRlbXedjaymDv75i5jb1xkyVYiV4okyfIhmnG0EGNDIyMkVgmkUIJcmbJkQmLEi5Ehjz7iJF06pJeel1ETYiCBP/+OePouYuTKlyAX4iVTAl8JkhRIFyN3UpqAdTHa1nfVAy3Kk3LL2Ejf0Gch0McAqJNIAwAA) format('woff2');\n unicode-range: U+0047;\n}`.trim();\n\n/**\n * Inject Carter One @font-face at module load time (top-level side effect).\n * This ensures the font is registered with the browser BEFORE any React\n * component renders, eliminating FOUT completely.\n */\nfunction injectFontFace(): void {\n if (typeof document === 'undefined') return;\n if (document.getElementById(FONT_FACE_ID)) return;\n\n const style = document.createElement('style');\n style.id = FONT_FACE_ID;\n style.textContent = CARTER_ONE_FONT_FACE;\n document.head.appendChild(style);\n}\n\n// Execute immediately when this module is imported\ninjectFontFace();\n\n/** Strip characters that could break out of a CSS value context */\nfunction sanitizeCSS(value: string): string {\n return value.replace(/[{}<>;@\\\\]/g, '');\n}\n\n/**\n * Generate the full CSS string for all Gotcha animations, fonts, and base styles.\n */\nexport function generateStyleTag(theme: ResolvedTheme): string {\n const easing = {\n default: sanitizeCSS(theme.animation.easing.default),\n spring: sanitizeCSS(theme.animation.easing.spring),\n };\n const duration = {\n normal: sanitizeCSS(theme.animation.duration.normal),\n };\n const fontFamily = sanitizeCSS(theme.typography.fontFamily);\n const textDisabled = sanitizeCSS(theme.colors.textDisabled);\n const borderColor = sanitizeCSS(theme.colors.border);\n\n return `\n/* ── Gotcha Keyframe Animations ────────────────────────────── */\n\n@keyframes gotcha-modal-in {\n from { opacity: 0; transform: translateX(-50%) scale(0.92) translateY(-6px); }\n to { opacity: 1; transform: translateX(-50%) scale(1) translateY(0); }\n}\n\n@keyframes gotcha-modal-in-above {\n from { opacity: 0; transform: translateX(-50%) scale(0.92) translateY(6px); }\n to { opacity: 1; transform: translateX(-50%) scale(1) translateY(0); }\n}\n\n@keyframes gotcha-modal-in-center {\n from { opacity: 0; transform: translate(-50%, -50%) scale(0.92); }\n to { opacity: 1; transform: translate(-50%, -50%) scale(1); }\n}\n\n@keyframes gotcha-success-pop {\n 0% { transform: scale(0); opacity: 0; }\n 50% { transform: scale(1.15); }\n 100% { transform: scale(1); opacity: 1; }\n}\n\n@keyframes gotcha-success-text {\n from { opacity: 0; transform: translateY(6px); }\n to { opacity: 1; transform: translateY(0); }\n}\n\n@keyframes gotcha-check-draw {\n from { stroke-dashoffset: 24; }\n to { stroke-dashoffset: 0; }\n}\n\n@keyframes gotcha-glow-pulse {\n 0%, 100% { box-shadow: 0 0 0 0 rgba(16,185,129,0.3); }\n 50% { box-shadow: 0 0 0 8px rgba(16,185,129,0); }\n}\n\n@keyframes gotcha-star-pulse {\n 0% { transform: scale(1); }\n 40% { transform: scale(1.3); }\n 100% { transform: scale(1); }\n}\n\n@keyframes gotcha-shimmer {\n 0% { background-position: -200% 0; }\n 100% { background-position: 200% 0; }\n}\n\n@keyframes gotcha-fade-up {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n@keyframes gotcha-overlay-in {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n@keyframes gotcha-expand-in {\n from { opacity: 0; max-height: 0; margin-top: 0; }\n to { opacity: 1; max-height: 200px; margin-top: 12px; }\n}\n\n@keyframes gotcha-bubble-pop {\n 0% { transform: scale(0); opacity: 0; filter: blur(4px); }\n 40% { opacity: 1; filter: blur(0px); }\n 65% { transform: scale(1.08); }\n 82% { transform: scale(0.97); }\n 100% { transform: scale(1); opacity: 1; filter: blur(0px); }\n}\n\n@keyframes gotcha-letter-in {\n 0% { opacity: 0; transform: scale(0.6) translateY(2px); filter: blur(3px); }\n 100% { opacity: 1; transform: scale(1) translateY(0); filter: blur(0px); }\n}\n\n@keyframes gotcha-arrive-glow {\n 0%, 100% { box-shadow: 0 3px 12px rgba(0,0,0,0.12), 0 0 1px rgba(0,0,0,0.2); }\n 50% { box-shadow: 0 4px 16px rgba(0,0,0,0.18), 0 0 1px rgba(0,0,0,0.25); }\n}\n\n@keyframes gotcha-spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n}\n\n@keyframes gotcha-dash {\n 0% { stroke-dasharray: 1, 62; stroke-dashoffset: 0; }\n 50% { stroke-dasharray: 40, 62; stroke-dashoffset: -12; }\n 100% { stroke-dasharray: 1, 62; stroke-dashoffset: -62; }\n}\n\n/* ── Base Styles ───────────────────────────────────────────── */\n\n[data-gotcha] {\n font-family: ${fontFamily};\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n[data-gotcha] *, [data-gotcha] *::before, [data-gotcha] *::after {\n box-sizing: border-box;\n}\n\n[data-gotcha] button {\n outline: none;\n}\n\n[data-gotcha] button:focus-visible {\n outline: none;\n box-shadow: 0 0 0 2px ${borderColor};\n}\n\n.gotcha-root textarea::placeholder {\n color: ${textDisabled};\n}\n\n/* ── Animation Utilities ───────────────────────────────────── */\n\n.gotcha-fade-up {\n animation: gotcha-fade-up ${duration.normal} ${easing.default} both;\n}\n\n.gotcha-modal-enter {\n animation: gotcha-modal-in 0.3s ${easing.spring} both;\n}\n\n.gotcha-modal-enter-above {\n animation: gotcha-modal-in-above 0.3s ${easing.spring} both;\n}\n\n.gotcha-modal-enter-center {\n animation: gotcha-modal-in-center 0.3s ${easing.spring} both;\n}\n\n.gotcha-overlay-enter {\n animation: gotcha-overlay-in 0.2s ${easing.default} both;\n}\n\n/* ── Reduced Motion ────────────────────────────────────────── */\n\n@media (prefers-reduced-motion: reduce) {\n [data-gotcha] *, [data-gotcha] *::before, [data-gotcha] *::after {\n animation-duration: 0.01ms !important;\n animation-iteration-count: 1 !important;\n transition-duration: 0.01ms !important;\n }\n}\n`.trim();\n}\n\n/**\n * Inject the style tag into the document head (idempotent).\n */\nexport function injectStyles(theme: ResolvedTheme): void {\n if (typeof document === 'undefined') return;\n\n // Inject DM Sans from Google Fonts with preconnect\n if (!document.getElementById(FONT_ID)) {\n // Preconnect to Google Fonts\n const preconnect = document.createElement('link');\n preconnect.rel = 'preconnect';\n preconnect.href = 'https://fonts.googleapis.com';\n document.head.appendChild(preconnect);\n\n const preconnectStatic = document.createElement('link');\n preconnectStatic.rel = 'preconnect';\n preconnectStatic.href = 'https://fonts.gstatic.com';\n preconnectStatic.crossOrigin = 'anonymous';\n document.head.appendChild(preconnectStatic);\n\n // Load DM Sans from Google Fonts (Carter One is base64-embedded above)\n const link = document.createElement('link');\n link.id = FONT_ID;\n link.rel = 'stylesheet';\n link.href = 'https://fonts.googleapis.com/css2?family=Carter+One&family=DM+Sans:wght@400;500;600;700&display=swap';\n document.head.appendChild(link);\n }\n\n // Inject or update style tag\n let styleEl = document.getElementById(STYLE_ID) as HTMLStyleElement | null;\n if (!styleEl) {\n styleEl = document.createElement('style');\n styleEl.id = STYLE_ID;\n document.head.appendChild(styleEl);\n }\n styleEl.textContent = generateStyleTag(theme);\n}\n","import React, { createContext, useContext, useMemo, useState, useCallback, useEffect } from 'react';\nimport { createApiClient, ApiClient } from '../api/client';\nimport { GotchaUser } from '../types';\nimport { GotchaThemeConfig } from '../theme/tokens';\nimport { resolveTheme } from '../theme/resolveTheme';\nimport { injectStyles } from '../theme/styles';\nimport { startErrorCapture, stopErrorCapture } from '../utils/errorBuffer';\n\nexport interface GotchaProviderProps {\n /** Your Gotcha API key */\n apiKey: string;\n /** React children */\n children: React.ReactNode;\n /** Override the API base URL (for testing/staging) */\n baseUrl?: string;\n /** Enable debug logging */\n debug?: boolean;\n /** Disable all Gotcha buttons globally */\n disabled?: boolean;\n /** Default user metadata applied to all submissions */\n defaultUser?: GotchaUser;\n /** Theme configuration overrides applied to all instances */\n themeConfig?: GotchaThemeConfig;\n}\n\nexport interface GotchaContextValue {\n client: ApiClient;\n disabled: boolean;\n defaultUser: GotchaUser;\n debug: boolean;\n // Modal management - only one open at a time\n activeModalId: string | null;\n openModal: (elementId: string) => void;\n closeModal: () => void;\n // Theme\n themeConfig?: GotchaThemeConfig;\n}\n\nconst GotchaContext = createContext<GotchaContextValue | null>(null);\n\nconst EMPTY_USER: GotchaUser = {};\n\nexport function GotchaProvider({\n apiKey,\n children,\n baseUrl,\n debug = false,\n disabled = false,\n defaultUser,\n themeConfig,\n}: GotchaProviderProps) {\n const [activeModalId, setActiveModalId] = useState<string | null>(null);\n\n if (baseUrl && !baseUrl.startsWith('https://') && !baseUrl.startsWith('/') && !baseUrl.includes('localhost')) {\n console.warn('[Gotcha] baseUrl should use HTTPS in production:', baseUrl);\n }\n\n const client = useMemo(\n () => createApiClient({ apiKey, baseUrl, debug }),\n [apiKey, baseUrl, debug]\n );\n\n // Stabilize defaultUser reference\n const stableDefaultUser = useMemo(\n () => defaultUser ?? EMPTY_USER,\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [JSON.stringify(defaultUser)]\n );\n\n // Inject styles on mount. Carter One @font-face is injected at module-load time\n // (styles.ts:37) so it's already available before this runs.\n useEffect(() => {\n const resolved = resolveTheme('light', 'light', themeConfig);\n injectStyles(resolved);\n }, [themeConfig]);\n\n // Capture JS errors for context enrichment\n useEffect(() => {\n startErrorCapture();\n return () => stopErrorCapture();\n }, []);\n\n // Flush offline queue on reconnect and on mount\n useEffect(() => {\n client.flushQueue();\n const handleOnline = () => client.flushQueue();\n window.addEventListener('online', handleOnline);\n return () => window.removeEventListener('online', handleOnline);\n }, [client]);\n\n const openModal = useCallback((elementId: string) => {\n setActiveModalId(elementId);\n }, []);\n\n const closeModal = useCallback(() => {\n setActiveModalId(null);\n }, []);\n\n const value: GotchaContextValue = useMemo(\n () => ({\n client,\n disabled,\n defaultUser: stableDefaultUser,\n debug,\n activeModalId,\n openModal,\n closeModal,\n themeConfig,\n }),\n [client, disabled, stableDefaultUser, debug, activeModalId, openModal, closeModal, themeConfig]\n );\n\n return (\n <GotchaContext.Provider value={value}>{children}</GotchaContext.Provider>\n );\n}\n\nexport function useGotchaContext(): GotchaContextValue {\n const context = useContext(GotchaContext);\n if (!context) {\n throw new Error('useGotchaContext must be used within a GotchaProvider');\n }\n return context;\n}\n","import { useState, useCallback, useEffect } from 'react';\nimport { useGotchaContext } from '../components/GotchaProvider';\nimport { ResponseMode, GotchaUser, GotchaResponse, VoteType, ExistingResponse } from '../types';\n\ninterface UseSubmitOptions {\n elementId: string;\n mode: ResponseMode;\n pollOptions?: string[];\n user?: GotchaUser;\n onePerUser?: boolean;\n /** When onePerUser is true, allow a new submission after this many days */\n cooldownDays?: number;\n onSuccess?: (response: GotchaResponse) => void;\n onError?: (error: Error) => void;\n}\n\ninterface SubmitData {\n content?: string;\n title?: string;\n rating?: number;\n vote?: VoteType;\n pollSelected?: string[];\n isBug?: boolean;\n screenshot?: string;\n}\n\nfunction isResponseExpired(createdAt: string, cooldownDays: number): boolean {\n const createdTime = new Date(createdAt).getTime();\n if (isNaN(createdTime)) return true;\n const ageMs = Date.now() - createdTime;\n const cooldownMs = cooldownDays * 24 * 60 * 60 * 1000;\n return ageMs >= cooldownMs;\n}\n\nexport function useSubmit(options: UseSubmitOptions) {\n const { client, defaultUser } = useGotchaContext();\n const [isLoading, setIsLoading] = useState(false);\n const [isCheckingExisting, setIsCheckingExisting] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [existingResponse, setExistingResponse] = useState<ExistingResponse | null>(null);\n\n // Check for existing response when user ID is provided and onePerUser is enabled\n useEffect(() => {\n if (process.env.NODE_ENV !== 'production' && options.cooldownDays && !options.onePerUser) {\n console.warn('[Gotcha] cooldownDays has no effect without onePerUser=true');\n }\n\n const userId = options.user?.id || defaultUser?.id;\n if (!userId || !options.onePerUser) {\n setExistingResponse(null);\n return;\n }\n\n let cancelled = false;\n\n const checkExisting = async () => {\n setIsCheckingExisting(true);\n try {\n const existing = await client.checkExistingResponse(options.elementId, userId);\n if (!cancelled) {\n if (existing && options.cooldownDays && options.cooldownDays > 0 &&\n isResponseExpired(existing.createdAt, options.cooldownDays)) {\n setExistingResponse(null);\n } else {\n setExistingResponse(existing);\n }\n }\n } catch {\n // Ignore errors - just means no existing response found\n if (!cancelled) {\n setExistingResponse(null);\n }\n } finally {\n if (!cancelled) {\n setIsCheckingExisting(false);\n }\n }\n };\n\n checkExisting();\n\n return () => {\n cancelled = true;\n };\n }, [client, options.elementId, options.user?.id, defaultUser?.id, options.onePerUser, options.cooldownDays]);\n\n const submit = useCallback(\n async (data: SubmitData) => {\n setIsLoading(true);\n setError(null);\n\n try {\n const userId = options.user?.id || defaultUser?.id;\n let response: GotchaResponse;\n\n // If onePerUser is enabled and we have an existing response, update instead of create\n if (options.onePerUser && existingResponse && userId) {\n response = await client.updateResponse(\n existingResponse.id,\n {\n content: data.content,\n title: data.title,\n rating: data.rating,\n vote: data.vote,\n pollSelected: data.pollSelected,\n },\n userId\n );\n } else {\n response = await client.submitResponse({\n elementId: options.elementId,\n mode: options.mode,\n content: data.content,\n title: data.title,\n rating: data.rating,\n vote: data.vote,\n pollOptions: options.pollOptions,\n pollSelected: data.pollSelected,\n isBug: data.isBug,\n screenshot: data.screenshot,\n user: { ...defaultUser, ...options.user },\n });\n }\n\n // Update existingResponse so isEditing flips to true after first submit (only for onePerUser)\n if (options.onePerUser) {\n setExistingResponse({\n id: response.id,\n mode: options.mode,\n content: data.content ?? null,\n title: data.title ?? null,\n rating: data.rating ?? null,\n vote: data.vote ?? null,\n pollSelected: data.pollSelected ?? null,\n createdAt: response.createdAt,\n });\n }\n\n options.onSuccess?.(response);\n return response;\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Something went wrong';\n setError(errorMessage);\n options.onError?.(err instanceof Error ? err : new Error(errorMessage));\n throw err;\n } finally {\n setIsLoading(false);\n }\n },\n [client, defaultUser, options, existingResponse]\n );\n\n return {\n submit,\n isLoading,\n isCheckingExisting,\n error,\n existingResponse,\n isEditing: !!existingResponse,\n clearError: () => setError(null),\n };\n}\n","import { useState, useCallback, useEffect, useMemo } from 'react';\nimport { STORAGE_KEYS } from '../constants';\nimport { getAnonymousId } from '../utils/anonymous';\nimport { safeGetItem, safeSetItem } from '../utils/localStorage';\n\ninterface UseHideAfterSubmitOptions {\n elementId: string;\n userId?: string;\n hideAfterSubmitDays?: number;\n}\n\nfunction getStorageKey(elementId: string, userId: string): string {\n return `${STORAGE_KEYS.HIDDEN_UNTIL}_${elementId}_${userId}`;\n}\n\nfunction checkIsHidden(elementId: string, resolvedUserId: string, hideAfterSubmitDays?: number): boolean {\n if (!hideAfterSubmitDays || hideAfterSubmitDays <= 0) return false;\n const key = getStorageKey(elementId, resolvedUserId);\n const hiddenUntilStr = safeGetItem(key);\n if (!hiddenUntilStr) return false;\n return new Date(hiddenUntilStr).getTime() > Date.now();\n}\n\nexport function useHideAfterSubmit(options: UseHideAfterSubmitOptions) {\n const { elementId, userId, hideAfterSubmitDays } = options;\n const resolvedUserId = useMemo(() => userId || getAnonymousId(), [userId]);\n\n const [isHidden, setIsHidden] = useState(() =>\n checkIsHidden(elementId, resolvedUserId, hideAfterSubmitDays)\n );\n\n // Re-evaluate when props change dynamically\n useEffect(() => {\n setIsHidden(checkIsHidden(elementId, resolvedUserId, hideAfterSubmitDays));\n }, [elementId, resolvedUserId, hideAfterSubmitDays]);\n\n const markHidden = useCallback(() => {\n if (!hideAfterSubmitDays || hideAfterSubmitDays <= 0) return;\n\n const key = getStorageKey(elementId, resolvedUserId);\n const hiddenUntil = new Date(\n Date.now() + hideAfterSubmitDays * 24 * 60 * 60 * 1000\n );\n safeSetItem(key, hiddenUntil.toISOString());\n setIsHidden(true);\n }, [elementId, resolvedUserId, hideAfterSubmitDays]);\n\n return { isHidden, markHidden };\n}\n","import { useState, useEffect } from 'react';\nimport { STORAGE_KEYS } from '../constants';\nimport { safeGetItem, safeSetItem } from '../utils/localStorage';\n\ninterface UseTriggerConditionsOptions {\n elementId: string;\n showAfterSeconds?: number;\n showAfterScrollPercent?: number;\n showAfterVisits?: number;\n}\n\nfunction getVisitKey(elementId: string): string {\n return `${STORAGE_KEYS.VISIT_COUNT}_${elementId}`;\n}\n\nexport function useTriggerConditions(options: UseTriggerConditionsOptions) {\n const { elementId, showAfterSeconds, showAfterScrollPercent, showAfterVisits } = options;\n\n const hasConditions = showAfterSeconds != null || showAfterScrollPercent != null || showAfterVisits != null;\n\n const [timeMet, setTimeMet] = useState(!showAfterSeconds);\n const [scrollMet, setScrollMet] = useState(!showAfterScrollPercent);\n const [visitsMet] = useState(() => {\n if (!showAfterVisits) return true;\n const key = getVisitKey(elementId);\n const current = parseInt(safeGetItem(key) || '0', 10);\n const next = current + 1;\n safeSetItem(key, String(next));\n return next >= showAfterVisits;\n });\n\n // Time delay\n useEffect(() => {\n if (!showAfterSeconds || showAfterSeconds <= 0) return;\n\n const start = Date.now();\n const targetMs = showAfterSeconds * 1000;\n\n const check = () => {\n if (Date.now() - start >= targetMs) {\n setTimeMet(true);\n } else {\n timer = setTimeout(check, Math.min(1000, targetMs - (Date.now() - start)));\n }\n };\n\n let timer = setTimeout(check, Math.min(1000, targetMs));\n return () => clearTimeout(timer);\n }, [showAfterSeconds]);\n\n // Scroll depth\n useEffect(() => {\n if (!showAfterScrollPercent || showAfterScrollPercent <= 0) return;\n\n const checkScroll = () => {\n const scrollHeight = document.documentElement.scrollHeight;\n const viewportHeight = window.innerHeight;\n\n // If page can't scroll, condition is auto-met\n if (scrollHeight <= viewportHeight) {\n setScrollMet(true);\n return;\n }\n\n const scrolled = (window.scrollY + viewportHeight) / scrollHeight * 100;\n if (scrolled >= showAfterScrollPercent) {\n setScrollMet(true);\n }\n };\n\n checkScroll();\n if (!scrollMet) {\n window.addEventListener('scroll', checkScroll, { passive: true });\n return () => window.removeEventListener('scroll', checkScroll);\n }\n }, [showAfterScrollPercent, scrollMet]);\n\n return {\n conditionsMet: !hasConditions || (timeMet && scrollMet && visitsMet),\n };\n}\n","/**\n * Simple class name utility\n * Combines class names, filtering out falsy values\n */\nexport function cn(...classes: (string | undefined | null | false)[]): string {\n return classes.filter(Boolean).join(' ');\n}\n","/**\n * Detect if the device supports touch\n */\nexport const isTouchDevice = (): boolean => {\n if (typeof window === 'undefined') return false;\n return 'ontouchstart' in window || navigator.maxTouchPoints > 0;\n};\n\n/**\n * Get the appropriate size based on device type\n */\nexport const getResponsiveSize = (\n size: 'sm' | 'md' | 'lg',\n isTouch: boolean\n): number => {\n const sizes = {\n sm: { desktop: 24, mobile: 28 },\n md: { desktop: 32, mobile: 34 },\n lg: { desktop: 40, mobile: 40 },\n };\n\n return isTouch ? sizes[size].mobile : sizes[size].desktop;\n};\n","import React, { useState, useEffect, useMemo } from 'react';\nimport { Size, Theme, GotchaStyles } from '../types';\nimport { cn } from '../utils/cn';\nimport { isTouchDevice, getResponsiveSize } from '../utils/device';\nimport { resolveTheme } from '../theme/resolveTheme';\nimport { useGotchaContext } from './GotchaProvider';\n\nexport interface GotchaButtonProps {\n size: Size;\n theme: Theme;\n customStyles?: GotchaStyles;\n showOnHover: boolean;\n touchBehavior: 'always-visible' | 'tap-to-reveal';\n onClick: () => void;\n isOpen: boolean;\n isParentHovered?: boolean;\n /** Enable entrance animations (default: true) */\n animated?: boolean;\n /** Number of queued offline submissions */\n queuedCount?: number;\n}\n\nfunction getInitialSystemTheme(): 'light' | 'dark' {\n if (typeof window === 'undefined') return 'light';\n return window.matchMedia('(prefers-color-scheme: dark)').matches\n ? 'dark'\n : 'light';\n}\n\nexport function GotchaButton({\n size,\n theme,\n customStyles,\n showOnHover,\n touchBehavior,\n onClick,\n isOpen,\n isParentHovered = false,\n animated = true,\n queuedCount = 0,\n}: GotchaButtonProps) {\n const [isTouch, setIsTouch] = useState(false);\n const [tapRevealed, setTapRevealed] = useState(false);\n const [systemTheme, setSystemTheme] = useState<'light' | 'dark'>(getInitialSystemTheme);\n const [isHovered, setIsHovered] = useState(false);\n const [isPressed, setIsPressed] = useState(false);\n const [hasPopped, setHasPopped] = useState(false);\n\n const { themeConfig } = useGotchaContext();\n\n useEffect(() => {\n setIsTouch(isTouchDevice());\n\n if (typeof window === 'undefined') return;\n const darkQuery = window.matchMedia('(prefers-color-scheme: dark)');\n const handler = (e: MediaQueryListEvent) =>\n setSystemTheme(e.matches ? 'dark' : 'light');\n darkQuery.addEventListener('change', handler);\n return () => darkQuery.removeEventListener('change', handler);\n }, []);\n\n // Determine visibility\n const shouldShow = (() => {\n if (isOpen) return true;\n if (!isTouch && showOnHover) return isParentHovered;\n if (isTouch && touchBehavior === 'tap-to-reveal') return tapRevealed;\n return true;\n })();\n\n // Mark bubble pop as done after first appearance\n useEffect(() => {\n if (shouldShow && !hasPopped) {\n const timer = setTimeout(() => setHasPopped(true), 600);\n return () => clearTimeout(timer);\n }\n }, [shouldShow, hasPopped]);\n\n const handleClick = () => {\n if (isTouch && touchBehavior === 'tap-to-reveal' && !tapRevealed) {\n setTapRevealed(true);\n return;\n }\n onClick();\n };\n\n const buttonSize = getResponsiveSize(size, isTouch);\n const t = useMemo(\n () => resolveTheme(theme, systemTheme, themeConfig),\n [theme, systemTheme, themeConfig]\n );\n\n // Compute transform based on state\n const getTransform = () => {\n if (!shouldShow) return 'scale(0.6)';\n if (isPressed) return 'scale(0.95)';\n if (isHovered) return 'scale(1.08)';\n return 'scale(1)';\n };\n\n const baseStyles: React.CSSProperties = {\n width: buttonSize,\n height: buttonSize,\n borderRadius: '50%',\n border: t.colors.glassBorder,\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n background: t.colors.glassBackground,\n backdropFilter: 'blur(20px) saturate(180%)',\n WebkitBackdropFilter: 'blur(20px) saturate(180%)',\n color: t.colors.glassColor,\n boxShadow: isHovered ? t.colors.glassHoverShadow : t.colors.glassShadow,\n transition: hasPopped ? `all 0.3s ${t.animation.easing.spring}` : 'none',\n opacity: shouldShow ? 1 : 0,\n transform: getTransform(),\n filter: isPressed ? 'brightness(0.95)' : 'brightness(1)',\n pointerEvents: shouldShow ? 'auto' : 'none',\n ...(animated && shouldShow && !hasPopped ? {\n animation: 'gotcha-bubble-pop 500ms cubic-bezier(0.175, 0.885, 0.32, 1.275) both, gotcha-arrive-glow 1200ms ease-in-out 600ms both',\n } : {}),\n ...customStyles?.button,\n };\n\n return (\n <button\n type=\"button\"\n onClick={handleClick}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => { setIsHovered(false); setIsPressed(false); }}\n onMouseDown={() => setIsPressed(true)}\n onMouseUp={() => setIsPressed(false)}\n onTouchStart={() => setIsPressed(true)}\n onTouchEnd={() => setIsPressed(false)}\n style={baseStyles}\n className={cn('gotcha-button', isOpen && 'gotcha-button--open')}\n aria-label=\"Give feedback on this feature\"\n aria-expanded={isOpen}\n aria-haspopup=\"dialog\"\n >\n <GotchaIcon size={buttonSize * 0.65} animated={animated} />\n {queuedCount > 0 && (\n <div\n aria-label={`${queuedCount} queued`}\n style={{\n position: 'absolute',\n top: -2,\n right: -2,\n width: 8,\n height: 8,\n borderRadius: '50%',\n backgroundColor: t.colors.warning,\n border: '1.5px solid rgba(255,255,255,0.9)',\n }}\n />\n )}\n </button>\n );\n}\n\nfunction GotchaIcon({ size, animated = true }: { size: number; animated?: boolean }) {\n const [mounted, setMounted] = useState(false);\n useEffect(() => { setMounted(true); }, []);\n\n return (\n <span\n aria-hidden=\"true\"\n style={{\n fontFamily: \"'Carter One', cursive\",\n fontSize: size,\n lineHeight: 1,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n marginTop: size * 0.05,\n marginRight: size * 0.05,\n userSelect: 'none',\n opacity: animated ? 0 : (mounted ? 1 : 0),\n ...(animated && mounted ? {\n animation: 'gotcha-letter-in 350ms cubic-bezier(0.25, 0.46, 0.45, 0.94) 200ms both',\n } : {}),\n }}\n >\n G\n </span>\n );\n}\n","import React from 'react';\n\ninterface SpinnerProps {\n size?: number;\n color?: string;\n}\n\nexport function Spinner({ size = 16, color = 'currentColor' }: SpinnerProps) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n style={{\n animation: 'gotcha-spin 0.8s linear infinite',\n }}\n >\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke={color}\n strokeWidth=\"2\"\n strokeOpacity=\"0.12\"\n />\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke={color}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n style={{\n animation: 'gotcha-dash 1.2s ease-in-out infinite',\n }}\n />\n </svg>\n );\n}\n","import React from 'react';\nimport { ResolvedTheme } from '../theme/tokens';\n\ninterface ScreenshotPreviewProps {\n src: string;\n onRemove: () => void;\n resolvedTheme: ResolvedTheme;\n}\n\nexport function ScreenshotPreview({ src, onRemove, resolvedTheme: t }: ScreenshotPreviewProps) {\n return (\n <div style={{\n position: 'relative',\n marginTop: 10,\n borderRadius: t.borders.radius.md,\n overflow: 'hidden',\n border: `1px solid ${t.colors.border}`,\n }}>\n <img\n src={src}\n alt=\"Screenshot\"\n style={{\n display: 'block',\n width: '100%',\n maxHeight: 120,\n objectFit: 'cover',\n }}\n />\n <button\n type=\"button\"\n onClick={onRemove}\n aria-label=\"Remove screenshot\"\n style={{\n position: 'absolute',\n top: 4,\n right: 4,\n width: 22,\n height: 22,\n borderRadius: '50%',\n border: 'none',\n backgroundColor: 'rgba(0,0,0,0.6)',\n color: '#fff',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: 12,\n lineHeight: 1,\n }}\n >\n <svg width={10} height={10} viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M1 1L13 13M1 13L13 1\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n </svg>\n </button>\n </div>\n );\n}\n","import React, { useState, useEffect, useRef } from 'react';\nimport { GotchaStyles } from '../../types';\nimport { ResolvedTheme } from '../../theme/tokens';\nimport { isTouchDevice } from '../../utils/device';\nimport { Spinner } from '../Spinner';\nimport { ScreenshotPreview } from '../ScreenshotPreview';\n\ninterface FeedbackModeProps {\n resolvedTheme: ResolvedTheme;\n placeholder?: string;\n submitText: string;\n isLoading: boolean;\n onSubmit: (data: { content?: string; rating?: number; isBug?: boolean; screenshot?: string }) => void;\n customStyles?: GotchaStyles;\n initialValues?: {\n content?: string | null;\n rating?: number | null;\n };\n isEditing?: boolean;\n showText?: boolean;\n showRating?: boolean;\n enableBugFlag?: boolean;\n bugFlagLabel?: string;\n enableScreenshot?: boolean;\n}\n\nexport function FeedbackMode({\n resolvedTheme: t,\n placeholder,\n submitText,\n isLoading,\n onSubmit,\n customStyles,\n initialValues,\n isEditing = false,\n showText = true,\n showRating = true,\n enableBugFlag = false,\n bugFlagLabel,\n enableScreenshot = false,\n}: FeedbackModeProps) {\n const [content, setContent] = useState(initialValues?.content || '');\n const [rating, setRating] = useState<number | null>(initialValues?.rating ?? null);\n const [isBug, setIsBug] = useState(false);\n const [isTouch, setIsTouch] = useState(false);\n const [screenshot, setScreenshot] = useState<string | null>(null);\n const [capturingScreenshot, setCapturingScreenshot] = useState(false);\n\n useEffect(() => {\n setIsTouch(isTouchDevice());\n }, []);\n\n useEffect(() => {\n if (initialValues?.content !== undefined) {\n setContent(initialValues.content || '');\n }\n if (initialValues?.rating !== undefined) {\n setRating(initialValues.rating ?? null);\n }\n }, [initialValues?.content, initialValues?.rating]);\n\n const canSubmit = (() => {\n if (showText && showRating) return content.trim().length > 0 || rating !== null;\n if (showText) return content.trim().length > 0;\n if (showRating) return rating !== null;\n return false;\n })();\n\n const handleScreenshotCapture = async () => {\n setCapturingScreenshot(true);\n try {\n const { captureScreenshot } = await import('../../utils/screenshot');\n const result = await captureScreenshot();\n if (result) setScreenshot(result);\n } catch {\n // Capture failed silently\n } finally {\n setCapturingScreenshot(false);\n }\n };\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n if (!canSubmit) return;\n onSubmit({\n content: showText && content.trim() ? content.trim() : undefined,\n rating: showRating && rating !== null ? rating : undefined,\n isBug: isBug || undefined,\n screenshot: screenshot || undefined,\n });\n };\n\n const inputStyles: React.CSSProperties = {\n width: '100%',\n padding: isTouch ? '12px 14px' : '10px 12px',\n border: `1px solid ${t.colors.inputBorder}`,\n borderRadius: t.borders.radius.md,\n backgroundColor: t.colors.inputBackground,\n color: t.colors.text,\n fontSize: isTouch ? t.typography.fontSize.lg : t.typography.fontSize.md,\n resize: 'none',\n minHeight: isTouch ? 100 : 80,\n fontFamily: t.typography.fontFamily,\n outline: 'none',\n transition: `border-color ${t.animation.duration.fast} ${t.animation.easing.default}, box-shadow ${t.animation.duration.fast} ${t.animation.easing.default}`,\n lineHeight: 1.5,\n boxShadow: `inset 0 1px 2px rgba(0,0,0,0.04)`,\n ...customStyles?.input,\n };\n\n const buttonStyles: React.CSSProperties = {\n width: '100%',\n padding: isTouch ? '14px 16px' : '10px 16px',\n border: t.colors.buttonBorder,\n borderRadius: t.borders.radius.md,\n backgroundColor: t.colors.buttonBackground,\n color: t.colors.buttonColor,\n fontSize: isTouch ? t.typography.fontSize.lg : t.typography.fontSize.md,\n fontWeight: t.typography.fontWeight.medium,\n fontFamily: t.typography.fontFamily,\n cursor: isLoading ? 'not-allowed' : 'pointer',\n transition: `all ${t.animation.duration.fast} ${t.animation.easing.default}`,\n letterSpacing: '0.01em',\n ...customStyles?.submitButton,\n };\n\n return (\n <form onSubmit={handleSubmit}>\n {/* Rating */}\n {showRating && (\n <div style={{\n marginBottom: showText ? (isTouch ? 16 : 12) : 0,\n ...(!showText ? { display: 'flex', justifyContent: 'center', padding: '8px 0' } : {}),\n }}>\n <StarRating value={rating} onChange={setRating} theme={t} isTouch={isTouch} large={!showText} />\n </div>\n )}\n\n {/* Text input */}\n {showText && (\n <textarea\n value={content}\n onChange={(e) => setContent(e.target.value)}\n placeholder={placeholder || 'Share your thoughts...'}\n maxLength={5000}\n style={inputStyles}\n disabled={isLoading}\n aria-label=\"Your feedback\"\n onFocus={(e) => {\n e.currentTarget.style.borderColor = t.colors.inputBorderFocus;\n e.currentTarget.style.boxShadow = `0 0 0 3px ${t.colors.inputFocusRing}`;\n e.currentTarget.style.backgroundColor = t.colors.inputBackgroundFocus;\n }}\n onBlur={(e) => {\n e.currentTarget.style.borderColor = t.colors.inputBorder;\n e.currentTarget.style.boxShadow = 'inset 0 1px 2px rgba(0,0,0,0.04)';\n e.currentTarget.style.backgroundColor = t.colors.inputBackground;\n }}\n />\n )}\n\n {/* Bug flag toggle */}\n {enableBugFlag && (\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={isBug}\n onClick={() => setIsBug(!isBug)}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 7,\n width: '100%',\n marginTop: 10,\n padding: '7px 10px',\n border: `1px solid ${\n isBug ? t.colors.warningBorder : t.colors.border\n }`,\n borderRadius: 7,\n backgroundColor: isBug ? t.colors.warningSurface : 'transparent',\n cursor: 'pointer',\n transition: `all ${t.animation.duration.fast} ${t.animation.easing.default}`,\n fontFamily: t.typography.fontFamily,\n ...customStyles?.bugFlag,\n }}\n onMouseEnter={(e) => {\n if (!isBug) {\n e.currentTarget.style.backgroundColor = t.colors.surfaceHover === t.colors.inputBackgroundFocus\n ? 'rgba(0,0,0,0.02)' : t.colors.surfaceHover;\n }\n }}\n onMouseLeave={(e) => {\n if (!isBug) {\n e.currentTarget.style.backgroundColor = 'transparent';\n }\n }}\n >\n <svg\n width={14}\n height={14}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke={isBug ? t.colors.warningActive : t.colors.textDisabled}\n strokeWidth={1.75}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={{ flexShrink: 0, transition: `stroke ${t.animation.duration.fast}` }}\n >\n <path d=\"M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126zM12 15.75h.007v.008H12v-.008z\" />\n </svg>\n <span\n style={{\n fontSize: 12,\n fontWeight: isBug ? t.typography.fontWeight.medium : t.typography.fontWeight.normal,\n color: isBug ? t.colors.warningActive : t.colors.textDisabled,\n transition: `color ${t.animation.duration.fast}`,\n letterSpacing: '0.01em',\n }}\n >\n {isBug ? 'Issue reported' : (bugFlagLabel || 'Report an issue')}\n </span>\n <div\n style={{\n marginLeft: 'auto',\n width: 28,\n height: 16,\n borderRadius: 8,\n backgroundColor: isBug ? t.colors.warning : t.colors.border,\n position: 'relative',\n transition: `background-color ${t.animation.duration.fast} ${t.animation.easing.default}`,\n flexShrink: 0,\n }}\n >\n <div\n style={{\n position: 'absolute',\n top: 2,\n left: isBug ? 14 : 2,\n width: 12,\n height: 12,\n borderRadius: '50%',\n backgroundColor: isBug ? '#ffffff' : t.colors.textDisabled,\n transition: `left ${t.animation.duration.fast} ${t.animation.easing.default}, background-color ${t.animation.duration.fast}`,\n boxShadow: '0 1px 2px rgba(0,0,0,0.15)',\n }}\n />\n </div>\n </button>\n )}\n\n {/* Screenshot capture — shown when bug flag is active */}\n {enableBugFlag && enableScreenshot && isBug && !screenshot && (\n <button\n type=\"button\"\n onClick={handleScreenshotCapture}\n disabled={capturingScreenshot}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n width: '100%',\n marginTop: 8,\n padding: '7px 10px',\n border: `1px solid ${t.colors.border}`,\n borderRadius: 7,\n backgroundColor: 'transparent',\n cursor: capturingScreenshot ? 'not-allowed' : 'pointer',\n fontFamily: t.typography.fontFamily,\n fontSize: 12,\n color: t.colors.textSecondary,\n transition: `all ${t.animation.duration.fast} ${t.animation.easing.default}`,\n }}\n onMouseEnter={(e) => { e.currentTarget.style.backgroundColor = t.colors.surfaceHover; }}\n onMouseLeave={(e) => { e.currentTarget.style.backgroundColor = 'transparent'; }}\n >\n {capturingScreenshot ? (\n <Spinner size={14} color={t.colors.textSecondary} />\n ) : (\n <svg width={14} height={14} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={1.75} strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"2\" y=\"3\" width=\"20\" height=\"14\" rx=\"2\" />\n <circle cx=\"12\" cy=\"10\" r=\"3\" />\n <path d=\"M2 17l4-4 3 3 4-4 9 9\" />\n </svg>\n )}\n {capturingScreenshot ? 'Capturing...' : 'Capture screenshot'}\n </button>\n )}\n\n {/* Screenshot preview */}\n {enableBugFlag && enableScreenshot && isBug && screenshot && (\n <ScreenshotPreview\n src={screenshot}\n onRemove={() => setScreenshot(null)}\n resolvedTheme={t}\n />\n )}\n\n {/* Submit button */}\n <button\n type=\"submit\"\n disabled={isLoading || !canSubmit}\n style={{\n ...buttonStyles,\n marginTop: 12,\n opacity: isLoading ? 0.8 : 1,\n backgroundColor: !canSubmit ? t.colors.buttonBackgroundDisabled : t.colors.buttonBackground,\n color: !canSubmit ? t.colors.buttonColorDisabled : t.colors.buttonColor,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 8,\n ...(isLoading ? {\n backgroundImage: `linear-gradient(90deg, transparent 0%, rgba(255,255,255,0.1) 50%, transparent 100%)`,\n backgroundSize: '200% 100%',\n animation: 'gotcha-shimmer 1.5s ease infinite',\n } : {}),\n }}\n onMouseEnter={(e) => {\n if (!e.currentTarget.disabled) {\n e.currentTarget.style.backgroundColor = t.colors.buttonBackgroundHover;\n e.currentTarget.style.transform = 'translateY(-1px)';\n e.currentTarget.style.boxShadow = t.shadows.button;\n }\n }}\n onMouseLeave={(e) => {\n if (!e.currentTarget.disabled) {\n e.currentTarget.style.backgroundColor = t.colors.buttonBackground;\n e.currentTarget.style.transform = 'translateY(0)';\n e.currentTarget.style.boxShadow = 'none';\n }\n }}\n >\n {isLoading && <Spinner size={isTouch ? 18 : 16} color={t.colors.buttonColor} />}\n {isLoading ? (isEditing ? 'Updating...' : 'Submitting...') : (isEditing ? 'Update' : submitText)}\n </button>\n </form>\n );\n}\n\ninterface StarRatingProps {\n value: number | null;\n onChange: (rating: number) => void;\n theme: ResolvedTheme;\n isTouch: boolean;\n large?: boolean;\n}\n\nfunction StarRating({ value, onChange, theme: t, isTouch, large = false }: StarRatingProps) {\n const [hovered, setHovered] = useState<number | null>(null);\n const [pulsing, setPulsing] = useState<number | null>(null);\n const pulseTimerRef = useRef<ReturnType<typeof setTimeout>>();\n const starSize = large ? (isTouch ? 36 : 28) : (isTouch ? 28 : 18);\n const buttonPadding = large ? (isTouch ? 8 : 5) : (isTouch ? 8 : 3);\n\n useEffect(() => {\n return () => { clearTimeout(pulseTimerRef.current); };\n }, []);\n\n const handleClick = (star: number) => {\n setPulsing(star);\n onChange(star);\n clearTimeout(pulseTimerRef.current);\n pulseTimerRef.current = setTimeout(() => setPulsing(null), 300);\n };\n\n return (\n <div\n style={{\n display: 'flex',\n gap: large ? (isTouch ? 8 : 6) : (isTouch ? 6 : 2),\n }}\n role=\"group\"\n aria-label=\"Rating\"\n >\n {[1, 2, 3, 4, 5].map((star) => {\n const isFilled = (hovered ?? value ?? 0) >= star;\n return (\n <button\n key={star}\n type=\"button\"\n onClick={() => handleClick(star)}\n onMouseEnter={() => setHovered(star)}\n onMouseLeave={() => setHovered(null)}\n aria-label={`Rate ${star} out of 5`}\n aria-pressed={value === star}\n style={{\n background: 'none',\n border: 'none',\n cursor: 'pointer',\n padding: buttonPadding,\n color: isFilled ? t.colors.starFilled : t.colors.starEmpty,\n transition: `color 0.15s ${t.animation.easing.default}`,\n transform: pulsing === star ? 'scale(1)' : ((hovered !== null && hovered >= star) ? 'scale(1.1)' : 'scale(1)'),\n animation: pulsing === star ? `gotcha-star-pulse 0.3s ${t.animation.easing.spring}` : 'none',\n filter: isFilled ? `drop-shadow(0 0 3px ${t.colors.starFilled}40)` : 'none',\n transitionDelay: `${(star - 1) * 30}ms`,\n }}\n >\n <svg width={starSize} height={starSize} viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z\" />\n </svg>\n </button>\n );\n })}\n </div>\n );\n}\n","import React, { useEffect, useState } from 'react';\nimport { ResolvedTheme } from '../../theme/tokens';\nimport { isTouchDevice } from '../../utils/device';\nimport { Spinner } from '../Spinner';\n\ninterface VoteModeProps {\n resolvedTheme: ResolvedTheme;\n isLoading: boolean;\n onSubmit: (data: { vote: 'up' | 'down' }) => void;\n initialVote?: 'up' | 'down' | null;\n isEditing?: boolean;\n labels?: { up: string; down: string };\n}\n\nexport function VoteMode({ resolvedTheme: t, isLoading, onSubmit, initialVote, isEditing = false, labels }: VoteModeProps) {\n const [isTouch, setIsTouch] = useState(false);\n const [activeVote, setActiveVote] = useState<'up' | 'down' | null>(initialVote || null);\n const [previousVote, setPreviousVote] = useState<'up' | 'down' | null>(initialVote || null);\n\n useEffect(() => {\n setIsTouch(isTouchDevice());\n }, []);\n\n useEffect(() => {\n if (initialVote !== undefined) {\n setPreviousVote(initialVote);\n setActiveVote(initialVote);\n }\n }, [initialVote]);\n\n useEffect(() => {\n if (!isLoading && !isEditing) {\n setActiveVote(null);\n }\n }, [isLoading, isEditing]);\n\n const handleVote = (vote: 'up' | 'down') => {\n setActiveVote(vote);\n onSubmit({ vote });\n };\n\n const getButtonStyles = (voteType: 'up' | 'down'): React.CSSProperties => {\n const isSelected = previousVote === voteType;\n const color = voteType === 'up' ? t.colors.voteUp : t.colors.voteDown;\n const surface = voteType === 'up' ? t.colors.voteUpSurface : t.colors.voteDownSurface;\n const border = voteType === 'up' ? t.colors.voteUpBorder : t.colors.voteDownBorder;\n\n return {\n flex: 1,\n minWidth: 0,\n overflow: 'hidden' as const,\n padding: isTouch ? '14px 18px' : '10px 14px',\n border: isSelected\n ? `2px solid ${border}`\n : `1px solid ${t.colors.border}`,\n borderRadius: t.borders.radius.lg - 2,\n background: isSelected\n ? `linear-gradient(135deg, ${surface}, ${surface})`\n : t.colors.surface,\n color: isSelected ? color : t.colors.textSecondary,\n fontSize: isTouch ? 28 : 24,\n fontFamily: t.typography.fontFamily,\n cursor: isLoading ? 'not-allowed' : 'pointer',\n transition: `all 0.2s ${t.animation.easing.default}`,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: isTouch ? 10 : 8,\n };\n };\n\n const iconSize = isTouch ? 24 : 20;\n\n return (\n <div\n style={{\n display: 'flex',\n gap: isTouch ? 12 : 10,\n }}\n role=\"group\"\n aria-label=\"Vote\"\n >\n <button\n type=\"button\"\n onClick={() => handleVote('up')}\n disabled={isLoading}\n style={getButtonStyles('up')}\n aria-label=\"Vote up - I like this\"\n aria-pressed={previousVote === 'up'}\n onMouseEnter={(e) => {\n if (!isLoading) {\n e.currentTarget.style.transform = 'translateY(-2px) scale(1.02)';\n e.currentTarget.style.boxShadow = t.shadows.button;\n }\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.transform = 'translateY(0) scale(1)';\n e.currentTarget.style.boxShadow = 'none';\n }}\n >\n {isLoading && activeVote === 'up' ? (\n <>\n <Spinner size={iconSize} color={t.colors.text} />\n <span style={{ fontSize: isTouch ? 15 : 13, fontWeight: t.typography.fontWeight.medium, letterSpacing: '0.01em' }}>\n {isEditing ? 'Updating...' : 'Sending...'}\n </span>\n </>\n ) : (\n <>\n <ThumbsUpIcon size={iconSize} />\n <span style={{ fontSize: isTouch ? 15 : 13, fontWeight: t.typography.fontWeight.medium, letterSpacing: '0.01em' }}>\n {labels?.up || (previousVote === 'up' ? 'Liked' : 'Like')}\n </span>\n </>\n )}\n </button>\n\n <button\n type=\"button\"\n onClick={() => handleVote('down')}\n disabled={isLoading}\n style={getButtonStyles('down')}\n aria-label=\"Vote down - I don't like this\"\n aria-pressed={previousVote === 'down'}\n onMouseEnter={(e) => {\n if (!isLoading) {\n e.currentTarget.style.transform = 'translateY(-2px) scale(1.02)';\n e.currentTarget.style.boxShadow = t.shadows.button;\n }\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.transform = 'translateY(0) scale(1)';\n e.currentTarget.style.boxShadow = 'none';\n }}\n >\n {isLoading && activeVote === 'down' ? (\n <>\n <Spinner size={iconSize} color={t.colors.text} />\n <span style={{ fontSize: isTouch ? 15 : 13, fontWeight: t.typography.fontWeight.medium, letterSpacing: '0.01em' }}>\n {isEditing ? 'Updating...' : 'Sending...'}\n </span>\n </>\n ) : (\n <>\n <ThumbsDownIcon size={iconSize} />\n <span style={{ fontSize: isTouch ? 15 : 13, fontWeight: t.typography.fontWeight.medium, letterSpacing: '0.01em' }}>\n {labels?.down || (previousVote === 'down' ? 'Disliked' : 'Dislike')}\n </span>\n </>\n )}\n </button>\n </div>\n );\n}\n\nfunction ThumbsUpIcon({ size = 24 }: { size?: number }) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.75\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3\" />\n </svg>\n );\n}\n\nfunction ThumbsDownIcon({ size = 24 }: { size?: number }) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.75\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17\" />\n </svg>\n );\n}\n","import React, { useState, useEffect } from 'react';\nimport { ResolvedTheme } from '../../theme/tokens';\nimport { isTouchDevice } from '../../utils/device';\nimport { Spinner } from '../Spinner';\n\ninterface PollModeProps {\n resolvedTheme: ResolvedTheme;\n options: string[];\n allowMultiple: boolean;\n isLoading: boolean;\n onSubmit: (data: { pollSelected: string[] }) => void;\n initialSelected?: string[] | null;\n isEditing?: boolean;\n}\n\nexport function PollMode({\n resolvedTheme: t,\n options,\n allowMultiple,\n isLoading,\n onSubmit,\n initialSelected,\n isEditing = false,\n}: PollModeProps) {\n const [selected, setSelected] = useState<string[]>(initialSelected || []);\n const [isTouch, setIsTouch] = useState(false);\n\n useEffect(() => {\n setIsTouch(isTouchDevice());\n }, []);\n\n useEffect(() => {\n if (initialSelected) {\n setSelected(initialSelected);\n }\n }, [initialSelected]);\n\n const handleToggle = (option: string) => {\n if (allowMultiple) {\n setSelected((prev) =>\n prev.includes(option) ? prev.filter((o) => o !== option) : [...prev, option]\n );\n } else {\n setSelected((prev) => (prev.includes(option) ? [] : [option]));\n }\n };\n\n const handleSubmit = () => {\n if (selected.length === 0) return;\n onSubmit({ pollSelected: selected });\n };\n\n const getOptionStyles = (option: string, index: number): React.CSSProperties => {\n const isSelected = selected.includes(option);\n return {\n width: '100%',\n padding: isTouch ? '12px 14px' : '9px 12px',\n border: `1px solid ${isSelected ? t.colors.pollSelectedBorder : t.colors.pollBorder}`,\n borderRadius: t.borders.radius.lg - 2,\n backgroundColor: isSelected ? t.colors.pollSelectedBackground : t.colors.pollBackground,\n color: isSelected ? t.colors.pollSelectedColor : t.colors.pollColor,\n fontSize: isTouch ? 15 : t.typography.fontSize.sm,\n fontWeight: isSelected ? t.typography.fontWeight.semibold : t.typography.fontWeight.medium,\n fontFamily: t.typography.fontFamily,\n cursor: isLoading ? 'not-allowed' : 'pointer',\n transition: `all 0.2s ${t.animation.easing.default}`,\n textAlign: 'left' as const,\n letterSpacing: '0.01em',\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n animation: `gotcha-fade-up ${t.animation.duration.normal} ${t.animation.easing.default} both`,\n animationDelay: `${index * 0.05}s`,\n };\n };\n\n return (\n <div>\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n gap: isTouch ? 8 : 6,\n }}\n role=\"group\"\n aria-label={allowMultiple ? 'Select one or more options' : 'Select an option'}\n >\n {options.map((option, index) => {\n const isSelected = selected.includes(option);\n return (\n <button\n key={option}\n type=\"button\"\n onClick={() => handleToggle(option)}\n disabled={isLoading}\n style={getOptionStyles(option, index)}\n aria-pressed={isSelected}\n onMouseEnter={(e) => {\n if (!isLoading) {\n e.currentTarget.style.transform = 'translateX(2px)';\n }\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.transform = 'translateX(0)';\n }}\n >\n <span\n style={{\n width: 16,\n height: 16,\n borderRadius: allowMultiple ? 4 : '50%',\n border: `2px solid ${isSelected ? t.colors.pollCheckSelectedBorder : t.colors.pollCheckBorder}`,\n backgroundColor: isSelected ? t.colors.pollCheckSelectedBg : 'transparent',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n transition: `all ${t.animation.duration.fast}`,\n }}\n >\n {isSelected && (\n <svg width={10} height={10} viewBox=\"0 0 12 12\" fill=\"none\">\n <path\n d=\"M2 6l3 3 5-5\"\n stroke=\"#fff\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )}\n </span>\n {option}\n </button>\n );\n })}\n </div>\n\n <button\n type=\"button\"\n onClick={handleSubmit}\n disabled={isLoading || selected.length === 0}\n style={{\n width: '100%',\n marginTop: 12,\n padding: isTouch ? '14px 16px' : '10px 16px',\n border: t.colors.buttonBorder,\n borderRadius: t.borders.radius.md,\n backgroundColor: selected.length === 0 ? t.colors.buttonBackgroundDisabled : t.colors.buttonBackground,\n color: selected.length === 0 ? t.colors.buttonColorDisabled : t.colors.buttonColor,\n fontSize: isTouch ? t.typography.fontSize.lg : t.typography.fontSize.md,\n fontWeight: t.typography.fontWeight.medium,\n fontFamily: t.typography.fontFamily,\n cursor: isLoading || selected.length === 0 ? 'not-allowed' : 'pointer',\n transition: `all ${t.animation.duration.fast} ${t.animation.easing.default}`,\n letterSpacing: '0.01em',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 8,\n opacity: isLoading ? 0.8 : 1,\n ...(isLoading ? {\n backgroundImage: `linear-gradient(90deg, transparent 0%, rgba(255,255,255,0.1) 50%, transparent 100%)`,\n backgroundSize: '200% 100%',\n animation: 'gotcha-shimmer 1.5s ease infinite',\n } : {}),\n }}\n onMouseEnter={(e) => {\n if (!e.currentTarget.disabled) {\n e.currentTarget.style.backgroundColor = t.colors.buttonBackgroundHover;\n e.currentTarget.style.transform = 'translateY(-1px)';\n e.currentTarget.style.boxShadow = t.shadows.button;\n }\n }}\n onMouseLeave={(e) => {\n if (!e.currentTarget.disabled) {\n e.currentTarget.style.backgroundColor = selected.length === 0\n ? t.colors.buttonBackgroundDisabled\n : t.colors.buttonBackground;\n e.currentTarget.style.transform = 'translateY(0)';\n e.currentTarget.style.boxShadow = 'none';\n }\n }}\n >\n {isLoading && <Spinner size={isTouch ? 18 : 16} color={t.colors.buttonColor} />}\n {isLoading ? (isEditing ? 'Updating...' : 'Submitting...') : (isEditing ? 'Update' : 'Submit')}\n </button>\n </div>\n );\n}\n","import React, { useState, useEffect } from 'react';\nimport { GotchaStyles } from '../../types';\nimport { ResolvedTheme } from '../../theme/tokens';\nimport { isTouchDevice } from '../../utils/device';\nimport { Spinner } from '../Spinner';\n\ninterface NpsModeProps {\n resolvedTheme: ResolvedTheme;\n submitText: string;\n isLoading: boolean;\n onSubmit: (data: { rating?: number; content?: string }) => void;\n customStyles?: GotchaStyles;\n showFollowUp?: boolean;\n followUpPlaceholder?: string;\n lowLabel?: string;\n highLabel?: string;\n initialValues?: {\n rating?: number | null;\n content?: string | null;\n };\n isEditing?: boolean;\n}\n\nexport function NpsMode({\n resolvedTheme: t,\n submitText,\n isLoading,\n onSubmit,\n customStyles,\n showFollowUp = true,\n followUpPlaceholder,\n lowLabel = 'Not likely',\n highLabel = 'Very likely',\n initialValues,\n isEditing = false,\n}: NpsModeProps) {\n const [score, setScore] = useState<number | null>(initialValues?.rating ?? null);\n const [content, setContent] = useState(initialValues?.content || '');\n const [isTouch, setIsTouch] = useState(false);\n const [hoveredScore, setHoveredScore] = useState<number | null>(null);\n\n useEffect(() => {\n setIsTouch(isTouchDevice());\n }, []);\n\n useEffect(() => {\n if (initialValues?.rating !== undefined) {\n setScore(initialValues.rating ?? null);\n }\n if (initialValues?.content !== undefined) {\n setContent(initialValues.content || '');\n }\n }, [initialValues?.rating, initialValues?.content]);\n\n const canSubmit = score !== null;\n const npsColors = t.colors.npsColors;\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n if (!canSubmit) return;\n onSubmit({\n rating: score ?? undefined,\n content: showFollowUp && content.trim() ? content.trim() : undefined,\n });\n };\n\n return (\n <form onSubmit={handleSubmit}>\n {/* Score scale */}\n <div>\n {/* Number buttons — always single row */}\n <div\n style={{\n display: 'flex',\n gap: isTouch ? 4 : 6,\n justifyContent: 'center',\n }}\n role=\"group\"\n aria-label=\"NPS Score\"\n >\n {Array.from({ length: 11 }, (_, i) => {\n const selected = score === i;\n const hovered = hoveredScore === i;\n const color = npsColors[i];\n\n return (\n <button\n key={i}\n type=\"button\"\n onClick={() => setScore(i)}\n onMouseEnter={() => setHoveredScore(i)}\n onMouseLeave={() => setHoveredScore(null)}\n aria-label={`Score ${i} out of 10`}\n aria-pressed={selected}\n style={{\n flex: 1,\n minWidth: 0,\n height: isTouch ? 34 : 32,\n borderRadius: t.borders.radius.sm,\n border: selected\n ? `2px solid ${color}`\n : `1.5px solid ${color}25`,\n backgroundColor: selected\n ? color\n : hovered\n ? `${color}25`\n : `${color}0c`,\n color: selected\n ? '#fff'\n : hovered\n ? color\n : `${color}bb`,\n fontSize: 12,\n fontWeight: selected ? t.typography.fontWeight.bold : t.typography.fontWeight.semibold,\n fontFamily: t.typography.fontFamily,\n fontVariantNumeric: 'tabular-nums',\n cursor: 'pointer',\n padding: 0,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n transition: `all 0.2s ${t.animation.easing.spring}`,\n transform: selected ? 'scale(1.08)' : hovered ? 'scale(1.04)' : 'scale(1)',\n boxShadow: selected\n ? `0 0 12px ${color}40`\n : 'none',\n ...customStyles?.npsButton,\n ...(selected ? customStyles?.npsButtonSelected : {}),\n }}\n >\n {i}\n </button>\n );\n })}\n </div>\n\n {/* Labels */}\n <div\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n marginTop: 6,\n padding: '0 2px',\n ...customStyles?.npsLabels,\n }}\n >\n <span style={{\n fontSize: t.typography.fontSize.xs,\n color: t.colors.textDisabled,\n fontWeight: t.typography.fontWeight.medium,\n letterSpacing: '0.02em',\n }}>\n {lowLabel}\n </span>\n <span style={{\n fontSize: t.typography.fontSize.xs,\n color: t.colors.textDisabled,\n fontWeight: t.typography.fontWeight.medium,\n letterSpacing: '0.02em',\n }}>\n {highLabel}\n </span>\n </div>\n </div>\n\n {/* Follow-up textarea — animated reveal */}\n {showFollowUp && score !== null && (\n <textarea\n value={content}\n onChange={(e) => setContent(e.target.value)}\n placeholder={followUpPlaceholder || 'What\\'s the main reason for your score?'}\n maxLength={5000}\n style={{\n width: '100%',\n padding: isTouch ? '12px 14px' : '10px 12px',\n border: `1px solid ${t.colors.inputBorder}`,\n borderRadius: t.borders.radius.md,\n backgroundColor: t.colors.inputBackground,\n color: t.colors.text,\n fontSize: isTouch ? t.typography.fontSize.lg : t.typography.fontSize.md,\n resize: 'vertical' as const,\n minHeight: isTouch ? 80 : 60,\n fontFamily: t.typography.fontFamily,\n outline: 'none',\n transition: `border-color ${t.animation.duration.fast} ${t.animation.easing.default}, box-shadow ${t.animation.duration.fast} ${t.animation.easing.default}`,\n lineHeight: 1.5,\n animation: `gotcha-expand-in 0.3s ${t.animation.easing.default} both`,\n overflow: 'hidden',\n ...customStyles?.input,\n }}\n disabled={isLoading}\n aria-label=\"Follow-up feedback\"\n onFocus={(e) => {\n e.currentTarget.style.borderColor = t.colors.inputBorderFocus;\n e.currentTarget.style.boxShadow = `0 0 0 3px ${t.colors.inputFocusRing}`;\n e.currentTarget.style.backgroundColor = t.colors.inputBackgroundFocus;\n }}\n onBlur={(e) => {\n e.currentTarget.style.borderColor = t.colors.inputBorder;\n e.currentTarget.style.boxShadow = 'none';\n e.currentTarget.style.backgroundColor = t.colors.inputBackground;\n }}\n />\n )}\n\n {/* Submit button */}\n <button\n type=\"submit\"\n disabled={isLoading || !canSubmit}\n style={{\n width: '100%',\n padding: isTouch ? '14px 16px' : '10px 16px',\n border: t.colors.buttonBorder,\n borderRadius: t.borders.radius.md,\n backgroundColor: !canSubmit ? t.colors.buttonBackgroundDisabled : t.colors.buttonBackground,\n color: !canSubmit ? t.colors.buttonColorDisabled : t.colors.buttonColor,\n fontSize: isTouch ? t.typography.fontSize.lg : t.typography.fontSize.md,\n fontWeight: t.typography.fontWeight.medium,\n fontFamily: t.typography.fontFamily,\n cursor: isLoading ? 'not-allowed' : 'pointer',\n transition: `all ${t.animation.duration.fast} ${t.animation.easing.default}`,\n letterSpacing: '0.01em',\n opacity: isLoading ? 0.8 : 1,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 8,\n marginTop: 12,\n ...(isLoading ? {\n backgroundImage: `linear-gradient(90deg, transparent 0%, rgba(255,255,255,0.1) 50%, transparent 100%)`,\n backgroundSize: '200% 100%',\n animation: 'gotcha-shimmer 1.5s ease infinite',\n } : {}),\n ...customStyles?.submitButton,\n }}\n onMouseEnter={(e) => {\n if (!e.currentTarget.disabled) {\n e.currentTarget.style.backgroundColor = t.colors.buttonBackgroundHover;\n e.currentTarget.style.transform = 'translateY(-1px)';\n e.currentTarget.style.boxShadow = t.shadows.button;\n }\n }}\n onMouseLeave={(e) => {\n if (!e.currentTarget.disabled) {\n e.currentTarget.style.backgroundColor = !canSubmit ? t.colors.buttonBackgroundDisabled : t.colors.buttonBackground;\n e.currentTarget.style.transform = 'translateY(0)';\n e.currentTarget.style.boxShadow = 'none';\n }\n }}\n >\n {isLoading && <Spinner size={isTouch ? 18 : 16} color={t.colors.buttonColor} />}\n {isLoading ? (isEditing ? 'Updating...' : 'Submitting...') : (isEditing ? 'Update' : submitText)}\n </button>\n </form>\n );\n}\n","import React, { useState, useEffect } from 'react';\nimport { ResolvedTheme } from '../theme/tokens';\nimport { isTouchDevice } from '../utils/device';\nimport { Spinner } from './Spinner';\n\ninterface FollowUpPromptProps {\n resolvedTheme: ResolvedTheme;\n promptText: string;\n placeholder?: string;\n isLoading: boolean;\n onSubmit: (content: string) => void;\n}\n\nexport function FollowUpPrompt({\n resolvedTheme: t,\n promptText,\n placeholder,\n isLoading,\n onSubmit,\n}: FollowUpPromptProps) {\n const [content, setContent] = useState('');\n const [isTouch, setIsTouch] = useState(false);\n\n useEffect(() => {\n setIsTouch(isTouchDevice());\n }, []);\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n if (!content.trim()) return;\n onSubmit(content.trim());\n };\n\n return (\n <form onSubmit={handleSubmit}>\n <p style={{\n margin: '0 0 12px 0',\n fontSize: t.typography.fontSize.sm,\n color: t.colors.textSecondary,\n lineHeight: 1.4,\n fontFamily: t.typography.fontFamily,\n }}>\n {promptText}\n </p>\n\n <textarea\n value={content}\n onChange={(e) => setContent(e.target.value)}\n placeholder={placeholder || 'Tell us more...'}\n maxLength={5000}\n disabled={isLoading}\n aria-label=\"Follow-up feedback\"\n style={{\n width: '100%',\n padding: isTouch ? '12px 14px' : '10px 12px',\n border: `1px solid ${t.colors.inputBorder}`,\n borderRadius: t.borders.radius.md,\n backgroundColor: t.colors.inputBackground,\n color: t.colors.text,\n fontSize: isTouch ? t.typography.fontSize.lg : t.typography.fontSize.md,\n resize: 'none',\n minHeight: isTouch ? 100 : 80,\n fontFamily: t.typography.fontFamily,\n outline: 'none',\n transition: `border-color ${t.animation.duration.fast} ${t.animation.easing.default}, box-shadow ${t.animation.duration.fast} ${t.animation.easing.default}`,\n lineHeight: 1.5,\n boxShadow: 'inset 0 1px 2px rgba(0,0,0,0.04)',\n }}\n onFocus={(e) => {\n e.currentTarget.style.borderColor = t.colors.inputBorderFocus;\n e.currentTarget.style.boxShadow = `0 0 0 3px ${t.colors.inputFocusRing}`;\n e.currentTarget.style.backgroundColor = t.colors.inputBackgroundFocus;\n }}\n onBlur={(e) => {\n e.currentTarget.style.borderColor = t.colors.inputBorder;\n e.currentTarget.style.boxShadow = 'inset 0 1px 2px rgba(0,0,0,0.04)';\n e.currentTarget.style.backgroundColor = t.colors.inputBackground;\n }}\n />\n\n <button\n type=\"submit\"\n disabled={isLoading || !content.trim()}\n style={{\n width: '100%',\n marginTop: 12,\n padding: isTouch ? '14px 16px' : '10px 16px',\n border: t.colors.buttonBorder,\n borderRadius: t.borders.radius.md,\n backgroundColor: !content.trim() ? t.colors.buttonBackgroundDisabled : t.colors.buttonBackground,\n color: !content.trim() ? t.colors.buttonColorDisabled : t.colors.buttonColor,\n fontSize: isTouch ? t.typography.fontSize.lg : t.typography.fontSize.md,\n fontWeight: t.typography.fontWeight.medium,\n fontFamily: t.typography.fontFamily,\n cursor: isLoading ? 'not-allowed' : 'pointer',\n transition: `all ${t.animation.duration.fast} ${t.animation.easing.default}`,\n letterSpacing: '0.01em',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 8,\n opacity: isLoading ? 0.8 : 1,\n }}\n onMouseEnter={(e) => {\n if (!e.currentTarget.disabled) {\n e.currentTarget.style.backgroundColor = t.colors.buttonBackgroundHover;\n e.currentTarget.style.transform = 'translateY(-1px)';\n e.currentTarget.style.boxShadow = t.shadows.button;\n }\n }}\n onMouseLeave={(e) => {\n if (!e.currentTarget.disabled) {\n e.currentTarget.style.backgroundColor = t.colors.buttonBackground;\n e.currentTarget.style.transform = 'translateY(0)';\n e.currentTarget.style.boxShadow = 'none';\n }\n }}\n >\n {isLoading && <Spinner size={isTouch ? 18 : 16} color={t.colors.buttonColor} />}\n {isLoading ? 'Sending...' : 'Submit'}\n </button>\n </form>\n );\n}\n","import React, { useRef, useEffect, useState, useMemo } from 'react';\nimport { Theme, GotchaStyles, ResponseMode, ExistingResponse } from '../types';\nimport { ResolvedTheme } from '../theme/tokens';\nimport { resolveTheme } from '../theme/resolveTheme';\nimport { injectStyles } from '../theme/styles';\nimport { cn } from '../utils/cn';\nimport { useGotchaContext } from './GotchaProvider';\nimport { FeedbackMode } from './modes/FeedbackMode';\nimport { VoteMode } from './modes/VoteMode';\nimport { PollMode } from './modes/PollMode';\nimport { Spinner } from './Spinner';\nimport { NpsMode } from './modes/NpsMode';\nimport { FollowUpPrompt } from './FollowUpPrompt';\n\nexport interface GotchaModalProps {\n mode: ResponseMode;\n theme: Theme;\n customStyles?: GotchaStyles;\n promptText?: string;\n placeholder?: string;\n submitText: string;\n thankYouMessage: string;\n // State\n isLoading: boolean;\n isCheckingExisting?: boolean;\n isSubmitted: boolean;\n phase?: 'form' | 'followUp' | 'success';\n followUpConfig?: { promptText: string; placeholder?: string };\n followUpLoading?: boolean;\n onFollowUpSubmit?: (content: string) => void;\n error: string | null;\n // Edit mode\n existingResponse?: ExistingResponse | null;\n isEditing?: boolean;\n // Vote mode\n voteLabels?: { up: string; down: string };\n // Feedback mode field visibility\n showText?: boolean;\n showRating?: boolean;\n // Poll mode\n options?: string[];\n allowMultiple?: boolean;\n // NPS mode\n npsQuestion?: string;\n npsFollowUp?: boolean;\n npsFollowUpPlaceholder?: string;\n npsLowLabel?: string;\n npsHighLabel?: string;\n // Bug flagging\n enableBugFlag?: boolean;\n bugFlagLabel?: string;\n enableScreenshot?: boolean;\n // Handlers\n onSubmit: (data: { content?: string; rating?: number; vote?: 'up' | 'down'; pollSelected?: string[]; isBug?: boolean; screenshot?: string }) => void;\n onClose: () => void;\n // Position info from parent\n anchorRect?: DOMRect;\n /**\n * When true (desktop portal), use fixed positioning relative to the viewport\n * instead of absolute positioning relative to the container.\n */\n useFixedPosition?: boolean;\n}\n\nexport function GotchaModal({\n mode,\n theme,\n customStyles,\n promptText,\n placeholder,\n submitText,\n thankYouMessage,\n isLoading,\n isCheckingExisting = false,\n isSubmitted,\n phase = 'form',\n followUpConfig,\n followUpLoading = false,\n onFollowUpSubmit,\n error,\n existingResponse,\n isEditing = false,\n showText = true,\n showRating = true,\n voteLabels,\n options,\n allowMultiple = false,\n npsQuestion,\n npsFollowUp = true,\n npsFollowUpPlaceholder,\n npsLowLabel,\n npsHighLabel,\n enableBugFlag = false,\n bugFlagLabel,\n enableScreenshot = false,\n onSubmit,\n onClose,\n anchorRect,\n useFixedPosition = false,\n}: GotchaModalProps) {\n const modalRef = useRef<HTMLDivElement>(null);\n const firstFocusableRef = useRef<HTMLButtonElement>(null);\n const onCloseRef = useRef(onClose);\n onCloseRef.current = onClose;\n\n const [isMobile, setIsMobile] = useState(false);\n const [systemTheme, setSystemTheme] = useState<'light' | 'dark'>('light');\n\n const { themeConfig } = useGotchaContext();\n\n // Detect mobile and system theme after mount (SSR-safe)\n useEffect(() => {\n setIsMobile(window.innerWidth < 640);\n\n const darkQuery = window.matchMedia('(prefers-color-scheme: dark)');\n setSystemTheme(darkQuery.matches ? 'dark' : 'light');\n\n const handler = (e: MediaQueryListEvent) => setSystemTheme(e.matches ? 'dark' : 'light');\n darkQuery.addEventListener('change', handler);\n return () => darkQuery.removeEventListener('change', handler);\n }, []);\n\n // Resolve theme with provider config\n const t: ResolvedTheme = useMemo(\n () => resolveTheme(theme, systemTheme, themeConfig),\n [theme, systemTheme, themeConfig]\n );\n\n // Re-inject styles when theme changes\n useEffect(() => {\n injectStyles(t);\n }, [t]);\n\n // Determine if modal should appear above or below\n // Only compute on client after mount (anchorRect is only set on client)\n const showAbove = (() => {\n if (typeof window === 'undefined' || !anchorRect) return false;\n const spaceBelow = window.innerHeight - anchorRect.bottom;\n return spaceBelow < 300;\n })();\n\n // Focus trap — use ref for onClose so effect runs once\n useEffect(() => {\n const modal = modalRef.current;\n if (!modal) return;\n\n firstFocusableRef.current?.focus();\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n onCloseRef.current();\n return;\n }\n\n if (e.key === 'Tab') {\n const focusableElements = modal.querySelectorAll<HTMLElement>(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\n );\n const firstElement = focusableElements[0];\n const lastElement = focusableElements[focusableElements.length - 1];\n\n if (e.shiftKey && document.activeElement === firstElement) {\n e.preventDefault();\n lastElement?.focus();\n } else if (!e.shiftKey && document.activeElement === lastElement) {\n e.preventDefault();\n firstElement?.focus();\n }\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, []);\n\n const defaultPrompt = mode === 'vote'\n ? 'What do you think?'\n : mode === 'poll'\n ? 'Cast your vote'\n : mode === 'nps'\n ? (npsQuestion || 'How likely are you to recommend us?')\n : 'What do you think of this feature?';\n\n const modalPadding = isMobile ? 24 : 20;\n const modalWidth = mode === 'nps' ? 420 : 340;\n\n // Animation class\n const animationClass = isMobile\n ? 'gotcha-modal-enter-center'\n : showAbove\n ? 'gotcha-modal-enter-above'\n : 'gotcha-modal-enter';\n\n const viewportHeight = typeof window !== 'undefined' ? window.innerHeight : 0;\n\n const modalStyles: React.CSSProperties = isMobile\n ? {\n position: 'fixed',\n left: '50%',\n top: '50%',\n transform: 'translate(-50%, -50%)',\n width: 'calc(100vw - 32px)',\n maxWidth: modalWidth,\n padding: modalPadding,\n borderRadius: t.borders.radius.lg + 2,\n background: t.colors.backgroundGradient,\n color: t.colors.text,\n boxShadow: t.shadows.modal,\n border: `${t.borders.width}px solid ${t.colors.border}`,\n zIndex: 9999,\n fontFamily: t.typography.fontFamily,\n ...customStyles?.modal,\n textAlign: 'left' as const,\n }\n : useFixedPosition && anchorRect && viewportHeight\n ? {\n position: 'fixed',\n left: anchorRect.left + anchorRect.width / 2,\n width: modalWidth,\n padding: modalPadding,\n borderRadius: t.borders.radius.lg,\n background: t.colors.backgroundGradient,\n color: t.colors.text,\n boxShadow: t.shadows.modal,\n border: `${t.borders.width}px solid ${t.colors.border}`,\n zIndex: 99999,\n fontFamily: t.typography.fontFamily,\n ...(showAbove\n ? { bottom: viewportHeight - anchorRect.top + 8, transform: 'translateX(-50%)' }\n : { top: anchorRect.bottom + 8, transform: 'translateX(-50%)' }),\n ...customStyles?.modal,\n textAlign: 'left' as const,\n }\n : {\n position: 'absolute' as const,\n left: '50%',\n width: modalWidth,\n padding: modalPadding,\n borderRadius: t.borders.radius.lg,\n background: t.colors.backgroundGradient,\n color: t.colors.text,\n boxShadow: t.shadows.modal,\n border: `${t.borders.width}px solid ${t.colors.border}`,\n zIndex: 9999,\n fontFamily: t.typography.fontFamily,\n ...(showAbove\n ? { bottom: '100%', marginBottom: 8, transform: 'translateX(-50%)' }\n : { top: '100%', marginTop: 8, transform: 'translateX(-50%)' }),\n ...customStyles?.modal,\n textAlign: 'left' as const,\n };\n\n // Stagger delay for form elements (desktop only — mobile centering is disrupted by staggered opacity)\n const fadeUpStyle = (index: number): React.CSSProperties =>\n isMobile\n ? {}\n : {\n animation: `gotcha-fade-up ${t.animation.duration.normal} ${t.animation.easing.default} both`,\n animationDelay: `${index * 0.05}s`,\n };\n\n // \"Gotcha!\" success branding\n const isDefaultThankYou = thankYouMessage === 'Gotcha!' || thankYouMessage === 'Thanks for your feedback!';\n\n return (\n <div\n ref={modalRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={isSubmitted ? 'Feedback submitted' : undefined}\n aria-labelledby={isSubmitted ? undefined : 'gotcha-modal-title'}\n data-gotcha\n style={modalStyles}\n className={cn('gotcha-modal', animationClass)}\n >\n {/* Close button */}\n <button\n ref={firstFocusableRef}\n type=\"button\"\n onClick={onClose}\n aria-label=\"Close feedback form\"\n style={{\n position: 'absolute',\n top: isMobile ? 10 : 6,\n right: isMobile ? 10 : 6,\n width: isMobile ? 40 : 36,\n height: isMobile ? 40 : 36,\n border: 'none',\n background: 'transparent',\n outline: 'none',\n cursor: 'pointer',\n zIndex: 10,\n color: t.colors.closeButton,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: t.borders.radius.sm,\n transition: `all ${t.animation.duration.fast} ${t.animation.easing.default}`,\n ...customStyles?.closeButton,\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = t.colors.closeButtonBg;\n e.currentTarget.style.color = t.colors.closeButtonHover;\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent';\n e.currentTarget.style.color = t.colors.closeButton;\n }}\n >\n <svg width={isMobile ? 16 : 14} height={isMobile ? 16 : 14} viewBox=\"0 0 14 14\" fill=\"none\">\n <path\n d=\"M1 1L13 13M1 13L13 1\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n </button>\n\n {/* Title */}\n {!isSubmitted && (\n <h2\n id=\"gotcha-modal-title\"\n style={{\n margin: '0 0 16px 0',\n fontSize: isMobile ? t.typography.fontSize.lg : t.typography.fontSize.md,\n fontWeight: t.typography.fontWeight.semibold,\n paddingRight: isMobile ? 44 : 38,\n letterSpacing: '-0.02em',\n lineHeight: 1.4,\n textAlign: 'left',\n fontFamily: t.typography.fontFamily,\n ...fadeUpStyle(0),\n ...customStyles?.title,\n }}\n >\n {promptText || defaultPrompt}\n </h2>\n )}\n\n {/* Success state — \"Gotcha!\" branding moment */}\n {isSubmitted && (\n <div\n style={{\n textAlign: 'center',\n padding: '28px 0 20px',\n }}\n >\n {/* Animated checkmark circle */}\n <div\n style={{\n width: 52,\n height: 52,\n borderRadius: '50%',\n backgroundColor: t.colors.successSurface,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n margin: '0 auto 16px',\n animation: `gotcha-success-pop 0.4s ${t.animation.easing.spring} both, gotcha-glow-pulse 0.8s ease 0.4s`,\n ...customStyles?.successIcon,\n }}\n >\n <svg\n width=\"26\"\n height=\"26\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n >\n <path\n d=\"M20 6L9 17L4 12\"\n stroke={t.colors.success}\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={{\n strokeDasharray: 24,\n strokeDashoffset: 0,\n animation: `gotcha-check-draw 0.4s ease 0.2s both`,\n }}\n />\n </svg>\n </div>\n\n {/* Primary message */}\n <p\n style={{\n margin: 0,\n fontSize: isDefaultThankYou ? 22 : t.typography.fontSize.md,\n fontWeight: isDefaultThankYou ? t.typography.fontWeight.bold : t.typography.fontWeight.medium,\n color: t.colors.text,\n fontFamily: isDefaultThankYou ? \"'Carter One', cursive\" : t.typography.fontFamily,\n animation: `gotcha-success-text 0.3s ease 0.3s both`,\n ...customStyles?.successMessage,\n }}\n >\n {isDefaultThankYou ? 'Gotcha!' : thankYouMessage}\n </p>\n\n {/* Subtitle (only for default message) */}\n {isDefaultThankYou && (\n <p\n style={{\n margin: '6px 0 0',\n fontSize: t.typography.fontSize.sm,\n fontWeight: t.typography.fontWeight.normal,\n color: t.colors.textSecondary,\n animation: `gotcha-success-text 0.3s ease 0.45s both`,\n }}\n >\n Thanks for your feedback!\n </p>\n )}\n </div>\n )}\n\n {/* Error state */}\n {error && !isSubmitted && (\n <div\n style={{\n padding: '8px 10px',\n marginBottom: 12,\n borderRadius: t.borders.radius.sm,\n backgroundColor: t.colors.errorSurface,\n border: `1px solid ${t.colors.errorBorder}`,\n color: t.colors.error,\n fontSize: t.typography.fontSize.sm,\n lineHeight: 1.4,\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n ...fadeUpStyle(1),\n ...customStyles?.errorMessage,\n }}\n >\n <svg width={14} height={14} viewBox=\"0 0 24 24\" fill=\"none\" style={{ flexShrink: 0 }}>\n <path d=\"M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126zM12 15.75h.007v.008H12v-.008z\" stroke=\"currentColor\" strokeWidth={1.5} strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n {error}\n </div>\n )}\n\n {/* Follow-up question */}\n {phase === 'followUp' && followUpConfig && onFollowUpSubmit && (\n <div style={fadeUpStyle(1)}>\n <FollowUpPrompt\n resolvedTheme={t}\n promptText={followUpConfig.promptText}\n placeholder={followUpConfig.placeholder}\n isLoading={followUpLoading}\n onSubmit={onFollowUpSubmit}\n />\n </div>\n )}\n\n {/* Loading state while checking for existing response */}\n {phase === 'form' && isCheckingExisting && (\n <div style={{\n display: 'flex',\n justifyContent: 'center',\n padding: '24px 0',\n ...fadeUpStyle(1),\n }}>\n <Spinner size={24} color={t.colors.textSecondary} />\n </div>\n )}\n\n {/* Form content based on mode */}\n {phase === 'form' && !isCheckingExisting && (\n <div style={fadeUpStyle(1)}>\n {mode === 'feedback' && (\n <FeedbackMode\n resolvedTheme={t}\n placeholder={placeholder}\n submitText={submitText}\n isLoading={isLoading}\n onSubmit={onSubmit}\n customStyles={customStyles}\n initialValues={existingResponse ? {\n content: existingResponse.content,\n rating: existingResponse.rating,\n } : undefined}\n isEditing={isEditing}\n showText={showText}\n showRating={showRating}\n enableBugFlag={enableBugFlag}\n bugFlagLabel={bugFlagLabel}\n enableScreenshot={enableScreenshot}\n />\n )}\n {mode === 'vote' && (\n <VoteMode\n resolvedTheme={t}\n isLoading={isLoading}\n onSubmit={onSubmit}\n initialVote={existingResponse?.vote || undefined}\n isEditing={isEditing}\n labels={voteLabels}\n />\n )}\n {mode === 'nps' && (\n <NpsMode\n resolvedTheme={t}\n submitText={submitText}\n isLoading={isLoading}\n onSubmit={onSubmit}\n showFollowUp={npsFollowUp}\n followUpPlaceholder={npsFollowUpPlaceholder}\n lowLabel={npsLowLabel}\n highLabel={npsHighLabel}\n customStyles={customStyles}\n initialValues={existingResponse ? {\n rating: existingResponse.rating,\n content: existingResponse.content,\n } : undefined}\n isEditing={isEditing}\n />\n )}\n {mode === 'poll' && options && options.length > 0 && (\n <PollMode\n resolvedTheme={t}\n options={options}\n allowMultiple={allowMultiple}\n isLoading={isLoading}\n onSubmit={onSubmit}\n initialSelected={existingResponse?.pollSelected || undefined}\n isEditing={isEditing}\n />\n )}\n </div>\n )}\n\n {/* Screen reader announcement */}\n <div aria-live=\"polite\" className=\"sr-only\" style={{ position: 'absolute', left: -9999 }}>\n {isSubmitted && 'Thank you! Your feedback has been submitted.'}\n {error && `Error: ${error}`}\n </div>\n </div>\n );\n}\n","import React, { useState, useCallback, useEffect, useRef } from 'react';\nimport { createPortal } from 'react-dom';\nimport {\n ResponseMode,\n GotchaUser,\n Position,\n Size,\n Theme,\n TouchBehavior,\n GotchaStyles,\n GotchaResponse,\n GotchaError,\n} from '../types';\nimport { DEFAULTS } from '../constants';\nimport { useGotchaContext } from './GotchaProvider';\nimport { useSubmit } from '../hooks/useSubmit';\nimport { useHideAfterSubmit } from '../hooks/useHideAfterSubmit';\nimport { useTriggerConditions } from '../hooks/useTriggerConditions';\nimport { GotchaButton } from './GotchaButton';\nimport { GotchaModal } from './GotchaModal';\n\nexport interface GotchaProps {\n /** Unique identifier for this element */\n elementId: string;\n\n // User data\n /** User metadata for segmentation */\n user?: GotchaUser;\n\n // Behavior\n /** Feedback mode */\n mode?: ResponseMode;\n\n // Feedback mode field visibility\n /** Show the text input in feedback mode (default: true) */\n showText?: boolean;\n /** Show the star rating in feedback mode (default: true) */\n showRating?: boolean;\n\n // Vote mode specific\n /** Custom labels for vote buttons (default: Like/Dislike) */\n voteLabels?: { up: string; down: string };\n\n // Poll mode specific\n /** Required if mode is 'poll' (2-6 options) */\n options?: string[];\n /** Allow selecting multiple options */\n allowMultiple?: boolean;\n\n // NPS mode specific\n /** Custom NPS question (default: \"How likely are you to recommend us?\") */\n npsQuestion?: string;\n /** Show follow-up textarea after score selection (default: true) */\n npsFollowUp?: boolean;\n /** Placeholder for NPS follow-up textarea */\n npsFollowUpPlaceholder?: string;\n /** Label for low end of NPS scale (default: \"Not likely\") */\n npsLowLabel?: string;\n /** Label for high end of NPS scale (default: \"Very likely\") */\n npsHighLabel?: string;\n\n // Appearance\n /** Button position relative to parent */\n position?: Position;\n /** Button size */\n size?: Size;\n /** Color theme */\n theme?: Theme;\n /** Custom style overrides */\n customStyles?: GotchaStyles;\n /** Control visibility programmatically */\n visible?: boolean;\n /** Only show when parent is hovered (default: true) */\n showOnHover?: boolean;\n /** Mobile behavior (default: 'always-visible') */\n touchBehavior?: TouchBehavior;\n\n // Content\n /** Custom prompt text */\n promptText?: string;\n /** Input placeholder text */\n placeholder?: string;\n /** Submit button text */\n submitText?: string;\n /** Post-submission message */\n thankYouMessage?: string;\n\n // Bug flagging\n /** Show \"Report an issue\" toggle in feedback form (default: false) */\n enableBugFlag?: boolean;\n /** Custom label for the bug flag toggle (default: \"Report an issue\") */\n bugFlagLabel?: string;\n /** Enable screenshot capture when bug flag is toggled (requires html2canvas peer dep, falls back to native API) */\n enableScreenshot?: boolean;\n\n // Deduplication\n /** When true and user has already responded, show submitted state and allow review/edit instead of new submission */\n onePerUser?: boolean;\n /** When onePerUser is true, allow a new submission after this many days. Has no effect without onePerUser. */\n cooldownDays?: number;\n /** After submission, hide the widget for this many days (client-side, localStorage).\n * Independent of cooldownDays — the widget stays hidden for the full duration even if cooldown expires sooner. */\n hideAfterSubmitDays?: number;\n\n // Trigger conditions\n /** Delay showing widget by N seconds after page load */\n showAfterSeconds?: number;\n /** Show widget after user scrolls past this percentage (0-100) */\n showAfterScrollPercent?: number;\n /** Show widget after user has visited N times (uses localStorage) */\n showAfterVisits?: number;\n\n // Follow-up\n /** Show a follow-up question after low rating or negative vote */\n followUp?: {\n /** Rating threshold (inclusive) — e.g., 2 means ratings 1-2 trigger follow-up */\n ratingThreshold?: number;\n /** Also trigger on negative vote */\n onNegativeVote?: boolean;\n /** The prompt text shown */\n promptText: string;\n /** Placeholder for the follow-up textarea */\n placeholder?: string;\n };\n\n // Animation\n /** Enable entrance animations on the button and modal (default: true) */\n animated?: boolean;\n\n // Callbacks\n /** Called after successful submission */\n onSubmit?: (response: GotchaResponse) => void;\n /** Called when modal opens */\n onOpen?: () => void;\n /** Called when modal closes */\n onClose?: () => void;\n /** Called on error */\n onError?: (error: GotchaError) => void;\n}\n\nexport function Gotcha({\n elementId,\n user,\n mode = 'feedback',\n showText = true,\n showRating = true,\n voteLabels,\n options,\n allowMultiple = false,\n npsQuestion,\n npsFollowUp = true,\n npsFollowUpPlaceholder,\n npsLowLabel,\n npsHighLabel,\n enableBugFlag = false,\n bugFlagLabel,\n enableScreenshot = false,\n onePerUser = false,\n cooldownDays,\n hideAfterSubmitDays,\n showAfterSeconds,\n showAfterScrollPercent,\n showAfterVisits,\n followUp,\n animated = true,\n position = DEFAULTS.POSITION,\n size = DEFAULTS.SIZE,\n theme = DEFAULTS.THEME,\n customStyles,\n visible = true,\n showOnHover = DEFAULTS.SHOW_ON_HOVER,\n touchBehavior = DEFAULTS.TOUCH_BEHAVIOR,\n promptText,\n placeholder,\n submitText = DEFAULTS.SUBMIT_TEXT,\n thankYouMessage = DEFAULTS.THANK_YOU_MESSAGE,\n onSubmit,\n onOpen,\n onClose,\n onError,\n}: GotchaProps) {\n const { disabled, activeModalId, openModal, closeModal, defaultUser, client } = useGotchaContext();\n\n const { conditionsMet } = useTriggerConditions({\n elementId,\n showAfterSeconds,\n showAfterScrollPercent,\n showAfterVisits,\n });\n\n const { isHidden, markHidden } = useHideAfterSubmit({\n elementId,\n userId: user?.id || defaultUser?.id,\n hideAfterSubmitDays,\n });\n const [phase, setPhase] = useState<'form' | 'followUp' | 'success'>('form');\n const [lastResponseId, setLastResponseId] = useState<string | null>(null);\n const [followUpLoading, setFollowUpLoading] = useState(false);\n const [queuedCount, setQueuedCount] = useState(0);\n const [isParentHovered, setIsParentHovered] = useState(false);\n const [anchorRect, setAnchorRect] = useState<DOMRect | null>(null);\n const [isMobile, setIsMobile] = useState(false);\n const [hasMounted, setHasMounted] = useState(false);\n const containerRef = useRef<HTMLDivElement>(null);\n const autoCloseTimerRef = useRef<ReturnType<typeof setTimeout>>();\n const lastSubmitDataRef = useRef<{ rating?: number; vote?: 'up' | 'down' } | null>(null);\n\n // SSR-safe mount detection\n useEffect(() => {\n setHasMounted(true);\n setIsMobile(window.innerWidth < 640);\n return () => {\n clearTimeout(autoCloseTimerRef.current);\n };\n }, []);\n\n // Track offline queue length\n useEffect(() => {\n setQueuedCount(client.getQueueLength());\n const handleOnline = () => {\n // Queue will be flushed by provider; update count after a delay\n setTimeout(() => setQueuedCount(client.getQueueLength()), 2000);\n };\n window.addEventListener('online', handleOnline);\n return () => window.removeEventListener('online', handleOnline);\n }, [client]);\n\n const isOpen = activeModalId === elementId;\n\n // Reset phase when modal is closed externally (e.g., another modal opens)\n useEffect(() => {\n if (!isOpen) {\n setPhase('form');\n clearTimeout(autoCloseTimerRef.current);\n }\n }, [isOpen]);\n\n // Scroll lock on mobile when modal is open\n useEffect(() => {\n if (!isOpen || !isMobile) return;\n const prev = document.body.style.overflow;\n document.body.style.overflow = 'hidden';\n return () => { document.body.style.overflow = prev; };\n }, [isOpen, isMobile]);\n\n // Attach hover listeners to the parent element\n useEffect(() => {\n if (!showOnHover) return;\n\n const container = containerRef.current;\n if (!container) return;\n\n const parent = container.parentElement;\n if (!parent) return;\n\n const handleMouseEnter = () => setIsParentHovered(true);\n const handleMouseLeave = () => setIsParentHovered(false);\n\n parent.addEventListener('mouseenter', handleMouseEnter);\n parent.addEventListener('mouseleave', handleMouseLeave);\n\n return () => {\n parent.removeEventListener('mouseenter', handleMouseEnter);\n parent.removeEventListener('mouseleave', handleMouseLeave);\n };\n }, [showOnHover]);\n\n const { submit, isLoading, isCheckingExisting, error, existingResponse, isEditing } = useSubmit({\n elementId,\n mode,\n pollOptions: options,\n user,\n onePerUser,\n cooldownDays,\n onSuccess: (response) => {\n setLastResponseId(response.id);\n if (hideAfterSubmitDays) markHidden();\n onSubmit?.(response);\n\n // Check if follow-up should trigger\n const shouldFollowUp = followUp && lastSubmitDataRef.current && (\n (followUp.ratingThreshold != null && lastSubmitDataRef.current.rating != null &&\n lastSubmitDataRef.current.rating <= followUp.ratingThreshold) ||\n (followUp.onNegativeVote && lastSubmitDataRef.current.vote === 'down')\n );\n\n if (shouldFollowUp && mode !== 'poll') {\n setPhase('followUp');\n } else {\n setPhase('success');\n autoCloseTimerRef.current = setTimeout(() => {\n closeModal();\n setPhase('form');\n }, 3000);\n }\n },\n onError: (err) => {\n console.warn('[Gotcha] Submission failed:', err instanceof Error ? err.message : err);\n onError?.(err as unknown as GotchaError);\n },\n });\n\n const handleOpen = useCallback(() => {\n if (containerRef.current) {\n // Anchor to the actual button element, not the container wrapper\n const button = containerRef.current.querySelector('.gotcha-button');\n setAnchorRect((button || containerRef.current).getBoundingClientRect());\n }\n openModal(elementId);\n onOpen?.();\n }, [elementId, openModal, onOpen]);\n\n const handleClose = useCallback(() => {\n clearTimeout(autoCloseTimerRef.current);\n closeModal();\n setPhase('form');\n onClose?.();\n }, [closeModal, onClose]);\n\n // Wrap submit to capture rating/vote for follow-up check\n const handleSubmit = useCallback(\n (data: { content?: string; rating?: number; vote?: 'up' | 'down'; pollSelected?: string[]; isBug?: boolean }) => {\n lastSubmitDataRef.current = { rating: data.rating, vote: data.vote };\n submit(data);\n },\n [submit]\n );\n\n // Handle follow-up submission\n const handleFollowUpSubmit = useCallback(\n async (content: string) => {\n if (!lastResponseId) return;\n setFollowUpLoading(true);\n try {\n await client.updateResponse(lastResponseId, { content });\n } catch (err) {\n // If follow-up fails, still show success — initial response is already saved\n console.warn('[Gotcha] Follow-up submission failed:', err instanceof Error ? err.message : err);\n } finally {\n setFollowUpLoading(false);\n setPhase('success');\n autoCloseTimerRef.current = setTimeout(() => {\n closeModal();\n setPhase('form');\n }, 3000);\n }\n },\n [lastResponseId, closeModal, client]\n );\n\n const effectiveSubmitText = (onePerUser && isEditing) ? 'Update' : submitText;\n\n if (disabled || !visible || isHidden || !conditionsMet) return null;\n\n const positionStyles: Record<Position, React.CSSProperties> = {\n 'top-right': { position: 'absolute', top: 0, right: 0, transform: 'translate(50%, -50%)' },\n 'top-left': { position: 'absolute', top: 0, left: 0, transform: 'translate(-50%, -50%)' },\n 'bottom-right': { position: 'absolute', bottom: 0, right: 0, transform: 'translate(50%, 50%)' },\n 'bottom-left': { position: 'absolute', bottom: 0, left: 0, transform: 'translate(-50%, 50%)' },\n 'inline': { position: 'relative', display: 'inline-flex' },\n };\n\n const modalProps = {\n mode,\n theme,\n customStyles,\n promptText,\n placeholder,\n submitText: effectiveSubmitText,\n thankYouMessage,\n isLoading,\n isCheckingExisting: onePerUser && isCheckingExisting,\n isSubmitted: phase === 'success',\n phase,\n followUpConfig: followUp,\n followUpLoading,\n onFollowUpSubmit: handleFollowUpSubmit,\n error,\n existingResponse: onePerUser ? existingResponse : null,\n isEditing: onePerUser && isEditing,\n showText,\n showRating,\n voteLabels,\n options,\n allowMultiple,\n npsQuestion,\n npsFollowUp,\n npsFollowUpPlaceholder,\n npsLowLabel,\n npsHighLabel,\n enableBugFlag,\n bugFlagLabel,\n enableScreenshot,\n onSubmit: handleSubmit,\n onClose: handleClose,\n anchorRect: anchorRect || undefined,\n useFixedPosition: !isMobile,\n };\n\n return (\n <div\n ref={containerRef}\n style={{\n ...positionStyles[position],\n zIndex: isOpen ? 10000 : 'auto',\n }}\n className=\"gotcha-container\"\n data-gotcha-element={elementId}\n >\n <GotchaButton\n size={size}\n theme={theme}\n customStyles={customStyles}\n showOnHover={showOnHover}\n touchBehavior={touchBehavior}\n onClick={handleOpen}\n isOpen={isOpen}\n isParentHovered={isParentHovered}\n animated={animated}\n queuedCount={queuedCount}\n />\n\n {/* Desktop: portal without backdrop, anchored via fixed positioning */}\n {isOpen && !isMobile && hasMounted && createPortal(\n <GotchaModal {...modalProps} />,\n document.body\n )}\n\n {/* Mobile: frosted glass backdrop portal */}\n {isOpen && isMobile && hasMounted && createPortal(\n <div\n role=\"presentation\"\n style={{\n position: 'fixed',\n inset: 0,\n zIndex: 99999,\n backgroundColor: 'rgba(0,0,0,0.4)',\n backdropFilter: 'blur(8px)',\n WebkitBackdropFilter: 'blur(8px)',\n }}\n className=\"gotcha-overlay-enter\"\n onClick={handleClose}\n >\n <div onClick={(e) => e.stopPropagation()}>\n <GotchaModal {...modalProps} />\n </div>\n </div>,\n document.body\n )}\n </div>\n );\n}\n","import { useState, useEffect } from 'react';\nimport { useGotchaContext } from '../components/GotchaProvider';\nimport { ScoreData } from '../types';\n\ninterface UseScoreOptions {\n elementId: string;\n refreshInterval?: number;\n}\n\ninterface UseScoreResult {\n score: ScoreData | null;\n isLoading: boolean;\n error: string | null;\n}\n\nexport function useScore({ elementId, refreshInterval }: UseScoreOptions): UseScoreResult {\n const { client } = useGotchaContext();\n const [score, setScore] = useState<ScoreData | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n\n const fetchScore = async () => {\n try {\n const data = await client.getScore(elementId);\n if (!cancelled) {\n setScore(data);\n setError(null);\n }\n } catch (err) {\n if (!cancelled) {\n setError(err instanceof Error ? err.message : 'Failed to load score');\n }\n } finally {\n if (!cancelled) {\n setIsLoading(false);\n }\n }\n };\n\n fetchScore();\n\n let intervalId: ReturnType<typeof setInterval> | undefined;\n if (refreshInterval && refreshInterval > 0) {\n intervalId = setInterval(fetchScore, refreshInterval);\n }\n\n return () => {\n cancelled = true;\n if (intervalId) clearInterval(intervalId);\n };\n }, [client, elementId, refreshInterval]);\n\n return { score, isLoading, error };\n}\n","import React, { useState, useEffect, useMemo } from 'react';\nimport { Theme, Size } from '../types';\nimport { useScore } from '../hooks/useScore';\nimport { resolveTheme } from '../theme/resolveTheme';\nimport { useGotchaContext } from './GotchaProvider';\n\nexport type ScoreVariant = 'stars' | 'number' | 'compact' | 'votes';\n\nexport interface GotchaScoreProps {\n elementId: string;\n variant?: ScoreVariant;\n showCount?: boolean;\n size?: Size;\n theme?: Theme;\n refreshInterval?: number;\n style?: React.CSSProperties;\n}\n\nconst SIZE_MAP: Record<Size, {\n fontSize: number;\n ratingFontSize: number;\n starSize: number;\n gap: number;\n pillPx: number;\n pillPy: number;\n barHeight: number;\n iconSize: number;\n}> = {\n sm: { fontSize: 11, ratingFontSize: 13, starSize: 13, gap: 5, pillPx: 8, pillPy: 4, barHeight: 3, iconSize: 12 },\n md: { fontSize: 12.5, ratingFontSize: 15, starSize: 15, gap: 6, pillPx: 10, pillPy: 5, barHeight: 4, iconSize: 14 },\n lg: { fontSize: 14, ratingFontSize: 18, starSize: 18, gap: 8, pillPx: 12, pillPy: 6, barHeight: 5, iconSize: 16 },\n};\n\n/** Crisp, rounded 5-point star SVG with partial fill via clipPath */\nfunction Stars({ rating, size, filledColor, emptyColor }: {\n rating: number;\n size: number;\n filledColor: string;\n emptyColor: string;\n}) {\n const clipId = `gotcha-star-clip-${Math.random().toString(36).slice(2, 8)}`;\n const stars = [];\n for (let i = 1; i <= 5; i++) {\n const fill = Math.min(1, Math.max(0, rating - (i - 1)));\n const id = `${clipId}-${i}`;\n stars.push(\n <svg key={i} width={size} height={size} viewBox=\"0 0 24 24\" style={{ display: 'block' }}>\n <defs>\n <clipPath id={id}>\n <rect x=\"0\" y=\"0\" width={24 * fill} height=\"24\" />\n </clipPath>\n </defs>\n <path\n d=\"M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z\"\n fill={emptyColor}\n />\n <path\n d=\"M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z\"\n fill={filledColor}\n clipPath={`url(#${id})`}\n />\n </svg>\n );\n }\n return <span style={{ display: 'inline-flex', gap: Math.max(1, size * 0.08), alignItems: 'center' }}>{stars}</span>;\n}\n\n/** Compact positive rate bar */\nfunction PositiveBar({ rate, height, filledColor, trackColor }: {\n rate: number;\n height: number;\n filledColor: string;\n trackColor: string;\n}) {\n return (\n <span style={{\n display: 'inline-block',\n width: 48,\n height,\n borderRadius: height,\n backgroundColor: trackColor,\n overflow: 'hidden',\n verticalAlign: 'middle',\n }}>\n <span style={{\n display: 'block',\n width: `${rate}%`,\n height: '100%',\n borderRadius: height,\n background: filledColor,\n transition: 'width 0.6s cubic-bezier(0.4, 0, 0.2, 1)',\n }} />\n </span>\n );\n}\n\n/** Thumbs up SVG icon */\nfunction ThumbIcon({ size, color }: { size: number; color: string }) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill={color} style={{ display: 'block' }}>\n <path d=\"M2 20h2c.55 0 1-.45 1-1v-9c0-.55-.45-1-1-1H2v11zm19.83-7.12c.11-.25.17-.52.17-.8V11c0-1.1-.9-2-2-2h-5.5l.92-4.65c.05-.22.02-.46-.08-.66a4.8 4.8 0 00-.88-1.12L14 2 7.59 8.41C7.21 8.79 7 9.3 7 9.83v7.84C7 18.95 8.05 20 9.34 20h8.11c.7 0 1.36-.37 1.72-.97l2.66-6.15z\" />\n </svg>\n );\n}\n\nexport function GotchaScore({\n elementId,\n variant = 'stars',\n showCount = true,\n size = 'md',\n theme = 'auto',\n refreshInterval,\n style,\n}: GotchaScoreProps) {\n const { score, isLoading } = useScore({ elementId, refreshInterval });\n const [systemTheme, setSystemTheme] = useState<'light' | 'dark'>('light');\n\n useEffect(() => {\n if (typeof window === 'undefined') return;\n const mq = window.matchMedia('(prefers-color-scheme: dark)');\n setSystemTheme(mq.matches ? 'dark' : 'light');\n const handler = (e: MediaQueryListEvent) => setSystemTheme(e.matches ? 'dark' : 'light');\n mq.addEventListener('change', handler);\n return () => mq.removeEventListener('change', handler);\n }, []);\n\n const { themeConfig } = useGotchaContext();\n const t = useMemo(() => resolveTheme(theme, systemTheme, themeConfig), [theme, systemTheme, themeConfig]);\n\n if (isLoading || !score) return null;\n const s = SIZE_MAP[size];\n\n // Color tokens from resolved theme\n const ratingColor = t.colors.text;\n const mutedColor = t.colors.textDisabled;\n const starFilled = t.colors.starFilled;\n const starEmpty = t.colors.starEmpty;\n const positiveColor = t.colors.voteUp;\n const positiveTrack = t.colors.starEmpty;\n\n const baseStyle: React.CSSProperties = {\n display: 'inline-flex',\n alignItems: 'center',\n gap: s.gap,\n fontFamily: t.typography.fontFamily,\n lineHeight: 1,\n letterSpacing: '-0.01em',\n WebkitFontSmoothing: 'antialiased',\n ...style,\n };\n\n const countText = (n: number, singular: string) => {\n const label = n === 1 ? singular : `${singular}s`;\n return `${n.toLocaleString()} ${label}`;\n };\n\n // ── Votes variant ──────────────────────────────────────────────\n if (variant === 'votes') {\n const { voteCount, positiveRate } = score;\n const total = voteCount.up + voteCount.down;\n if (total === 0) return null;\n\n return (\n <span style={baseStyle}>\n <ThumbIcon size={s.iconSize} color={positiveColor} />\n <span style={{ fontSize: s.ratingFontSize, fontWeight: 600, color: positiveColor, fontVariantNumeric: 'tabular-nums' }}>\n {positiveRate}%\n </span>\n <PositiveBar rate={positiveRate ?? 0} height={s.barHeight} filledColor={positiveColor} trackColor={positiveTrack} />\n {showCount && (\n <span style={{ fontSize: s.fontSize, color: mutedColor, fontWeight: 400 }}>\n {countText(total, 'vote')}\n </span>\n )}\n </span>\n );\n }\n\n // ── Rating-based variants ──────────────────────────────────────\n const { averageRating, totalResponses } = score;\n if (averageRating === null || totalResponses === 0) return null;\n\n const displayRating = averageRating.toFixed(1);\n\n // ── Compact ────────────────────────────────────────────────────\n if (variant === 'compact') {\n return (\n <span style={baseStyle}>\n <svg width={s.starSize} height={s.starSize} viewBox=\"0 0 24 24\" style={{ display: 'block', flexShrink: 0 }}>\n <path\n d=\"M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z\"\n fill={starFilled}\n />\n </svg>\n <span style={{ fontSize: s.ratingFontSize, fontWeight: 700, color: ratingColor, fontVariantNumeric: 'tabular-nums' }}>\n {displayRating}\n </span>\n {showCount && (\n <span style={{ fontSize: s.fontSize, color: mutedColor, fontWeight: 400 }}>\n ({totalResponses.toLocaleString()})\n </span>\n )}\n </span>\n );\n }\n\n // ── Number ─────────────────────────────────────────────────────\n if (variant === 'number') {\n return (\n <span style={baseStyle}>\n <span style={{ fontSize: s.ratingFontSize, fontWeight: 700, color: ratingColor, fontVariantNumeric: 'tabular-nums' }}>\n {displayRating}\n </span>\n <span style={{ fontSize: s.fontSize, color: mutedColor, fontWeight: 400 }}>/ 5</span>\n {showCount && (\n <span style={{\n fontSize: s.fontSize,\n color: mutedColor,\n fontWeight: 400,\n marginLeft: 2,\n }}>\n ({countText(totalResponses, 'response')})\n </span>\n )}\n </span>\n );\n }\n\n // ── Stars (default) ────────────────────────────────────────────\n return (\n <span style={baseStyle}>\n <Stars rating={averageRating} size={s.starSize} filledColor={starFilled} emptyColor={starEmpty} />\n <span style={{ fontSize: s.ratingFontSize, fontWeight: 700, color: ratingColor, fontVariantNumeric: 'tabular-nums' }}>\n {displayRating}\n </span>\n {showCount && (\n <span style={{ fontSize: s.fontSize, color: mutedColor, fontWeight: 400 }}>\n ({countText(totalResponses, 'response')})\n </span>\n )}\n </span>\n );\n}\n","import { useGotchaContext } from '../components/GotchaProvider';\n\n/**\n * Hook to access Gotcha context\n * Must be used within a GotchaProvider\n */\nexport function useGotcha() {\n const { client, disabled, defaultUser, debug, openModal, closeModal, activeModalId } = useGotchaContext();\n\n return {\n /** The API client for manual submissions */\n client,\n /** Whether Gotcha is globally disabled */\n disabled,\n /** Default user metadata */\n defaultUser,\n /** Whether debug mode is enabled */\n debug,\n /** Submit feedback programmatically */\n submitFeedback: client.submitResponse.bind(client),\n /** Open a specific Gotcha modal by elementId */\n openModal,\n /** Close the currently open modal */\n closeModal,\n /** The currently open modal's elementId, or null */\n activeModalId,\n };\n}\n","import { useCallback } from 'react';\nimport { useGotchaContext } from '../components/GotchaProvider';\n\n/**\n * Hook to programmatically open/close a specific Gotcha widget.\n * The corresponding <Gotcha elementId=\"...\"> must be mounted for the modal to render.\n */\nexport function useGotchaTrigger(elementId: string) {\n const { activeModalId, openModal, closeModal } = useGotchaContext();\n\n const open = useCallback(() => openModal(elementId), [openModal, elementId]);\n const close = useCallback(() => closeModal(), [closeModal]);\n\n return {\n open,\n close,\n isOpen: activeModalId === elementId,\n };\n}\n"]}