gotcha-feedback 1.0.18 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/constants.ts","../src/utils/anonymous.ts","../src/api/client.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/GotchaModal.tsx","../src/components/Gotcha.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","GotchaContext","createContext","GotchaProvider","children","disabled","defaultUser","activeModalId","setActiveModalId","useState","client","useMemo","openModal","useCallback","closeModal","value","jsx","useGotchaContext","context","useContext","useSubmit","isLoading","setIsLoading","isCheckingExisting","setIsCheckingExisting","setError","existingResponse","setExistingResponse","useEffect","cancelled","existing","err","errorMessage","cn","classes","isTouchDevice","getResponsiveSize","size","isTouch","sizes","getInitialSystemTheme","GotchaButton","theme","customStyles","showOnHover","touchBehavior","onClick","isOpen","isParentHovered","setIsTouch","tapRevealed","setTapRevealed","systemTheme","setSystemTheme","darkQuery","handler","e","shouldShow","handleClick","buttonSize","isDark","baseStyles","GotchaIcon","FONT_ID","useCarterOneFont","link","Spinner","color","jsxs","FeedbackMode","placeholder","submitText","onSubmit","initialValues","isEditing","showText","showRating","content","setContent","rating","setRating","canSubmit","handleSubmit","inputStyles","buttonStyles","StarRating","onChange","large","hovered","setHovered","starSize","buttonPadding","star","isFilled","VoteMode","initialVote","labels","activeVote","setActiveVote","previousVote","setPreviousVote","handleVote","vote","getButtonStyles","voteType","isSelected","iconSize","Fragment","ThumbsUpIcon","ThumbsDownIcon","PollMode","allowMultiple","initialSelected","selected","setSelected","handleToggle","option","prev","o","getOptionStyles","GotchaModal","mode","promptText","thankYouMessage","isSubmitted","voteLabels","onClose","anchorRect","modalRef","useRef","firstFocusableRef","isVisible","setIsVisible","isMobile","setIsMobile","timer","resolvedTheme","showAbove","modal","handleKeyDown","focusableElements","firstElement","lastElement","defaultPrompt","modalPadding","layeredShadow","modalStyles","Gotcha","experimentId","variant","showResults","position","visible","onOpen","onError","setIsSubmitted","setIsParentHovered","setAnchorRect","containerRef","container","parent","handleMouseEnter","handleMouseLeave","submit","handleOpen","handleClose","createPortal","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: 'Thanks for your feedback!',\n} as const;\n\n// Size mappings (desktop/mobile in pixels)\nexport const SIZE_MAP = {\n sm: { desktop: 24, mobile: 44 },\n md: { desktop: 32, mobile: 44 },\n lg: { desktop: 40, mobile: 48 },\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 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}\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 } 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 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:`, 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.href : undefined,\n userAgent: typeof navigator !== 'undefined' ? navigator.userAgent : undefined,\n },\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 the base URL (for debugging)\n */\n getBaseUrl(): string {\n return baseUrl;\n },\n };\n}\n\nexport type ApiClient = ReturnType<typeof createApiClient>;\n","import React, { createContext, useContext, useMemo, useState, useCallback } from 'react';\nimport { createApiClient, ApiClient } from '../api/client';\nimport { GotchaUser } from '../types';\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}\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}\n\nconst GotchaContext = createContext<GotchaContextValue | null>(null);\n\nexport function GotchaProvider({\n apiKey,\n children,\n baseUrl,\n debug = false,\n disabled = false,\n defaultUser = {},\n}: GotchaProviderProps) {\n const [activeModalId, setActiveModalId] = useState<string | null>(null);\n\n const client = useMemo(\n () => createApiClient({ apiKey, baseUrl, debug }),\n [apiKey, baseUrl, debug]\n );\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,\n debug,\n activeModalId,\n openModal,\n closeModal,\n }),\n [client, disabled, defaultUser, debug, activeModalId, openModal, closeModal]\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 experimentId?: string;\n variant?: string;\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}\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 experimentId: options.experimentId,\n variant: options.variant,\n user: { ...defaultUser, ...options.user },\n });\n }\n\n options.onSuccess?.(response);\n return response;\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Something went wrong';\n setError(errorMessage);\n options.onError?.(err instanceof Error ? err : new Error(errorMessage));\n throw err;\n } finally {\n setIsLoading(false);\n }\n },\n [client, defaultUser, options, existingResponse]\n );\n\n return {\n submit,\n isLoading,\n isCheckingExisting,\n error,\n existingResponse,\n isEditing: !!existingResponse,\n clearError: () => setError(null),\n };\n}\n","/**\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: 32 },\n md: { desktop: 32, mobile: 36 },\n lg: { desktop: 40, mobile: 40 },\n };\n\n return isTouch ? sizes[size].mobile : sizes[size].desktop;\n};\n","import React, { useState, useEffect } from 'react';\nimport { Size, Theme, GotchaStyles } from '../types';\nimport { cn } from '../utils/cn';\nimport { isTouchDevice, getResponsiveSize } from '../utils/device';\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}\n\n/**\n * Detect system color-scheme preference synchronously where possible,\n * falling back to 'light'. This avoids the flash that occurred when\n * the old code always initialised state as 'light' and corrected it\n * inside useEffect.\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}: GotchaButtonProps) {\n const [isTouch, setIsTouch] = useState(false);\n const [tapRevealed, setTapRevealed] = useState(false);\n const [systemTheme, setSystemTheme] = useState<'light' | 'dark'>(getInitialSystemTheme);\n\n useEffect(() => {\n setIsTouch(isTouchDevice());\n\n // Keep systemTheme in sync when user changes OS preference\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 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\n // ── Resolve theme ────────────────────────────────────────────────\n // \"auto\" must produce the *exact* same styles as the explicit theme\n // it resolves to. Previously the initial state defaulted to 'light'\n // regardless of the actual preference, causing a mismatch on the\n // first render when the system was dark.\n const resolvedTheme = theme === 'auto' ? systemTheme : theme;\n const isDark = resolvedTheme === 'dark';\n\n // ── Glass-bubble styles ──────────────────────────────────────────\n // Simulates a raised glass dome / marble sitting on the surface:\n // - Bright borderTop highlight mimics light hitting the top edge\n // - Subtle darker base border grounds the bottom\n // - Vertical gradient: bright at top, more opaque at bottom\n // - Inset top shadow for inner refraction glow\n // - Inset bottom shadow for depth within the dome\n // - Outer shadow to anchor the bubble to the surface\n const baseStyles: React.CSSProperties = {\n width: buttonSize,\n height: buttonSize,\n borderRadius: '50%',\n border: isDark\n ? '1px solid rgba(255,255,255,0.15)'\n : 'none',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n background: isDark\n ? '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 : '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 backdropFilter: 'blur(16px) saturate(170%)',\n WebkitBackdropFilter: 'blur(16px) saturate(170%)',\n color: isDark ? 'rgba(255,255,255,0.88)' : 'rgba(0,0,0,0.75)',\n boxShadow: isDark\n ? '0 4px 14px rgba(0,0,0,0.45), 0 1px 3px rgba(0,0,0,0.35)'\n : '0 3px 12px rgba(0,0,0,0.12), 0 0 1px rgba(0,0,0,0.2)',\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n opacity: shouldShow ? 1 : 0,\n transform: shouldShow ? 'scale(1)' : 'scale(0.6)',\n pointerEvents: shouldShow ? 'auto' : 'none',\n ...customStyles?.button,\n };\n\n return (\n <button\n type=\"button\"\n onClick={handleClick}\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} />\n </button>\n );\n}\n\nconst FONT_ID = 'gotcha-carter-one';\n\nfunction useCarterOneFont() {\n useEffect(() => {\n if (document.getElementById(FONT_ID)) return;\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&display=swap';\n document.head.appendChild(link);\n }, []);\n}\n\nfunction GotchaIcon({ size }: { size: number }) {\n useCarterOneFont();\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 }}\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 <style>\n {`\n @keyframes gotcha-spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\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 </style>\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 } from 'react';\nimport { GotchaStyles } from '../../types';\nimport { isTouchDevice } from '../../utils/device';\nimport { Spinner } from '../Spinner';\n\ninterface FeedbackModeProps {\n theme: 'light' | 'dark' | 'custom';\n placeholder?: string;\n submitText: string;\n isLoading: boolean;\n onSubmit: (data: { content?: string; rating?: number }) => void;\n customStyles?: GotchaStyles;\n initialValues?: {\n content?: string | null;\n rating?: number | null;\n };\n isEditing?: boolean;\n /** Show the text input (default: true) */\n showText?: boolean;\n /** Show the star rating (default: true) */\n showRating?: boolean;\n}\n\nexport function FeedbackMode({\n theme,\n placeholder,\n submitText,\n isLoading,\n onSubmit,\n customStyles,\n initialValues,\n isEditing = false,\n showText = true,\n showRating = true,\n}: FeedbackModeProps) {\n const [content, setContent] = useState(initialValues?.content || '');\n const [rating, setRating] = useState<number | null>(initialValues?.rating ?? null);\n const [isTouch, setIsTouch] = useState(false);\n\n useEffect(() => {\n setIsTouch(isTouchDevice());\n }, []);\n\n // Update local state when initialValues change (e.g., after loading existing response)\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 isDark = theme === 'dark';\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 });\n };\n\n const inputStyles: React.CSSProperties = {\n width: '100%',\n padding: isTouch ? '12px 14px' : '10px 12px',\n border: `1px solid ${isDark ? 'rgba(255,255,255,0.08)' : '#e2e8f0'}`,\n borderRadius: 8,\n backgroundColor: isDark ? 'rgba(55,65,81,0.5)' : '#fafbfc',\n color: isDark ? '#f9fafb' : '#111827',\n fontSize: isTouch ? 16 : 14, // 16px prevents iOS zoom on focus\n resize: 'vertical',\n minHeight: isTouch ? 100 : 80,\n fontFamily: 'inherit',\n outline: 'none',\n transition: 'border-color 0.2s cubic-bezier(0.4, 0, 0.2, 1), box-shadow 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n lineHeight: 1.5,\n ...customStyles?.input,\n };\n\n const buttonStyles: React.CSSProperties = {\n width: '100%',\n padding: isTouch ? '14px 16px' : '10px 16px',\n border: 'none',\n borderRadius: 8,\n backgroundColor: isDark ? '#e2e8f0' : '#1e293b',\n color: isDark ? '#1e293b' : '#ffffff',\n fontSize: isTouch ? 16 : 14,\n fontWeight: 500,\n cursor: isLoading ? 'not-allowed' : 'pointer',\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\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} isDark={isDark} 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 style={inputStyles}\n disabled={isLoading}\n aria-label=\"Your feedback\"\n onFocus={(e) => {\n e.currentTarget.style.borderColor = '#1e293b';\n e.currentTarget.style.boxShadow = '0 0 0 2px rgba(30,41,59,0.15)';\n e.currentTarget.style.backgroundColor = isDark ? 'rgba(55,65,81,0.7)' : '#ffffff';\n }}\n onBlur={(e) => {\n e.currentTarget.style.borderColor = isDark ? 'rgba(255,255,255,0.08)' : '#e2e8f0';\n e.currentTarget.style.boxShadow = 'none';\n e.currentTarget.style.backgroundColor = isDark ? 'rgba(55,65,81,0.5)' : '#fafbfc';\n }}\n />\n )}\n\n {/* Submit button */}\n <button\n type=\"submit\"\n disabled={isLoading || !canSubmit}\n style={{\n ...buttonStyles,\n marginTop: 12,\n opacity: isLoading ? 0.8 : 1,\n backgroundColor: !canSubmit\n ? (isDark ? '#374151' : '#e2e8f0')\n : (isDark ? '#e2e8f0' : '#1e293b'),\n color: !canSubmit\n ? (isDark ? '#6b7280' : '#94a3b8')\n : (isDark ? '#1e293b' : '#ffffff'),\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 8,\n }}\n onMouseEnter={(e) => {\n if (!e.currentTarget.disabled) {\n e.currentTarget.style.backgroundColor = isDark ? '#cbd5e1' : '#334155';\n }\n }}\n onMouseLeave={(e) => {\n if (!e.currentTarget.disabled) {\n e.currentTarget.style.backgroundColor = isDark ? '#e2e8f0' : '#1e293b';\n }\n }}\n >\n {isLoading && <Spinner size={isTouch ? 18 : 16} color={isDark ? '#1e293b' : '#ffffff'} />}\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 isDark: boolean;\n isTouch: boolean;\n large?: boolean;\n}\n\nfunction StarRating({ value, onChange, isDark, isTouch, large = false }: StarRatingProps) {\n const [hovered, setHovered] = useState<number | null>(null);\n const starSize = large ? (isTouch ? 36 : 28) : (isTouch ? 28 : 18);\n const buttonPadding = large ? (isTouch ? 8 : 5) : (isTouch ? 6 : 3);\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={() => onChange(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 ? '#f59e0b' : (isDark ? 'rgba(255,255,255,0.12)' : '#e2e8f0'),\n transition: 'color 0.15s cubic-bezier(0.4, 0, 0.2, 1), transform 0.15s cubic-bezier(0.4, 0, 0.2, 1)',\n transform: (hovered !== null && hovered >= star) ? 'scale(1.1)' : 'scale(1)',\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 { isTouchDevice } from '../../utils/device';\nimport { Spinner } from '../Spinner';\n\ninterface VoteModeProps {\n theme: 'light' | 'dark' | 'custom';\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({ theme, 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 // Update when initialVote changes (e.g., after loading existing response)\n useEffect(() => {\n if (initialVote !== undefined) {\n setPreviousVote(initialVote);\n setActiveVote(initialVote);\n }\n }, [initialVote]);\n\n // Reset active vote when loading completes (but keep previous vote for edit mode)\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 isDark = theme === 'dark';\n\n const getButtonStyles = (voteType: 'up' | 'down'): React.CSSProperties => {\n const isSelected = previousVote === voteType;\n const selectedColor = voteType === 'up' ? '#10b981' : '#ef4444';\n return {\n flex: 1,\n minWidth: 0,\n overflow: 'hidden' as const,\n padding: isTouch ? '14px 18px' : '10px 14px',\n border: `1px solid ${isSelected\n ? (voteType === 'up'\n ? (isDark ? 'rgba(16,185,129,0.3)' : 'rgba(16,185,129,0.25)')\n : (isDark ? 'rgba(239,68,68,0.3)' : 'rgba(239,68,68,0.25)'))\n : (isDark ? 'rgba(255,255,255,0.08)' : '#e2e8f0')}`,\n borderRadius: isTouch ? 10 : 8,\n backgroundColor: isSelected\n ? (voteType === 'up'\n ? (isDark ? 'rgba(16,185,129,0.08)' : 'rgba(16,185,129,0.06)')\n : (isDark ? 'rgba(239,68,68,0.08)' : 'rgba(239,68,68,0.06)'))\n : (isDark ? 'rgba(55,65,81,0.5)' : '#fafbfc'),\n color: isSelected\n ? selectedColor\n : (isDark ? '#d1d5db' : '#64748b'),\n fontSize: isTouch ? 28 : 24,\n cursor: isLoading ? 'not-allowed' : 'pointer',\n transition: 'background-color 0.2s, border-color 0.2s, color 0.2s, transform 0.2s, box-shadow 0.2s',\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(-1px)';\n e.currentTarget.style.boxShadow = '0 2px 8px rgba(0,0,0,0.06)';\n }\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.transform = 'translateY(0)';\n e.currentTarget.style.boxShadow = 'none';\n }}\n >\n {isLoading && activeVote === 'up' ? (\n <>\n <Spinner size={iconSize} color={isDark ? '#f9fafb' : '#111827'} />\n <span style={{ fontSize: isTouch ? 15 : 13, fontWeight: 500, letterSpacing: '0.01em' }}>\n {isEditing ? 'Updating...' : 'Sending...'}\n </span>\n </>\n ) : (\n <>\n <ThumbsUpIcon size={iconSize} />\n <span style={{ fontSize: isTouch ? 15 : 13, fontWeight: 500, 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(-1px)';\n e.currentTarget.style.boxShadow = '0 2px 8px rgba(0,0,0,0.06)';\n }\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.transform = 'translateY(0)';\n e.currentTarget.style.boxShadow = 'none';\n }}\n >\n {isLoading && activeVote === 'down' ? (\n <>\n <Spinner size={iconSize} color={isDark ? '#f9fafb' : '#111827'} />\n <span style={{ fontSize: isTouch ? 15 : 13, fontWeight: 500, letterSpacing: '0.01em' }}>\n {isEditing ? 'Updating...' : 'Sending...'}\n </span>\n </>\n ) : (\n <>\n <ThumbsDownIcon size={iconSize} />\n <span style={{ fontSize: isTouch ? 15 : 13, fontWeight: 500, 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 { isTouchDevice } from '../../utils/device';\nimport { Spinner } from '../Spinner';\n\ninterface PollModeProps {\n theme: 'light' | 'dark' | 'custom';\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 theme,\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 isDark = theme === 'dark';\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): 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\n ? (isDark ? 'rgba(226,232,240,0.25)' : 'rgba(30,41,59,0.25)')\n : (isDark ? 'rgba(255,255,255,0.08)' : '#e2e8f0')}`,\n borderRadius: isTouch ? 10 : 8,\n backgroundColor: isSelected\n ? (isDark ? 'rgba(226,232,240,0.08)' : 'rgba(30,41,59,0.05)')\n : (isDark ? 'rgba(55,65,81,0.5)' : '#fafbfc'),\n color: isSelected\n ? (isDark ? '#e2e8f0' : '#1e293b')\n : (isDark ? '#d1d5db' : '#374151'),\n fontSize: isTouch ? 15 : 13,\n fontWeight: 500,\n cursor: isLoading ? 'not-allowed' : 'pointer',\n transition: 'background-color 0.2s, border-color 0.2s, color 0.2s',\n textAlign: 'left' as const,\n letterSpacing: '0.01em',\n display: 'flex',\n alignItems: 'center',\n gap: 8,\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) => {\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)}\n aria-pressed={isSelected}\n >\n <span\n style={{\n width: 16,\n height: 16,\n borderRadius: allowMultiple ? 4 : '50%',\n border: `2px solid ${isSelected\n ? (isDark ? '#e2e8f0' : '#1e293b')\n : (isDark ? 'rgba(255,255,255,0.2)' : '#cbd5e1')}`,\n backgroundColor: isSelected\n ? (isDark ? '#e2e8f0' : '#1e293b')\n : 'transparent',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n transition: 'all 0.15s',\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: 'none',\n borderRadius: 8,\n backgroundColor: selected.length === 0\n ? (isDark ? '#374151' : '#e2e8f0')\n : (isDark ? '#e2e8f0' : '#1e293b'),\n color: selected.length === 0\n ? (isDark ? '#6b7280' : '#94a3b8')\n : (isDark ? '#1e293b' : '#ffffff'),\n fontSize: isTouch ? 16 : 14,\n fontWeight: 500,\n cursor: isLoading || selected.length === 0 ? 'not-allowed' : 'pointer',\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n letterSpacing: '0.01em',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 8,\n opacity: isLoading ? 0.8 : 1,\n }}\n onMouseEnter={(e) => {\n if (!e.currentTarget.disabled) {\n e.currentTarget.style.backgroundColor = isDark ? '#cbd5e1' : '#334155';\n }\n }}\n onMouseLeave={(e) => {\n if (!e.currentTarget.disabled) {\n e.currentTarget.style.backgroundColor = selected.length === 0\n ? (isDark ? '#374151' : '#e2e8f0')\n : (isDark ? '#e2e8f0' : '#1e293b');\n }\n }}\n >\n {isLoading && <Spinner size={isTouch ? 18 : 16} color={isDark ? '#1e293b' : '#ffffff'} />}\n {isLoading ? (isEditing ? 'Updating...' : 'Submitting...') : (isEditing ? 'Update' : 'Submit')}\n </button>\n </div>\n );\n}\n","import React, { useRef, useEffect, useState } from 'react';\nimport { Theme, GotchaStyles, ResponseMode, ExistingResponse } from '../types';\nimport { cn } from '../utils/cn';\nimport { FeedbackMode } from './modes/FeedbackMode';\nimport { VoteMode } from './modes/VoteMode';\nimport { PollMode } from './modes/PollMode';\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 /** 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 // Poll mode\n options?: string[];\n allowMultiple?: boolean;\n // Handlers\n onSubmit: (data: { content?: string; rating?: number; vote?: 'up' | 'down'; pollSelected?: string[] }) => 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 onSubmit,\n onClose,\n anchorRect,\n}: GotchaModalProps) {\n const modalRef = useRef<HTMLDivElement>(null);\n const firstFocusableRef = useRef<HTMLButtonElement>(null);\n const [isVisible, setIsVisible] = useState(false);\n const [isMobile, setIsMobile] = useState(false);\n const [systemTheme, setSystemTheme] = useState<'light' | 'dark'>('light');\n\n // Detect mobile and system theme after mount (SSR-safe)\n useEffect(() => {\n setIsMobile(window.innerWidth < 640);\n\n // Detect system theme preference\n const darkQuery = window.matchMedia('(prefers-color-scheme: dark)');\n setSystemTheme(darkQuery.matches ? 'dark' : 'light');\n\n // Listen for theme changes\n const handler = (e: MediaQueryListEvent) => setSystemTheme(e.matches ? 'dark' : 'light');\n darkQuery.addEventListener('change', handler);\n return () => darkQuery.removeEventListener('change', handler);\n }, []);\n\n // Trigger animation after mount\n useEffect(() => {\n const timer = requestAnimationFrame(() => setIsVisible(true));\n return () => cancelAnimationFrame(timer);\n }, []);\n\n // Resolve theme\n const resolvedTheme = theme === 'auto' ? systemTheme : theme;\n\n const isDark = resolvedTheme === 'dark';\n\n // Determine if modal should appear above or below\n const modalHeight = 280; // approximate modal height\n const spaceBelow = anchorRect\n ? window.innerHeight - anchorRect.bottom\n : window.innerHeight / 2;\n const showAbove = spaceBelow < modalHeight + 20;\n\n // Focus trap\n useEffect(() => {\n const modal = modalRef.current;\n if (!modal) return;\n\n // Focus first element\n firstFocusableRef.current?.focus();\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n onClose();\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 }, [onClose]);\n\n const defaultPrompt = mode === 'vote'\n ? 'What do you think?'\n : mode === 'poll'\n ? 'Cast your vote'\n : 'What do you think of this feature?';\n\n // Responsive sizing - on mobile, use fixed positioning centered on screen\n const modalPadding = isMobile ? 20 : 16;\n\n const layeredShadow = isDark\n ? '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)'\n : '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)';\n\n const modalStyles: React.CSSProperties = isMobile\n ? {\n // Mobile: fixed position, centered on screen\n position: 'fixed',\n left: '50%',\n top: '50%',\n width: 'calc(100vw - 32px)',\n maxWidth: 320,\n padding: modalPadding,\n borderRadius: 12,\n backgroundColor: isDark ? '#1f2937' : '#ffffff',\n color: isDark ? '#f9fafb' : '#111827',\n boxShadow: layeredShadow,\n border: `1px solid ${isDark ? 'rgba(255,255,255,0.06)' : 'rgba(0,0,0,0.06)'}`,\n zIndex: 9999,\n transition: 'opacity 0.25s cubic-bezier(0.4, 0, 0.2, 1), transform 0.25s cubic-bezier(0.4, 0, 0.2, 1)',\n opacity: isVisible ? 1 : 0,\n transform: isVisible\n ? 'translate(-50%, -50%) scale(1)'\n : 'translate(-50%, -50%) scale(0.96)',\n ...customStyles?.modal,\n textAlign: 'left',\n }\n : {\n // Desktop: absolute position relative to button\n position: 'absolute',\n left: '50%',\n width: 320,\n padding: modalPadding,\n borderRadius: 10,\n backgroundColor: isDark ? '#1f2937' : '#ffffff',\n color: isDark ? '#f9fafb' : '#111827',\n boxShadow: layeredShadow,\n border: `1px solid ${isDark ? 'rgba(255,255,255,0.06)' : 'rgba(0,0,0,0.06)'}`,\n zIndex: 9999,\n ...(showAbove\n ? { bottom: '100%', marginBottom: 8 }\n : { top: '100%', marginTop: 8 }),\n transition: 'opacity 0.25s cubic-bezier(0.4, 0, 0.2, 1), transform 0.25s cubic-bezier(0.4, 0, 0.2, 1)',\n opacity: isVisible ? 1 : 0,\n transform: isVisible\n ? 'translateX(-50%) scale(1) translateY(0)'\n : `translateX(-50%) scale(0.96) translateY(${showAbove ? '6px' : '-6px'})`,\n ...customStyles?.modal,\n textAlign: 'left',\n };\n\n return (\n <div\n ref={modalRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"gotcha-modal-title\"\n style={modalStyles}\n className={cn('gotcha-modal', isDark && 'gotcha-modal--dark')}\n >\n {/* Close button - larger on touch devices */}\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 ? 12 : 8,\n right: isMobile ? 12 : 8,\n width: isMobile ? 36 : 28,\n height: isMobile ? 36 : 28,\n border: 'none',\n background: 'transparent',\n cursor: 'pointer',\n color: isDark ? '#6b7280' : '#9ca3af',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: 6,\n transition: 'all 0.15s cubic-bezier(0.4, 0, 0.2, 1)',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = isDark ? 'rgba(255,255,255,0.06)' : 'rgba(0,0,0,0.04)';\n e.currentTarget.style.color = isDark ? '#9ca3af' : '#6b7280';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent';\n e.currentTarget.style.color = isDark ? '#6b7280' : '#9ca3af';\n }}\n >\n <svg width={isMobile ? 16 : 12} height={isMobile ? 16 : 12} 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 <h2\n id=\"gotcha-modal-title\"\n style={{\n margin: '0 0 16px 0',\n fontSize: isMobile ? 16 : 14,\n fontWeight: 600,\n paddingRight: isMobile ? 40 : 32,\n letterSpacing: '-0.01em',\n lineHeight: 1.4,\n textAlign: 'left',\n }}\n >\n {promptText || defaultPrompt}\n </h2>\n\n {/* Success state */}\n {isSubmitted && (\n <div\n style={{\n textAlign: 'center',\n padding: '24px 0',\n color: isDark ? '#10b981' : '#059669',\n }}\n >\n <div\n style={{\n width: 44,\n height: 44,\n borderRadius: '50%',\n backgroundColor: isDark ? 'rgba(16,185,129,0.1)' : 'rgba(5,150,105,0.08)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n margin: '0 auto 12px',\n }}\n >\n <svg\n width=\"22\"\n height=\"22\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n >\n <path\n d=\"M20 6L9 17L4 12\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </div>\n <p style={{ margin: 0, fontSize: 13, fontWeight: 500, color: isDark ? '#d1d5db' : '#374151' }}>\n {thankYouMessage}\n </p>\n </div>\n )}\n\n {/* Error state */}\n {error && !isSubmitted && (\n <div\n style={{\n padding: '8px 10px',\n marginBottom: 12,\n borderRadius: 8,\n backgroundColor: isDark ? 'rgba(127,29,29,0.3)' : '#fef2f2',\n border: `1px solid ${isDark ? 'rgba(254,202,202,0.1)' : 'rgba(220,38,38,0.1)'}`,\n color: isDark ? '#fecaca' : '#dc2626',\n fontSize: 13,\n lineHeight: 1.4,\n }}\n >\n {error}\n </div>\n )}\n\n {/* Form content based on mode */}\n {!isSubmitted && (\n <>\n {mode === 'feedback' && (\n <FeedbackMode\n theme={resolvedTheme}\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 />\n )}\n {mode === 'vote' && (\n <VoteMode\n theme={resolvedTheme}\n isLoading={isLoading}\n onSubmit={onSubmit}\n initialVote={existingResponse?.vote || undefined}\n isEditing={isEditing}\n labels={voteLabels}\n />\n )}\n {mode === 'poll' && options && options.length > 0 && (\n <PollMode\n theme={resolvedTheme}\n options={options}\n allowMultiple={allowMultiple}\n isLoading={isLoading}\n onSubmit={onSubmit}\n initialSelected={existingResponse?.pollSelected || undefined}\n isEditing={isEditing}\n />\n )}\n </>\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 /** Required if mode is 'ab' */\n experimentId?: string;\n /** Current A/B variant shown to user */\n variant?: string;\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 (Phase 2)\n /** Required if mode is 'poll' (2-6 options) */\n options?: string[];\n /** Allow selecting multiple options */\n allowMultiple?: boolean;\n /** Show results after voting */\n showResults?: boolean;\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 // 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 experimentId,\n variant,\n voteLabels,\n options,\n allowMultiple = false,\n showResults = 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 containerRef = useRef<HTMLDivElement>(null);\n\n // Detect mobile for portal rendering (SSR-safe)\n useEffect(() => {\n setIsMobile(window.innerWidth < 640);\n }, []);\n\n // This instance's modal is open if activeModalId matches our elementId\n const isOpen = activeModalId === elementId;\n\n // Attach hover listeners to the parent element (not the button container)\n useEffect(() => {\n if (!showOnHover) return;\n\n const container = containerRef.current;\n if (!container) return;\n\n // Find the parent element with position: relative\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 experimentId,\n variant,\n pollOptions: options,\n user,\n onSuccess: (response) => {\n setIsSubmitted(true);\n onSubmit?.(response);\n // Auto-close after 3 seconds\n 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 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[] }) => {\n submit(data);\n },\n [submit]\n );\n\n // Don't render if disabled or not visible\n if (disabled || !visible) return null;\n\n // Position styles\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 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 />\n\n {isOpen && !isMobile && (\n <GotchaModal\n mode={mode}\n theme={theme}\n customStyles={customStyles}\n promptText={promptText}\n placeholder={placeholder}\n submitText={submitText}\n thankYouMessage={isEditing ? 'Your feedback has been updated!' : thankYouMessage}\n isLoading={isLoading}\n isSubmitted={isSubmitted}\n error={error}\n existingResponse={existingResponse}\n isEditing={isEditing}\n showText={showText}\n showRating={showRating}\n voteLabels={voteLabels}\n options={options}\n allowMultiple={allowMultiple}\n onSubmit={handleSubmit}\n onClose={handleClose}\n anchorRect={anchorRect || undefined}\n />\n )}\n\n {/* On mobile, render modal via portal to escape parent transform */}\n {isOpen && isMobile && createPortal(\n <div\n style={{\n position: 'fixed',\n inset: 0,\n zIndex: 99999,\n backgroundColor: 'rgba(0, 0, 0, 0.3)',\n }}\n onClick={handleClose}\n aria-hidden=\"true\"\n >\n <div onClick={(e) => e.stopPropagation()}>\n <GotchaModal\n mode={mode}\n theme={theme}\n customStyles={customStyles}\n promptText={promptText}\n placeholder={placeholder}\n submitText={submitText}\n thankYouMessage={isEditing ? 'Your feedback has been updated!' : thankYouMessage}\n isLoading={isLoading}\n isSubmitted={isSubmitted}\n error={error}\n existingResponse={existingResponse}\n isEditing={isEditing}\n showText={showText}\n showRating={showRating}\n voteLabels={voteLabels}\n options={options}\n allowMultiple={allowMultiple}\n onSubmit={handleSubmit}\n onClose={handleClose}\n anchorRect={anchorRect || undefined}\n />\n </div>\n </div>,\n document.body\n )}\n </div>\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/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","GotchaContext","createContext","GotchaProvider","children","disabled","defaultUser","activeModalId","setActiveModalId","useState","client","useMemo","openModal","useCallback","closeModal","value","jsx","useGotchaContext","context","useContext","useSubmit","isLoading","setIsLoading","isCheckingExisting","setIsCheckingExisting","setError","existingResponse","setExistingResponse","useEffect","cancelled","existing","err","errorMessage","cn","classes","isTouchDevice","getResponsiveSize","size","isTouch","sizes","getInitialSystemTheme","GotchaButton","theme","customStyles","showOnHover","touchBehavior","onClick","isOpen","isParentHovered","setIsTouch","tapRevealed","setTapRevealed","systemTheme","setSystemTheme","darkQuery","handler","e","shouldShow","handleClick","buttonSize","isDark","baseStyles","GotchaIcon","FONT_ID","useCarterOneFont","link","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","starSize","buttonPadding","star","isFilled","VoteMode","initialVote","labels","activeVote","setActiveVote","previousVote","setPreviousVote","handleVote","vote","getButtonStyles","voteType","isSelected","iconSize","Fragment","ThumbsUpIcon","ThumbsDownIcon","PollMode","allowMultiple","initialSelected","selected","setSelected","handleToggle","option","prev","o","getOptionStyles","SCORE_COLORS","NpsMode","showFollowUp","followUpPlaceholder","lowLabel","highLabel","score","setScore","hoveredScore","setHoveredScore","_","i","GotchaModal","mode","promptText","thankYouMessage","isSubmitted","voteLabels","npsQuestion","npsFollowUp","npsFollowUpPlaceholder","npsLowLabel","npsHighLabel","onClose","anchorRect","modalRef","useRef","firstFocusableRef","isVisible","setIsVisible","isMobile","setIsMobile","timer","resolvedTheme","showAbove","modal","handleKeyDown","focusableElements","firstElement","lastElement","defaultPrompt","modalPadding","modalWidth","layeredShadow","modalStyles","Gotcha","onePerUser","position","visible","onOpen","onError","setIsSubmitted","setIsParentHovered","setAnchorRect","containerRef","container","parent","handleMouseEnter","handleMouseLeave","submit","handleOpen","handleClose","effectiveSubmitText","createPortal","useScore","refreshInterval","fetchScore","intervalId","SIZE_MAP","resolveTheme","Stars","filledColor","emptyColor","clipId","stars","fill","PositiveBar","rate","height","trackColor","ThumbIcon","GotchaScore","variant","showCount","style","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: 'Thanks for your feedback!',\n} as const;\n\n// Size mappings (desktop/mobile in pixels)\nexport const SIZE_MAP = {\n sm: { desktop: 24, mobile: 44 },\n md: { desktop: 32, mobile: 44 },\n lg: { desktop: 40, mobile: 48 },\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.href : 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","import React, { createContext, useContext, useMemo, useState, useCallback } from 'react';\nimport { createApiClient, ApiClient } from '../api/client';\nimport { GotchaUser } from '../types';\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}\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}\n\nconst GotchaContext = createContext<GotchaContextValue | null>(null);\n\nexport function GotchaProvider({\n apiKey,\n children,\n baseUrl,\n debug = false,\n disabled = false,\n defaultUser = {},\n}: GotchaProviderProps) {\n const [activeModalId, setActiveModalId] = useState<string | null>(null);\n\n const client = useMemo(\n () => createApiClient({ apiKey, baseUrl, debug }),\n [apiKey, baseUrl, debug]\n );\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,\n debug,\n activeModalId,\n openModal,\n closeModal,\n }),\n [client, disabled, defaultUser, debug, activeModalId, openModal, closeModal]\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: 32 },\n md: { desktop: 32, mobile: 36 },\n lg: { desktop: 40, mobile: 40 },\n };\n\n return isTouch ? sizes[size].mobile : sizes[size].desktop;\n};\n","import React, { useState, useEffect } from 'react';\nimport { Size, Theme, GotchaStyles } from '../types';\nimport { cn } from '../utils/cn';\nimport { isTouchDevice, getResponsiveSize } from '../utils/device';\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}\n\n/**\n * Detect system color-scheme preference synchronously where possible,\n * falling back to 'light'. This avoids the flash that occurred when\n * the old code always initialised state as 'light' and corrected it\n * inside useEffect.\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}: GotchaButtonProps) {\n const [isTouch, setIsTouch] = useState(false);\n const [tapRevealed, setTapRevealed] = useState(false);\n const [systemTheme, setSystemTheme] = useState<'light' | 'dark'>(getInitialSystemTheme);\n\n useEffect(() => {\n setIsTouch(isTouchDevice());\n\n // Keep systemTheme in sync when user changes OS preference\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 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\n // ── Resolve theme ────────────────────────────────────────────────\n // \"auto\" must produce the *exact* same styles as the explicit theme\n // it resolves to. Previously the initial state defaulted to 'light'\n // regardless of the actual preference, causing a mismatch on the\n // first render when the system was dark.\n const resolvedTheme = theme === 'auto' ? systemTheme : theme;\n const isDark = resolvedTheme === 'dark';\n\n // ── Glass-bubble styles ──────────────────────────────────────────\n // Simulates a raised glass dome / marble sitting on the surface:\n // - Bright borderTop highlight mimics light hitting the top edge\n // - Subtle darker base border grounds the bottom\n // - Vertical gradient: bright at top, more opaque at bottom\n // - Inset top shadow for inner refraction glow\n // - Inset bottom shadow for depth within the dome\n // - Outer shadow to anchor the bubble to the surface\n const baseStyles: React.CSSProperties = {\n width: buttonSize,\n height: buttonSize,\n borderRadius: '50%',\n border: isDark\n ? '1px solid rgba(255,255,255,0.15)'\n : 'none',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n background: isDark\n ? '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 : '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 backdropFilter: 'blur(16px) saturate(170%)',\n WebkitBackdropFilter: 'blur(16px) saturate(170%)',\n color: isDark ? 'rgba(255,255,255,0.88)' : 'rgba(0,0,0,0.75)',\n boxShadow: isDark\n ? '0 4px 14px rgba(0,0,0,0.45), 0 1px 3px rgba(0,0,0,0.35)'\n : '0 3px 12px rgba(0,0,0,0.12), 0 0 1px rgba(0,0,0,0.2)',\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n opacity: shouldShow ? 1 : 0,\n transform: shouldShow ? 'scale(1)' : 'scale(0.6)',\n pointerEvents: shouldShow ? 'auto' : 'none',\n ...customStyles?.button,\n };\n\n return (\n <button\n type=\"button\"\n onClick={handleClick}\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} />\n </button>\n );\n}\n\nconst FONT_ID = 'gotcha-carter-one';\n\nfunction useCarterOneFont() {\n useEffect(() => {\n if (document.getElementById(FONT_ID)) return;\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&display=swap';\n document.head.appendChild(link);\n }, []);\n}\n\nfunction GotchaIcon({ size }: { size: number }) {\n useCarterOneFont();\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 }}\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 <style>\n {`\n @keyframes gotcha-spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\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 </style>\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 } from 'react';\nimport { GotchaStyles } from '../../types';\nimport { isTouchDevice } from '../../utils/device';\nimport { Spinner } from '../Spinner';\n\ninterface FeedbackModeProps {\n theme: 'light' | 'dark' | 'custom';\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 /** Show the text input (default: true) */\n showText?: boolean;\n /** Show the star rating (default: true) */\n showRating?: boolean;\n /** Show \"Report an issue\" toggle (default: false) */\n enableBugFlag?: boolean;\n /** Custom label for bug flag toggle (default: \"Report an issue\") */\n bugFlagLabel?: string;\n}\n\nexport function FeedbackMode({\n theme,\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 // Update local state when initialValues change (e.g., after loading existing response)\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 isDark = theme === 'dark';\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 ${isDark ? 'rgba(255,255,255,0.08)' : '#e2e8f0'}`,\n borderRadius: 8,\n backgroundColor: isDark ? 'rgba(55,65,81,0.5)' : '#fafbfc',\n color: isDark ? '#f9fafb' : '#111827',\n fontSize: isTouch ? 16 : 14, // 16px prevents iOS zoom on focus\n resize: 'vertical',\n minHeight: isTouch ? 100 : 80,\n fontFamily: 'inherit',\n outline: 'none',\n transition: 'border-color 0.2s cubic-bezier(0.4, 0, 0.2, 1), box-shadow 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n lineHeight: 1.5,\n ...customStyles?.input,\n };\n\n const buttonStyles: React.CSSProperties = {\n width: '100%',\n padding: isTouch ? '14px 16px' : '10px 16px',\n border: 'none',\n borderRadius: 8,\n backgroundColor: isDark ? '#e2e8f0' : '#1e293b',\n color: isDark ? '#1e293b' : '#ffffff',\n fontSize: isTouch ? 16 : 14,\n fontWeight: 500,\n cursor: isLoading ? 'not-allowed' : 'pointer',\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\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} isDark={isDark} 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 style={inputStyles}\n disabled={isLoading}\n aria-label=\"Your feedback\"\n onFocus={(e) => {\n e.currentTarget.style.borderColor = '#1e293b';\n e.currentTarget.style.boxShadow = '0 0 0 2px rgba(30,41,59,0.15)';\n e.currentTarget.style.backgroundColor = isDark ? 'rgba(55,65,81,0.7)' : '#ffffff';\n }}\n onBlur={(e) => {\n e.currentTarget.style.borderColor = isDark ? 'rgba(255,255,255,0.08)' : '#e2e8f0';\n e.currentTarget.style.boxShadow = 'none';\n e.currentTarget.style.backgroundColor = isDark ? 'rgba(55,65,81,0.5)' : '#fafbfc';\n }}\n />\n )}\n\n {/* Bug flag toggle */}\n {enableBugFlag && (\n <button\n type=\"button\"\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\n ? (isDark ? 'rgba(245,158,11,0.3)' : 'rgba(217,119,6,0.25)')\n : (isDark ? 'rgba(255,255,255,0.06)' : 'rgba(0,0,0,0.06)')\n }`,\n borderRadius: 7,\n backgroundColor: isBug\n ? (isDark ? 'rgba(245,158,11,0.08)' : 'rgba(251,191,36,0.08)')\n : 'transparent',\n cursor: 'pointer',\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n }}\n onMouseEnter={(e) => {\n if (!isBug) {\n e.currentTarget.style.backgroundColor = isDark ? 'rgba(255,255,255,0.03)' : 'rgba(0,0,0,0.02)';\n }\n }}\n onMouseLeave={(e) => {\n if (!isBug) {\n e.currentTarget.style.backgroundColor = 'transparent';\n }\n }}\n >\n {/* Bug icon */}\n <svg\n width={14}\n height={14}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke={isBug ? (isDark ? '#fbbf24' : '#d97706') : (isDark ? '#6b7280' : '#9ca3af')}\n strokeWidth={1.75}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={{ flexShrink: 0, transition: 'stroke 0.2s' }}\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 ? 500 : 400,\n color: isBug\n ? (isDark ? '#fbbf24' : '#b45309')\n : (isDark ? '#6b7280' : '#9ca3af'),\n transition: 'color 0.2s',\n letterSpacing: '0.01em',\n }}\n >\n {isBug ? 'Issue reported' : (bugFlagLabel || 'Report an issue')}\n </span>\n {/* Toggle indicator */}\n <div\n style={{\n marginLeft: 'auto',\n width: 28,\n height: 16,\n borderRadius: 8,\n backgroundColor: isBug\n ? (isDark ? '#f59e0b' : '#d97706')\n : (isDark ? 'rgba(255,255,255,0.1)' : 'rgba(0,0,0,0.08)'),\n position: 'relative',\n transition: 'background-color 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\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\n ? '#ffffff'\n : (isDark ? '#4b5563' : '#d1d5db'),\n transition: 'left 0.2s cubic-bezier(0.4, 0, 0.2, 1), background-color 0.2s',\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\n ? (isDark ? '#374151' : '#e2e8f0')\n : (isDark ? '#e2e8f0' : '#1e293b'),\n color: !canSubmit\n ? (isDark ? '#6b7280' : '#94a3b8')\n : (isDark ? '#1e293b' : '#ffffff'),\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 8,\n }}\n onMouseEnter={(e) => {\n if (!e.currentTarget.disabled) {\n e.currentTarget.style.backgroundColor = isDark ? '#cbd5e1' : '#334155';\n }\n }}\n onMouseLeave={(e) => {\n if (!e.currentTarget.disabled) {\n e.currentTarget.style.backgroundColor = isDark ? '#e2e8f0' : '#1e293b';\n }\n }}\n >\n {isLoading && <Spinner size={isTouch ? 18 : 16} color={isDark ? '#1e293b' : '#ffffff'} />}\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 isDark: boolean;\n isTouch: boolean;\n large?: boolean;\n}\n\nfunction StarRating({ value, onChange, isDark, isTouch, large = false }: StarRatingProps) {\n const [hovered, setHovered] = useState<number | null>(null);\n const starSize = large ? (isTouch ? 36 : 28) : (isTouch ? 28 : 18);\n const buttonPadding = large ? (isTouch ? 8 : 5) : (isTouch ? 6 : 3);\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={() => onChange(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 ? '#f59e0b' : (isDark ? 'rgba(255,255,255,0.12)' : '#e2e8f0'),\n transition: 'color 0.15s cubic-bezier(0.4, 0, 0.2, 1), transform 0.15s cubic-bezier(0.4, 0, 0.2, 1)',\n transform: (hovered !== null && hovered >= star) ? 'scale(1.1)' : 'scale(1)',\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 { isTouchDevice } from '../../utils/device';\nimport { Spinner } from '../Spinner';\n\ninterface VoteModeProps {\n theme: 'light' | 'dark' | 'custom';\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({ theme, 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 // Update when initialVote changes (e.g., after loading existing response)\n useEffect(() => {\n if (initialVote !== undefined) {\n setPreviousVote(initialVote);\n setActiveVote(initialVote);\n }\n }, [initialVote]);\n\n // Reset active vote when loading completes (but keep previous vote for edit mode)\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 isDark = theme === 'dark';\n\n const getButtonStyles = (voteType: 'up' | 'down'): React.CSSProperties => {\n const isSelected = previousVote === voteType;\n const selectedColor = voteType === 'up' ? '#10b981' : '#ef4444';\n return {\n flex: 1,\n minWidth: 0,\n overflow: 'hidden' as const,\n padding: isTouch ? '14px 18px' : '10px 14px',\n border: `1px solid ${isSelected\n ? (voteType === 'up'\n ? (isDark ? 'rgba(16,185,129,0.3)' : 'rgba(16,185,129,0.25)')\n : (isDark ? 'rgba(239,68,68,0.3)' : 'rgba(239,68,68,0.25)'))\n : (isDark ? 'rgba(255,255,255,0.08)' : '#e2e8f0')}`,\n borderRadius: isTouch ? 10 : 8,\n backgroundColor: isSelected\n ? (voteType === 'up'\n ? (isDark ? 'rgba(16,185,129,0.08)' : 'rgba(16,185,129,0.06)')\n : (isDark ? 'rgba(239,68,68,0.08)' : 'rgba(239,68,68,0.06)'))\n : (isDark ? 'rgba(55,65,81,0.5)' : '#fafbfc'),\n color: isSelected\n ? selectedColor\n : (isDark ? '#d1d5db' : '#64748b'),\n fontSize: isTouch ? 28 : 24,\n cursor: isLoading ? 'not-allowed' : 'pointer',\n transition: 'background-color 0.2s, border-color 0.2s, color 0.2s, transform 0.2s, box-shadow 0.2s',\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(-1px)';\n e.currentTarget.style.boxShadow = '0 2px 8px rgba(0,0,0,0.06)';\n }\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.transform = 'translateY(0)';\n e.currentTarget.style.boxShadow = 'none';\n }}\n >\n {isLoading && activeVote === 'up' ? (\n <>\n <Spinner size={iconSize} color={isDark ? '#f9fafb' : '#111827'} />\n <span style={{ fontSize: isTouch ? 15 : 13, fontWeight: 500, letterSpacing: '0.01em' }}>\n {isEditing ? 'Updating...' : 'Sending...'}\n </span>\n </>\n ) : (\n <>\n <ThumbsUpIcon size={iconSize} />\n <span style={{ fontSize: isTouch ? 15 : 13, fontWeight: 500, 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(-1px)';\n e.currentTarget.style.boxShadow = '0 2px 8px rgba(0,0,0,0.06)';\n }\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.transform = 'translateY(0)';\n e.currentTarget.style.boxShadow = 'none';\n }}\n >\n {isLoading && activeVote === 'down' ? (\n <>\n <Spinner size={iconSize} color={isDark ? '#f9fafb' : '#111827'} />\n <span style={{ fontSize: isTouch ? 15 : 13, fontWeight: 500, letterSpacing: '0.01em' }}>\n {isEditing ? 'Updating...' : 'Sending...'}\n </span>\n </>\n ) : (\n <>\n <ThumbsDownIcon size={iconSize} />\n <span style={{ fontSize: isTouch ? 15 : 13, fontWeight: 500, 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 { isTouchDevice } from '../../utils/device';\nimport { Spinner } from '../Spinner';\n\ninterface PollModeProps {\n theme: 'light' | 'dark' | 'custom';\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 theme,\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 isDark = theme === 'dark';\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): 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\n ? (isDark ? 'rgba(226,232,240,0.25)' : 'rgba(30,41,59,0.25)')\n : (isDark ? 'rgba(255,255,255,0.08)' : '#e2e8f0')}`,\n borderRadius: isTouch ? 10 : 8,\n backgroundColor: isSelected\n ? (isDark ? 'rgba(226,232,240,0.08)' : 'rgba(30,41,59,0.05)')\n : (isDark ? 'rgba(55,65,81,0.5)' : '#fafbfc'),\n color: isSelected\n ? (isDark ? '#e2e8f0' : '#1e293b')\n : (isDark ? '#d1d5db' : '#374151'),\n fontSize: isTouch ? 15 : 13,\n fontWeight: 500,\n cursor: isLoading ? 'not-allowed' : 'pointer',\n transition: 'background-color 0.2s, border-color 0.2s, color 0.2s',\n textAlign: 'left' as const,\n letterSpacing: '0.01em',\n display: 'flex',\n alignItems: 'center',\n gap: 8,\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) => {\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)}\n aria-pressed={isSelected}\n >\n <span\n style={{\n width: 16,\n height: 16,\n borderRadius: allowMultiple ? 4 : '50%',\n border: `2px solid ${isSelected\n ? (isDark ? '#e2e8f0' : '#1e293b')\n : (isDark ? 'rgba(255,255,255,0.2)' : '#cbd5e1')}`,\n backgroundColor: isSelected\n ? (isDark ? '#e2e8f0' : '#1e293b')\n : 'transparent',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n transition: 'all 0.15s',\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: 'none',\n borderRadius: 8,\n backgroundColor: selected.length === 0\n ? (isDark ? '#374151' : '#e2e8f0')\n : (isDark ? '#e2e8f0' : '#1e293b'),\n color: selected.length === 0\n ? (isDark ? '#6b7280' : '#94a3b8')\n : (isDark ? '#1e293b' : '#ffffff'),\n fontSize: isTouch ? 16 : 14,\n fontWeight: 500,\n cursor: isLoading || selected.length === 0 ? 'not-allowed' : 'pointer',\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n letterSpacing: '0.01em',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 8,\n opacity: isLoading ? 0.8 : 1,\n }}\n onMouseEnter={(e) => {\n if (!e.currentTarget.disabled) {\n e.currentTarget.style.backgroundColor = isDark ? '#cbd5e1' : '#334155';\n }\n }}\n onMouseLeave={(e) => {\n if (!e.currentTarget.disabled) {\n e.currentTarget.style.backgroundColor = selected.length === 0\n ? (isDark ? '#374151' : '#e2e8f0')\n : (isDark ? '#e2e8f0' : '#1e293b');\n }\n }}\n >\n {isLoading && <Spinner size={isTouch ? 18 : 16} color={isDark ? '#1e293b' : '#ffffff'} />}\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 { isTouchDevice } from '../../utils/device';\nimport { Spinner } from '../Spinner';\n\ninterface NpsModeProps {\n theme: 'light' | 'dark' | 'custom';\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\n// Color per score — smooth gradient from red through amber to green\nconst SCORE_COLORS = [\n '#ef4444', // 0 — red\n '#f05540', // 1\n '#f1663c', // 2\n '#f27738', // 3\n '#f38834', // 4\n '#f59e0b', // 5 — amber\n '#d4a30e', // 6\n '#b3a812', // 7\n '#79b841', // 8\n '#45c870', // 9\n '#10b981', // 10 — green\n];\n\nexport function NpsMode({\n theme,\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 isDark = theme === 'dark';\n const canSubmit = score !== null;\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 style={{ marginBottom: showFollowUp && score !== null ? (isTouch ? 14 : 12) : 0 }}>\n {/* Number buttons */}\n <div\n style={{\n display: 'flex',\n gap: isTouch ? 8 : 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 = SCORE_COLORS[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 height: isTouch ? 36 : 32,\n borderRadius: 8,\n border: selected\n ? `2px solid ${color}`\n : `1.5px solid ${isDark ? `${color}30` : `${color}25`}`,\n backgroundColor: selected\n ? color\n : hovered\n ? (isDark ? `${color}30` : `${color}18`)\n : (isDark ? `${color}15` : `${color}0c`),\n color: selected\n ? '#fff'\n : hovered\n ? color\n : (isDark ? `${color}cc` : `${color}bb`),\n fontSize: isTouch ? 13 : 12,\n fontWeight: selected ? 700 : 600,\n fontFamily: 'inherit',\n cursor: 'pointer',\n padding: 0,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n transition: 'all 0.2s cubic-bezier(0.34, 1.56, 0.64, 1)',\n transform: selected ? 'scale(1.08)' : hovered ? 'scale(1.04)' : 'scale(1)',\n boxShadow: selected\n ? `0 2px 8px ${color}40`\n : 'none',\n flexShrink: 0,\n }}\n >\n {i}\n </button>\n );\n })}\n </div>\n\n {/* Labels + category indicator */}\n <div\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n marginTop: 10,\n padding: '0 2px',\n }}\n >\n <span style={{\n fontSize: 10,\n color: isDark ? 'rgba(255,255,255,0.3)' : 'rgba(0,0,0,0.3)',\n fontWeight: 500,\n }}>\n {lowLabel}\n </span>\n\n\n <span style={{\n fontSize: 10,\n color: isDark ? 'rgba(255,255,255,0.3)' : 'rgba(0,0,0,0.3)',\n fontWeight: 500,\n }}>\n {highLabel}\n </span>\n </div>\n </div>\n\n {/* Follow-up textarea */}\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 style={{\n width: '100%',\n padding: isTouch ? '12px 14px' : '10px 12px',\n border: `1px solid ${isDark ? 'rgba(255,255,255,0.08)' : '#e2e8f0'}`,\n borderRadius: 8,\n backgroundColor: isDark ? 'rgba(55,65,81,0.5)' : '#fafbfc',\n color: isDark ? '#f9fafb' : '#111827',\n fontSize: isTouch ? 16 : 14,\n resize: 'vertical' as const,\n minHeight: isTouch ? 80 : 60,\n fontFamily: 'inherit',\n outline: 'none',\n transition: 'border-color 0.2s cubic-bezier(0.4, 0, 0.2, 1), box-shadow 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n lineHeight: 1.5,\n ...customStyles?.input,\n }}\n disabled={isLoading}\n aria-label=\"Follow-up feedback\"\n onFocus={(e) => {\n e.currentTarget.style.borderColor = isDark ? 'rgba(255,255,255,0.2)' : '#94a3b8';\n e.currentTarget.style.boxShadow = `0 0 0 2px ${isDark ? 'rgba(255,255,255,0.06)' : 'rgba(0,0,0,0.06)'}`;\n e.currentTarget.style.backgroundColor = isDark ? 'rgba(55,65,81,0.7)' : '#ffffff';\n }}\n onBlur={(e) => {\n e.currentTarget.style.borderColor = isDark ? 'rgba(255,255,255,0.08)' : '#e2e8f0';\n e.currentTarget.style.boxShadow = 'none';\n e.currentTarget.style.backgroundColor = isDark ? 'rgba(55,65,81,0.5)' : '#fafbfc';\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: 'none',\n borderRadius: 8,\n backgroundColor: !canSubmit\n ? (isDark ? '#374151' : '#e2e8f0')\n : (isDark ? '#e2e8f0' : '#1e293b'),\n color: !canSubmit\n ? (isDark ? '#6b7280' : '#94a3b8')\n : (isDark ? '#1e293b' : '#ffffff'),\n fontSize: isTouch ? 16 : 14,\n fontWeight: 500,\n cursor: isLoading ? 'not-allowed' : 'pointer',\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\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 ...customStyles?.submitButton,\n }}\n onMouseEnter={(e) => {\n if (!e.currentTarget.disabled) {\n e.currentTarget.style.backgroundColor = isDark ? '#cbd5e1' : '#334155';\n }\n }}\n onMouseLeave={(e) => {\n if (!e.currentTarget.disabled) {\n e.currentTarget.style.backgroundColor = isDark ? '#e2e8f0' : '#1e293b';\n }\n }}\n >\n {isLoading && <Spinner size={isTouch ? 18 : 16} color={isDark ? '#1e293b' : '#ffffff'} />}\n {isLoading ? (isEditing ? 'Updating...' : 'Submitting...') : (isEditing ? 'Update' : submitText)}\n </button>\n </form>\n );\n}\n","import React, { useRef, useEffect, useState } from 'react';\nimport { Theme, GotchaStyles, ResponseMode, ExistingResponse } from '../types';\nimport { cn } from '../utils/cn';\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 /** 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 // 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 [isVisible, setIsVisible] = useState(false);\n const [isMobile, setIsMobile] = useState(false);\n const [systemTheme, setSystemTheme] = useState<'light' | 'dark'>('light');\n\n // Detect mobile and system theme after mount (SSR-safe)\n useEffect(() => {\n setIsMobile(window.innerWidth < 640);\n\n // Detect system theme preference\n const darkQuery = window.matchMedia('(prefers-color-scheme: dark)');\n setSystemTheme(darkQuery.matches ? 'dark' : 'light');\n\n // Listen for theme changes\n const handler = (e: MediaQueryListEvent) => setSystemTheme(e.matches ? 'dark' : 'light');\n darkQuery.addEventListener('change', handler);\n return () => darkQuery.removeEventListener('change', handler);\n }, []);\n\n // Trigger animation after mount\n useEffect(() => {\n const timer = requestAnimationFrame(() => setIsVisible(true));\n return () => cancelAnimationFrame(timer);\n }, []);\n\n // Resolve theme\n const resolvedTheme = theme === 'auto' ? systemTheme : theme;\n\n const isDark = resolvedTheme === 'dark';\n\n // Determine if modal should appear above or below\n const modalHeight = 280; // approximate modal height\n const spaceBelow = anchorRect\n ? window.innerHeight - anchorRect.bottom\n : window.innerHeight / 2;\n const showAbove = spaceBelow < modalHeight + 20;\n\n // Focus trap\n useEffect(() => {\n const modal = modalRef.current;\n if (!modal) return;\n\n // Focus first element\n firstFocusableRef.current?.focus();\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n onClose();\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 }, [onClose]);\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 // Responsive sizing - on mobile, use fixed positioning centered on screen\n const modalPadding = isMobile ? 20 : 16;\n const modalWidth = mode === 'nps' ? 420 : 320;\n\n const layeredShadow = isDark\n ? '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)'\n : '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)';\n\n const modalStyles: React.CSSProperties = isMobile\n ? {\n // Mobile: fixed position, centered on screen\n position: 'fixed',\n left: '50%',\n top: '50%',\n width: 'calc(100vw - 32px)',\n maxWidth: modalWidth,\n padding: modalPadding,\n borderRadius: 12,\n backgroundColor: isDark ? '#1f2937' : '#ffffff',\n color: isDark ? '#f9fafb' : '#111827',\n boxShadow: layeredShadow,\n border: `1px solid ${isDark ? 'rgba(255,255,255,0.06)' : 'rgba(0,0,0,0.06)'}`,\n zIndex: 9999,\n transition: 'opacity 0.25s cubic-bezier(0.4, 0, 0.2, 1), transform 0.25s cubic-bezier(0.4, 0, 0.2, 1)',\n opacity: isVisible ? 1 : 0,\n transform: isVisible\n ? 'translate(-50%, -50%) scale(1)'\n : 'translate(-50%, -50%) scale(0.96)',\n ...customStyles?.modal,\n textAlign: 'left',\n }\n : {\n // Desktop: absolute position relative to button\n position: 'absolute',\n left: '50%',\n width: modalWidth,\n padding: modalPadding,\n borderRadius: 10,\n backgroundColor: isDark ? '#1f2937' : '#ffffff',\n color: isDark ? '#f9fafb' : '#111827',\n boxShadow: layeredShadow,\n border: `1px solid ${isDark ? 'rgba(255,255,255,0.06)' : 'rgba(0,0,0,0.06)'}`,\n zIndex: 9999,\n ...(showAbove\n ? { bottom: '100%', marginBottom: 8 }\n : { top: '100%', marginTop: 8 }),\n transition: 'opacity 0.25s cubic-bezier(0.4, 0, 0.2, 1), transform 0.25s cubic-bezier(0.4, 0, 0.2, 1)',\n opacity: isVisible ? 1 : 0,\n transform: isVisible\n ? 'translateX(-50%) scale(1) translateY(0)'\n : `translateX(-50%) scale(0.96) translateY(${showAbove ? '6px' : '-6px'})`,\n ...customStyles?.modal,\n textAlign: 'left',\n };\n\n return (\n <div\n ref={modalRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"gotcha-modal-title\"\n style={modalStyles}\n className={cn('gotcha-modal', isDark && 'gotcha-modal--dark')}\n >\n {/* Close button - larger on touch devices */}\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 ? 12 : 8,\n right: isMobile ? 12 : 8,\n width: isMobile ? 36 : 28,\n height: isMobile ? 36 : 28,\n border: 'none',\n background: 'transparent',\n cursor: 'pointer',\n color: isDark ? '#6b7280' : '#9ca3af',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: 6,\n transition: 'all 0.15s cubic-bezier(0.4, 0, 0.2, 1)',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = isDark ? 'rgba(255,255,255,0.06)' : 'rgba(0,0,0,0.04)';\n e.currentTarget.style.color = isDark ? '#9ca3af' : '#6b7280';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent';\n e.currentTarget.style.color = isDark ? '#6b7280' : '#9ca3af';\n }}\n >\n <svg width={isMobile ? 16 : 12} height={isMobile ? 16 : 12} 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 <h2\n id=\"gotcha-modal-title\"\n style={{\n margin: '0 0 16px 0',\n fontSize: isMobile ? 16 : 14,\n fontWeight: 600,\n paddingRight: isMobile ? 40 : 32,\n letterSpacing: '-0.01em',\n lineHeight: 1.4,\n textAlign: 'left',\n }}\n >\n {promptText || defaultPrompt}\n </h2>\n\n {/* Success state */}\n {isSubmitted && (\n <div\n style={{\n textAlign: 'center',\n padding: '24px 0',\n color: isDark ? '#10b981' : '#059669',\n }}\n >\n <div\n style={{\n width: 44,\n height: 44,\n borderRadius: '50%',\n backgroundColor: isDark ? 'rgba(16,185,129,0.1)' : 'rgba(5,150,105,0.08)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n margin: '0 auto 12px',\n }}\n >\n <svg\n width=\"22\"\n height=\"22\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n >\n <path\n d=\"M20 6L9 17L4 12\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </div>\n <p style={{ margin: 0, fontSize: 13, fontWeight: 500, color: isDark ? '#d1d5db' : '#374151' }}>\n {thankYouMessage}\n </p>\n </div>\n )}\n\n {/* Error state */}\n {error && !isSubmitted && (\n <div\n style={{\n padding: '8px 10px',\n marginBottom: 12,\n borderRadius: 8,\n backgroundColor: isDark ? 'rgba(127,29,29,0.3)' : '#fef2f2',\n border: `1px solid ${isDark ? 'rgba(254,202,202,0.1)' : 'rgba(220,38,38,0.1)'}`,\n color: isDark ? '#fecaca' : '#dc2626',\n fontSize: 13,\n lineHeight: 1.4,\n }}\n >\n {error}\n </div>\n )}\n\n {/* Form content based on mode */}\n {!isSubmitted && (\n <>\n {mode === 'feedback' && (\n <FeedbackMode\n theme={resolvedTheme}\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 theme={resolvedTheme}\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 theme={resolvedTheme}\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 theme={resolvedTheme}\n options={options}\n allowMultiple={allowMultiple}\n isLoading={isLoading}\n onSubmit={onSubmit}\n initialSelected={existingResponse?.pollSelected || undefined}\n isEditing={isEditing}\n />\n )}\n </>\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 (Phase 2)\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 // 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 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, client } = 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 containerRef = useRef<HTMLDivElement>(null);\n\n // Detect mobile for portal rendering (SSR-safe)\n useEffect(() => {\n setIsMobile(window.innerWidth < 640);\n }, []);\n\n // This instance's modal is open if activeModalId matches our elementId\n const isOpen = activeModalId === elementId;\n\n // Attach hover listeners to the parent element (not the button container)\n useEffect(() => {\n if (!showOnHover) return;\n\n const container = containerRef.current;\n if (!container) return;\n\n // Find the parent element with position: relative\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 setTimeout(() => {\n closeModal();\n setIsSubmitted(false);\n }, 1500);\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 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 // Resolve submit text — show \"Update\" when editing in onePerUser mode\n const effectiveSubmitText = isEditing ? 'Update' : submitText;\n\n // Don't render if disabled or not visible\n if (disabled || !visible) return null;\n\n // Position styles\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 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 />\n\n {isOpen && !isMobile && (\n <GotchaModal\n mode={mode}\n theme={theme}\n customStyles={customStyles}\n promptText={promptText}\n placeholder={placeholder}\n submitText={effectiveSubmitText}\n thankYouMessage={isEditing ? 'Your feedback has been updated!' : thankYouMessage}\n isLoading={isLoading}\n isSubmitted={isSubmitted}\n error={error}\n existingResponse={existingResponse}\n isEditing={isEditing}\n showText={showText}\n showRating={showRating}\n voteLabels={voteLabels}\n options={options}\n allowMultiple={allowMultiple}\n npsQuestion={npsQuestion}\n npsFollowUp={npsFollowUp}\n npsFollowUpPlaceholder={npsFollowUpPlaceholder}\n npsLowLabel={npsLowLabel}\n npsHighLabel={npsHighLabel}\n enableBugFlag={enableBugFlag}\n bugFlagLabel={bugFlagLabel}\n onSubmit={handleSubmit}\n onClose={handleClose}\n anchorRect={anchorRect || undefined}\n />\n )}\n\n {/* On mobile, render modal via portal to escape parent transform */}\n {isOpen && isMobile && createPortal(\n <div\n style={{\n position: 'fixed',\n inset: 0,\n zIndex: 99999,\n backgroundColor: 'rgba(0, 0, 0, 0.3)',\n }}\n onClick={handleClose}\n >\n <div onClick={(e) => e.stopPropagation()}>\n <GotchaModal\n mode={mode}\n theme={theme}\n customStyles={customStyles}\n promptText={promptText}\n placeholder={placeholder}\n submitText={effectiveSubmitText}\n thankYouMessage={isEditing ? 'Your feedback has been updated!' : thankYouMessage}\n isLoading={isLoading}\n isSubmitted={isSubmitted}\n error={error}\n existingResponse={existingResponse}\n isEditing={isEditing}\n showText={showText}\n showRating={showRating}\n voteLabels={voteLabels}\n options={options}\n allowMultiple={allowMultiple}\n npsQuestion={npsQuestion}\n npsFollowUp={npsFollowUp}\n npsFollowUpPlaceholder={npsFollowUpPlaceholder}\n npsLowLabel={npsLowLabel}\n npsHighLabel={npsHighLabel}\n enableBugFlag={enableBugFlag}\n bugFlagLabel={bugFlagLabel}\n onSubmit={handleSubmit}\n onClose={handleClose}\n anchorRect={anchorRect || undefined}\n />\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 } from 'react';\nimport { Theme, Size } from '../types';\nimport { useScore } from '../hooks/useScore';\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\nfunction resolveTheme(theme: Theme, systemTheme: 'light' | 'dark'): 'light' | 'dark' | 'custom' {\n if (theme === 'auto') return systemTheme;\n return theme;\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 {/* Empty star background */}\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 {/* Filled star overlay clipped to fill percentage */}\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 if (isLoading || !score) return null;\n\n const resolved = resolveTheme(theme, systemTheme);\n const isDark = resolved === 'dark';\n const s = SIZE_MAP[size];\n\n // Color tokens\n const ratingColor = isDark ? '#f3f4f6' : '#000000';\n const mutedColor = isDark ? '#9ca3af' : '#9ca3af';\n const starFilled = isDark ? '#facc15' : '#eab308';\n const starEmpty = isDark ? '#374151' : '#e5e7eb';\n const positiveColor = isDark ? '#6ee7b7' : '#16a34a';\n const positiveTrack = isDark ? '#374151' : '#e5e7eb';\n\n const baseStyle: React.CSSProperties = {\n display: 'inline-flex',\n alignItems: 'center',\n gap: s.gap,\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\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"]}