gotcha-feedback 1.1.4 → 1.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/constants.ts","../src/utils/anonymous.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/utils/cn.ts","../src/utils/device.ts","../src/components/GotchaButton.tsx","../src/components/Spinner.tsx","../src/components/modes/FeedbackMode.tsx","../src/components/modes/VoteMode.tsx","../src/components/modes/PollMode.tsx","../src/components/modes/NpsMode.tsx","../src/components/GotchaModal.tsx","../src/components/Gotcha.tsx","../src/hooks/useScore.ts","../src/components/GotchaScore.tsx","../src/hooks/useGotcha.ts"],"names":["API_BASE_URL","STORAGE_KEYS","DEFAULTS","RETRY_CONFIG","getAnonymousId","stored","id","DEFAULT_RETRY_CONFIG","fetchWithRetry","url","options","config","debug","lastError","attempt","response","error","delay","resolve","createApiClient","apiKey","baseUrl","headers","request","method","endpoint","body","idempotencyKey","data","payload","user","fullPayload","elementId","userId","responseId","UNSAFE_KEYS","deepMerge","base","override","result","key","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","value","generateStyleTag","easing","duration","fontFamily","textDisabled","injectStyles","preconnect","preconnectStatic","link","styleEl","GotchaContext","createContext","EMPTY_USER","GotchaProvider","children","disabled","defaultUser","themeConfig","activeModalId","setActiveModalId","useState","client","useMemo","stableDefaultUser","useEffect","openModal","useCallback","closeModal","jsx","useGotchaContext","context","useContext","useSubmit","isLoading","setIsLoading","isCheckingExisting","setIsCheckingExisting","setError","existingResponse","setExistingResponse","cancelled","existing","err","errorMessage","cn","classes","isTouchDevice","getResponsiveSize","size","isTouch","sizes","getInitialSystemTheme","GotchaButton","customStyles","showOnHover","touchBehavior","onClick","isOpen","isParentHovered","animated","setIsTouch","tapRevealed","setTapRevealed","setSystemTheme","isHovered","setIsHovered","isPressed","setIsPressed","hasPopped","setHasPopped","darkQuery","handler","e","shouldShow","timer","handleClick","buttonSize","t","getTransform","baseStyles","GotchaIcon","mounted","setMounted","Spinner","color","jsxs","FeedbackMode","placeholder","submitText","onSubmit","initialValues","isEditing","showText","showRating","enableBugFlag","bugFlagLabel","content","setContent","rating","setRating","isBug","setIsBug","canSubmit","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","GotchaModal","mode","promptText","thankYouMessage","isSubmitted","voteLabels","npsQuestion","npsFollowUp","npsFollowUpPlaceholder","npsLowLabel","npsHighLabel","onClose","anchorRect","modalRef","firstFocusableRef","onCloseRef","isMobile","setIsMobile","showAbove","modal","handleKeyDown","focusableElements","firstElement","lastElement","defaultPrompt","modalPadding","modalWidth","animationClass","modalStyles","fadeUpStyle","isDefaultThankYou","Gotcha","onePerUser","position","visible","onOpen","onError","setIsSubmitted","setIsParentHovered","setAnchorRect","hasMounted","setHasMounted","containerRef","autoCloseTimerRef","container","parent","handleMouseEnter","handleMouseLeave","submit","handleOpen","handleClose","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"],"mappings":"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","file":"index.js","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} 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","import { STORAGE_KEYS } from '../constants';\n\n/**\n * Get or create an anonymous user ID\n * Stored in localStorage for consistency across sessions\n */\nexport function getAnonymousId(): string {\n if (typeof window === 'undefined') {\n // SSR fallback - generate but don't persist\n return `anon_${crypto.randomUUID()}`;\n }\n\n try {\n const stored = localStorage.getItem(STORAGE_KEYS.ANONYMOUS_ID);\n if (stored) return stored;\n\n const id = `anon_${crypto.randomUUID()}`;\n localStorage.setItem(STORAGE_KEYS.ANONYMOUS_ID, id);\n return id;\n } catch {\n // localStorage unavailable (incognito Safari, sandboxed iframes)\n return `anon_${crypto.randomUUID()}`;\n }\n}\n\n/**\n * Clear the anonymous ID (useful for testing)\n */\nexport function clearAnonymousId(): void {\n if (typeof window !== 'undefined') {\n localStorage.removeItem(STORAGE_KEYS.ANONYMOUS_ID);\n }\n}\n","import { API_BASE_URL, RETRY_CONFIG } from '../constants';\nimport { SubmitResponsePayload, GotchaResponse, GotchaError, ExistingResponse, VoteType, ScoreData } from '../types';\nimport { getAnonymousId } from '../utils/anonymous';\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 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 = crypto.randomUUID();\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: {\n url: typeof window !== 'undefined' ? window.location.origin + window.location.pathname : undefined,\n userAgent: typeof navigator !== 'undefined' ? navigator.userAgent : undefined,\n },\n // Only include isBug if true\n ...(payload.isBug ? { isBug: true } : {}),\n };\n\n return request<GotchaResponse>('POST', '/responses', fullPayload);\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 * 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\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.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';\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 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 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}\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\n useEffect(() => {\n const userId = options.user?.id || defaultUser?.id;\n if (!userId) {\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 setExistingResponse(existing);\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]);\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 we have an existing response and a user ID, update instead of create\n if (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 user: { ...defaultUser, ...options.user },\n });\n }\n\n // Update existingResponse so isEditing flips to true after first submit\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 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","/**\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}\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}: 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 </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, { useState, useEffect, useRef } from 'react';\nimport { GotchaStyles } from '../../types';\nimport { ResolvedTheme } from '../../theme/tokens';\nimport { isTouchDevice } from '../../utils/device';\nimport { Spinner } from '../Spinner';\n\ninterface FeedbackModeProps {\n resolvedTheme: ResolvedTheme;\n placeholder?: string;\n submitText: string;\n isLoading: boolean;\n onSubmit: (data: { content?: string; rating?: number; isBug?: boolean }) => 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}\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}: 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\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 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 });\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 {/* 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, { 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 { NpsMode } from './modes/NpsMode';\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 isSubmitted: boolean;\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 // Handlers\n onSubmit: (data: { content?: string; rating?: number; vote?: 'up' | 'down'; pollSelected?: string[]; isBug?: boolean }) => void;\n onClose: () => void;\n // Position info from parent\n anchorRect?: DOMRect;\n}\n\nexport function GotchaModal({\n mode,\n theme,\n customStyles,\n promptText,\n placeholder,\n submitText,\n thankYouMessage,\n isLoading,\n isSubmitted,\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 onSubmit,\n onClose,\n anchorRect,\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 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 : {\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 {/* Form content based on mode */}\n {!isSubmitted && (\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 />\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 { 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\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\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 onePerUser = false,\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 } = useGotchaContext();\n const [isSubmitted, setIsSubmitted] = useState(false);\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\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 const isOpen = activeModalId === elementId;\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, error, existingResponse, isEditing } = useSubmit({\n elementId,\n mode,\n pollOptions: options,\n user,\n onSuccess: (response) => {\n setIsSubmitted(true);\n onSubmit?.(response);\n autoCloseTimerRef.current = setTimeout(() => {\n closeModal();\n setIsSubmitted(false);\n }, 3000);\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 setIsSubmitted(false);\n onClose?.();\n }, [closeModal, onClose]);\n\n const handleSubmit = useCallback(\n (data: { content?: string; rating?: number; vote?: 'up' | 'down'; pollSelected?: string[]; isBug?: boolean }) => {\n submit(data);\n },\n [submit]\n );\n\n const effectiveSubmitText = isEditing ? 'Update' : submitText;\n\n if (disabled || !visible) 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 isSubmitted,\n error,\n existingResponse,\n 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 onSubmit: handleSubmit,\n onClose: handleClose,\n anchorRect: anchorRect || undefined,\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 />\n\n {isOpen && !isMobile && (\n <GotchaModal {...modalProps} />\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 } = 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 };\n}\n"]}
1
+ {"version":3,"sources":["../src/constants.ts","../src/utils/anonymous.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/utils/cn.ts","../src/utils/device.ts","../src/components/GotchaButton.tsx","../src/components/Spinner.tsx","../src/components/modes/FeedbackMode.tsx","../src/components/modes/VoteMode.tsx","../src/components/modes/PollMode.tsx","../src/components/modes/NpsMode.tsx","../src/components/GotchaModal.tsx","../src/components/Gotcha.tsx","../src/hooks/useScore.ts","../src/components/GotchaScore.tsx","../src/hooks/useGotcha.ts"],"names":["API_BASE_URL","STORAGE_KEYS","DEFAULTS","RETRY_CONFIG","getAnonymousId","stored","id","DEFAULT_RETRY_CONFIG","fetchWithRetry","url","options","config","debug","lastError","attempt","response","error","delay","resolve","createApiClient","apiKey","baseUrl","headers","request","method","endpoint","body","idempotencyKey","data","payload","user","fullPayload","elementId","userId","responseId","UNSAFE_KEYS","deepMerge","base","override","result","key","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","value","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","openModal","useCallback","closeModal","jsx","useGotchaContext","context","useContext","useSubmit","isLoading","setIsLoading","isCheckingExisting","setIsCheckingExisting","setError","existingResponse","setExistingResponse","cancelled","existing","err","errorMessage","cn","classes","isTouchDevice","getResponsiveSize","size","isTouch","sizes","getInitialSystemTheme","GotchaButton","customStyles","showOnHover","touchBehavior","onClick","isOpen","isParentHovered","animated","setIsTouch","tapRevealed","setTapRevealed","setSystemTheme","isHovered","setIsHovered","isPressed","setIsPressed","hasPopped","setHasPopped","darkQuery","handler","e","shouldShow","timer","handleClick","buttonSize","t","getTransform","baseStyles","GotchaIcon","mounted","setMounted","Spinner","color","jsxs","FeedbackMode","placeholder","submitText","onSubmit","initialValues","isEditing","showText","showRating","enableBugFlag","bugFlagLabel","content","setContent","rating","setRating","isBug","setIsBug","canSubmit","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","GotchaModal","mode","promptText","thankYouMessage","isSubmitted","voteLabels","npsQuestion","npsFollowUp","npsFollowUpPlaceholder","npsLowLabel","npsHighLabel","onClose","anchorRect","useFixedPosition","modalRef","firstFocusableRef","onCloseRef","isMobile","setIsMobile","showAbove","modal","handleKeyDown","focusableElements","firstElement","lastElement","defaultPrompt","modalPadding","modalWidth","animationClass","viewportHeight","modalStyles","fadeUpStyle","isDefaultThankYou","Gotcha","onePerUser","position","visible","onOpen","onError","setIsSubmitted","setIsParentHovered","setAnchorRect","hasMounted","setHasMounted","containerRef","autoCloseTimerRef","container","parent","handleMouseEnter","handleMouseLeave","submit","handleOpen","handleClose","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"],"mappings":"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","file":"index.js","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} 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","import { STORAGE_KEYS } from '../constants';\n\n/**\n * Get or create an anonymous user ID\n * Stored in localStorage for consistency across sessions\n */\nexport function getAnonymousId(): string {\n if (typeof window === 'undefined') {\n // SSR fallback - generate but don't persist\n return `anon_${crypto.randomUUID()}`;\n }\n\n try {\n const stored = localStorage.getItem(STORAGE_KEYS.ANONYMOUS_ID);\n if (stored) return stored;\n\n const id = `anon_${crypto.randomUUID()}`;\n localStorage.setItem(STORAGE_KEYS.ANONYMOUS_ID, id);\n return id;\n } catch {\n // localStorage unavailable (incognito Safari, sandboxed iframes)\n return `anon_${crypto.randomUUID()}`;\n }\n}\n\n/**\n * Clear the anonymous ID (useful for testing)\n */\nexport function clearAnonymousId(): void {\n if (typeof window !== 'undefined') {\n localStorage.removeItem(STORAGE_KEYS.ANONYMOUS_ID);\n }\n}\n","import { API_BASE_URL, RETRY_CONFIG } from '../constants';\nimport { SubmitResponsePayload, GotchaResponse, GotchaError, ExistingResponse, VoteType, ScoreData } from '../types';\nimport { getAnonymousId } from '../utils/anonymous';\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 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 = crypto.randomUUID();\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: {\n url: typeof window !== 'undefined' ? window.location.origin + window.location.pathname : undefined,\n userAgent: typeof navigator !== 'undefined' ? navigator.userAgent : undefined,\n },\n // Only include isBug if true\n ...(payload.isBug ? { isBug: true } : {}),\n };\n\n return request<GotchaResponse>('POST', '/responses', fullPayload);\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 * 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';\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 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 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}\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\n useEffect(() => {\n const userId = options.user?.id || defaultUser?.id;\n if (!userId) {\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 setExistingResponse(existing);\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]);\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 we have an existing response and a user ID, update instead of create\n if (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 user: { ...defaultUser, ...options.user },\n });\n }\n\n // Update existingResponse so isEditing flips to true after first submit\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 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","/**\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}\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}: 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 </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, { useState, useEffect, useRef } from 'react';\nimport { GotchaStyles } from '../../types';\nimport { ResolvedTheme } from '../../theme/tokens';\nimport { isTouchDevice } from '../../utils/device';\nimport { Spinner } from '../Spinner';\n\ninterface FeedbackModeProps {\n resolvedTheme: ResolvedTheme;\n placeholder?: string;\n submitText: string;\n isLoading: boolean;\n onSubmit: (data: { content?: string; rating?: number; isBug?: boolean }) => 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}\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}: 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\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 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 });\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 {/* 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, { 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 { NpsMode } from './modes/NpsMode';\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 isSubmitted: boolean;\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 // Handlers\n onSubmit: (data: { content?: string; rating?: number; vote?: 'up' | 'down'; pollSelected?: string[]; isBug?: boolean }) => 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 isSubmitted,\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 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 {/* Form content based on mode */}\n {!isSubmitted && (\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 />\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 { 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\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\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 onePerUser = false,\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 } = useGotchaContext();\n const [isSubmitted, setIsSubmitted] = useState(false);\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\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 const isOpen = activeModalId === elementId;\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, error, existingResponse, isEditing } = useSubmit({\n elementId,\n mode,\n pollOptions: options,\n user,\n onSuccess: (response) => {\n setIsSubmitted(true);\n onSubmit?.(response);\n autoCloseTimerRef.current = setTimeout(() => {\n closeModal();\n setIsSubmitted(false);\n }, 3000);\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 setIsSubmitted(false);\n onClose?.();\n }, [closeModal, onClose]);\n\n const handleSubmit = useCallback(\n (data: { content?: string; rating?: number; vote?: 'up' | 'down'; pollSelected?: string[]; isBug?: boolean }) => {\n submit(data);\n },\n [submit]\n );\n\n const effectiveSubmitText = isEditing ? 'Update' : submitText;\n\n if (disabled || !visible) 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 isSubmitted,\n error,\n existingResponse,\n 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 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 />\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 } = 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 };\n}\n"]}