{"version":3,"sources":["../src/constants.ts","../src/utils/localStorage.ts","../src/utils/generateId.ts","../src/utils/anonymous.ts","../src/utils/errorBuffer.ts","../src/utils/contextCollector.ts","../src/utils/offlineQueue.ts","../src/api/client.ts","../src/utils/deepMerge.ts","../src/theme/tokens.ts","../src/theme/resolveTheme.ts","../src/fonts/fraunces-subset.ts","../src/theme/styles.ts","../src/components/GotchaProvider.tsx","../src/hooks/useSubmit.ts","../src/hooks/useHideAfterSubmit.ts","../src/hooks/useTriggerConditions.ts","../src/utils/cn.ts","../src/utils/device.ts","../src/components/GotchaButton.tsx","../src/components/ScreenshotPreview.tsx","../src/components/modes/FeedbackMode.tsx","../src/components/modes/VoteMode.tsx","../src/components/modes/PollMode.tsx","../src/components/Spinner.tsx","../src/components/modes/NpsMode.tsx","../src/components/FollowUpPrompt.tsx","../src/components/GotchaModal.tsx","../src/components/Gotcha.tsx","../src/hooks/useScore.ts","../src/components/GotchaScore.tsx","../src/hooks/useGotcha.ts","../src/hooks/useGotchaTrigger.ts"],"names":["API_BASE_URL","STORAGE_KEYS","DEFAULTS","RETRY_CONFIG","safeGetItem","key","safeSetItem","value","generateId","c","getAnonymousId","stored","id","buffer","listening","pushError","message","source","entry","handleError","event","handleRejection","startErrorCapture","stopErrorCapture","getRecentErrors","collectContext","MAX_QUEUE_SIZE","MAX_AGE_MS","readQueue","raw","items","now","item","writeQueue","enqueue","payload","type","dequeue","getQueuedItems","getQueueLength","incrementRetries","DEFAULT_RETRY_CONFIG","fetchWithRetry","url","options","config","debug","lastError","attempt","response","error","delay","resolve","createApiClient","apiKey","baseUrl","flushing","headers","request","method","endpoint","body","idempotencyKey","data","user","fullPayload","err","elementId","userId","responseId","updatePayload","UNSAFE_KEYS","deepMerge","base","override","result","val","NPS_INK_LIGHT","NPS_INK_DARK","DISPLAY_STACK","BODY_STACK","LIGHT_TOKENS","DARK_TOKENS","createTheme","overrides","resolveTheme","theme","systemTheme","providerConfig","resolved","GOTCHA_FRAUNCES_FAMILY","FRAUNCES_9PT_REGULAR_WOFF2_BASE64","FRAUNCES_FONT_FACE","STYLE_ID","sanitizeCSS","generateStyleTag","easing","dNormal","dFast","fontFamily","textDisabled","borderFocus","injectStyles","styleEl","GotchaContext","createContext","EMPTY_USER","GotchaProvider","children","disabled","defaultUser","defaultUserEmail","themeConfig","activeModalId","setActiveModalId","useState","client","useMemo","stableDefaultUser","useEffect","handleOnline","openModal","useCallback","closeModal","jsx","useGotchaContext","context","useContext","isResponseExpired","createdAt","cooldownDays","createdTime","ageMs","cooldownMs","useSubmit","isLoading","setIsLoading","isCheckingExisting","setIsCheckingExisting","setError","existingResponse","setExistingResponse","cancelled","existing","errorMessage","getStorageKey","checkIsHidden","resolvedUserId","hideAfterSubmitDays","hiddenUntilStr","useHideAfterSubmit","isHidden","setIsHidden","markHidden","hiddenUntil","getVisitKey","useTriggerConditions","showAfterSeconds","showAfterScrollPercent","showAfterVisits","hasConditions","timeMet","setTimeMet","scrollMet","setScrollMet","visitsMet","next","start","targetMs","check","timer","checkScroll","scrollHeight","viewportHeight","cn","classes","isTouchDevice","getResponsiveSize","size","isTouch","sizes","getInitialSystemTheme","GotchaButton","customStyles","showOnHover","touchBehavior","onClick","isOpen","isParentHovered","animated","queuedCount","setIsTouch","tapRevealed","setTapRevealed","setSystemTheme","isHovered","setIsHovered","isPressed","setIsPressed","hasEntered","setHasEntered","darkQuery","handler","e","shouldShow","handleClick","buttonSize","t","borderColor","glyphColor","getTransform","transitionDur","backgroundColor","baseStyles","jsxs","GotchaIcon","color","fontFamilyDisplay","mounted","setMounted","ScreenshotPreview","src","onRemove","removeHover","setRemoveHover","approxKb","commaIdx","b64","FeedbackMode","placeholder","submitText","onSubmit","initialValues","isEditing","showText","showRating","enableBugFlag","bugFlagLabel","enableScreenshot","content","setContent","rating","setRating","isBug","setIsBug","screenshot","setScreenshot","capturingScreenshot","setCapturingScreenshot","screenshotError","setScreenshotError","canSubmit","handleScreenshotCapture","captureScreenshot","handleSubmit","inputStyles","StarRating","onChange","large","hovered","setHovered","starSize","gap","buttonPadding","delayFor","star","isFilled","VoteMode","initialVote","labels","activeVote","setActiveVote","previousVote","setPreviousVote","handleVote","vote","iconSize","getButtonStyles","voteType","isSelected","accent","surface","border","buildLabel","isActiveLoading","label","ariaLabel","inactiveBorder","ThumbsUpIcon","ThumbsDownIcon","PollMode","allowMultiple","initialSelected","selected","setSelected","hoverIdx","setHoverIdx","handleToggle","option","prev","o","rowPadding","index","Spinner","circumference","arc","NpsMode","showFollowUp","followUpPlaceholder","lowLabel","highLabel","score","setScore","hoveredScore","setHoveredScore","_","i","FollowUpPrompt","promptText","MODE_LABEL","getDefaultPrompt","mode","npsQuestion","AUTOCLOSE_MS","GotchaModal","thankYouMessage","isSubmitted","phase","followUpConfig","followUpLoading","onFollowUpSubmit","voteLabels","npsFollowUp","npsFollowUpPlaceholder","npsLowLabel","npsHighLabel","onClose","anchorRect","useFixedPosition","isMobileProp","modalRef","useRef","firstFocusableRef","onCloseRef","internalIsMobile","setInternalIsMobile","isMobile","syncTheme","darkHandler","listeners","mobileQuery","syncMobile","off","showAbove","modal","handleKeyDown","focusableElements","firstElement","lastElement","prompt","modeLabel","modalWidth","animationClass","baseContainer","modalStyles","viewportWidth","edgePadding","idealLeft","clampedLeft","fadeUpStyle","bodyPadding","Gotcha","userEmail","onePerUser","followUp","position","visible","onOpen","onError","conditionsMet","setPhase","lastResponseId","setLastResponseId","setFollowUpLoading","setQueuedCount","setIsParentHovered","setAnchorRect","setIsMobile","hasMounted","setHasMounted","containerRef","autoCloseTimerRef","lastSubmitDataRef","pendingDataRef","failureToast","setFailureToast","mq","sync","rafId","reanchor","el","button","container","parent","handleMouseEnter","handleMouseLeave","submit","handleOpen","handleClose","submitStart","ms","handleRetrySubmission","handleDismissToast","handleFollowUpSubmit","effectiveSubmitText","positionStyles","modalProps","createPortal","FailureToast","retrying","onRetry","onDismiss","useScore","refreshInterval","fetchScore","intervalId","SIZE_MAP","Stars","filledColor","emptyColor","clipId","stars","fill","PositiveBar","rate","height","trackColor","ThumbIcon","GotchaScore","variant","showCount","style","s","ratingColor","mutedColor","starFilled","starEmpty","positiveColor","positiveTrack","baseStyle","ratingNumberStyle","countLabelStyle","countText","n","singular","voteCount","positiveRate","total","averageRating","totalResponses","displayRating","useGotcha","useGotchaTrigger","open","close"],"mappings":"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","file":"index.mjs","sourcesContent":["// API URL\nexport const API_BASE_URL = 'https://gotcha.cx/api/v1';\n\n// Error codes\nexport const ERROR_CODES = {\n  INVALID_API_KEY: 'INVALID_API_KEY',\n  ORIGIN_NOT_ALLOWED: 'ORIGIN_NOT_ALLOWED',\n  RATE_LIMITED: 'RATE_LIMITED',\n  QUOTA_EXCEEDED: 'QUOTA_EXCEEDED',\n  INVALID_REQUEST: 'INVALID_REQUEST',\n  USER_NOT_FOUND: 'USER_NOT_FOUND',\n  INTERNAL_ERROR: 'INTERNAL_ERROR',\n} as const;\n\n// Local storage keys\nexport const STORAGE_KEYS = {\n  ANONYMOUS_ID: 'gotcha_anonymous_id',\n  OFFLINE_QUEUE: 'gotcha_offline_queue',\n  HIDDEN_UNTIL: 'gotcha_hidden',\n  VISIT_COUNT: 'gotcha_visits',\n} as const;\n\n// Default values\nexport const DEFAULTS = {\n  POSITION: 'top-right' as const,\n  SIZE: 'md' as const,\n  THEME: 'light' as const,\n  SHOW_ON_HOVER: true,\n  TOUCH_BEHAVIOR: 'always-visible' as const,\n  SUBMIT_TEXT: 'Submit',\n  THANK_YOU_MESSAGE: 'Gotcha!',\n} as const;\n\n// Retry config\nexport const RETRY_CONFIG = {\n  MAX_RETRIES: 2,\n  BASE_DELAY_MS: 500,\n  MAX_DELAY_MS: 5000,\n} as const;\n","export function safeGetItem(key: string): string | null {\n  if (typeof window === 'undefined') return null;\n  try {\n    return localStorage.getItem(key);\n  } catch {\n    return null;\n  }\n}\n\nexport function safeSetItem(key: string, value: string): void {\n  if (typeof window === 'undefined') return;\n  try {\n    localStorage.setItem(key, value);\n  } catch {\n    // localStorage unavailable (incognito Safari, sandboxed iframes)\n  }\n}\n\nexport function safeRemoveItem(key: string): void {\n  if (typeof window === 'undefined') return;\n  try {\n    localStorage.removeItem(key);\n  } catch {\n    // silently fail\n  }\n}\n","/**\n * Generate a UUID v4. Falls back to Math.random for insecure contexts\n * (HTTP, some WebViews) where crypto.randomUUID is unavailable.\n */\nexport function generateId(): string {\n  if (typeof crypto !== 'undefined' && crypto.randomUUID) {\n    return crypto.randomUUID();\n  }\n  return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n    const r = (Math.random() * 16) | 0;\n    return (c === 'x' ? r : (r & 0x3) | 0x8).toString(16);\n  });\n}\n","import { STORAGE_KEYS } from '../constants';\nimport { safeGetItem, safeSetItem, safeRemoveItem } from './localStorage';\nimport { generateId } from './generateId';\n\n/**\n * Get or create an anonymous user ID\n * Stored in localStorage for consistency across sessions\n */\nexport function getAnonymousId(): string {\n  const stored = safeGetItem(STORAGE_KEYS.ANONYMOUS_ID);\n  if (stored) return stored;\n\n  const id = `anon_${generateId()}`;\n  safeSetItem(STORAGE_KEYS.ANONYMOUS_ID, id);\n  return id;\n}\n\n/**\n * Clear the anonymous ID (useful for testing)\n */\nexport function clearAnonymousId(): void {\n  safeRemoveItem(STORAGE_KEYS.ANONYMOUS_ID);\n}\n","const MAX_ERRORS = 10;\nconst MAX_MESSAGE_LENGTH = 200;\n\ninterface CapturedError {\n  message: string;\n  source?: string;\n  timestamp: number;\n}\n\nlet buffer: CapturedError[] = [];\nlet listening = false;\n\nfunction pushError(message: string, source?: string) {\n  const entry: CapturedError = {\n    message: message.slice(0, MAX_MESSAGE_LENGTH),\n    source: source?.slice(0, MAX_MESSAGE_LENGTH),\n    timestamp: Date.now(),\n  };\n  buffer.push(entry);\n  if (buffer.length > MAX_ERRORS) {\n    buffer.shift();\n  }\n}\n\nfunction handleError(event: ErrorEvent) {\n  pushError(event.message, event.filename);\n}\n\nfunction handleRejection(event: PromiseRejectionEvent) {\n  const message = event.reason instanceof Error\n    ? event.reason.message\n    : String(event.reason);\n  pushError(message);\n}\n\nexport function startErrorCapture(): void {\n  if (typeof window === 'undefined' || listening) return;\n  window.addEventListener('error', handleError);\n  window.addEventListener('unhandledrejection', handleRejection);\n  listening = true;\n}\n\nexport function stopErrorCapture(): void {\n  if (typeof window === 'undefined' || !listening) return;\n  window.removeEventListener('error', handleError);\n  window.removeEventListener('unhandledrejection', handleRejection);\n  listening = false;\n}\n\nexport function getRecentErrors(): CapturedError[] {\n  return [...buffer].reverse();\n}\n","import { SubmissionContext } from '../types';\nimport { getRecentErrors } from './errorBuffer';\n\nexport function collectContext(): SubmissionContext {\n  if (typeof window === 'undefined') return {};\n\n  return {\n    url: window.location.origin + window.location.pathname,\n    userAgent: navigator.userAgent,\n    viewport: { width: window.innerWidth, height: window.innerHeight },\n    language: navigator.language,\n    timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n    screenResolution: { width: screen.width, height: screen.height },\n    recentErrors: getRecentErrors(),\n  };\n}\n","import { STORAGE_KEYS } from '../constants';\nimport { safeGetItem, safeSetItem } from './localStorage';\nimport { generateId } from './generateId';\n\nconst MAX_QUEUE_SIZE = 50;\nconst MAX_AGE_MS = 7 * 24 * 60 * 60 * 1000; // 7 days\n\nexport interface OfflineQueueItem {\n  id: string;\n  payload: Record<string, unknown>;\n  type: 'create' | 'update';\n  queuedAt: number;\n  retries: number;\n}\n\nfunction readQueue(): OfflineQueueItem[] {\n  const raw = safeGetItem(STORAGE_KEYS.OFFLINE_QUEUE);\n  if (!raw) return [];\n  try {\n    const items = JSON.parse(raw) as OfflineQueueItem[];\n    // Drop items older than 7 days\n    const now = Date.now();\n    return items.filter(item => now - item.queuedAt < MAX_AGE_MS);\n  } catch {\n    return [];\n  }\n}\n\nfunction writeQueue(items: OfflineQueueItem[]): void {\n  safeSetItem(STORAGE_KEYS.OFFLINE_QUEUE, JSON.stringify(items));\n}\n\nexport function enqueue(payload: Record<string, unknown>, type: 'create' | 'update' = 'create'): void {\n  const items = readQueue();\n  if (items.length >= MAX_QUEUE_SIZE) return;\n  items.push({\n    id: generateId(),\n    payload,\n    type,\n    queuedAt: Date.now(),\n    retries: 0,\n  });\n  writeQueue(items);\n}\n\nexport function dequeue(id: string): void {\n  const items = readQueue().filter(item => item.id !== id);\n  writeQueue(items);\n}\n\nexport function getQueuedItems(): OfflineQueueItem[] {\n  return readQueue();\n}\n\nexport function getQueueLength(): number {\n  return readQueue().length;\n}\n\nexport function incrementRetries(id: string): void {\n  const items = readQueue().map(item =>\n    item.id === id ? { ...item, retries: item.retries + 1 } : item\n  );\n  // Drop items with too many retries\n  writeQueue(items.filter(item => item.retries <= 5));\n}\n","import { API_BASE_URL, RETRY_CONFIG } from '../constants';\nimport { SubmitResponsePayload, GotchaResponse, GotchaError, ExistingResponse, VoteType, ScoreData } from '../types';\nimport { getAnonymousId } from '../utils/anonymous';\nimport { generateId } from '../utils/generateId';\nimport { collectContext } from '../utils/contextCollector';\nimport { enqueue, getQueuedItems, dequeue, incrementRetries, getQueueLength } from '../utils/offlineQueue';\n\ninterface ApiClientConfig {\n  apiKey: string;\n  baseUrl?: string;\n  debug?: boolean;\n}\n\ninterface RetryConfig {\n  maxRetries: number;\n  baseDelayMs: number;\n  maxDelayMs: number;\n}\n\nconst DEFAULT_RETRY_CONFIG: RetryConfig = {\n  maxRetries: RETRY_CONFIG.MAX_RETRIES,\n  baseDelayMs: RETRY_CONFIG.BASE_DELAY_MS,\n  maxDelayMs: RETRY_CONFIG.MAX_DELAY_MS,\n};\n\n/**\n * Fetch with automatic retry and exponential backoff\n */\nasync function fetchWithRetry(\n  url: string,\n  options: RequestInit,\n  config: RetryConfig = DEFAULT_RETRY_CONFIG,\n  debug: boolean = false\n): Promise<Response> {\n  let lastError: Error | null = null;\n\n  for (let attempt = 0; attempt <= config.maxRetries; attempt++) {\n    try {\n      if (debug && attempt > 0) {\n        console.log(`[Gotcha] Retry attempt ${attempt}/${config.maxRetries}`);\n      }\n\n      const response = await fetch(url, options);\n\n      // Don't retry client errors (4xx) except 429 (rate limit)\n      if (response.status >= 400 && response.status < 500 && response.status !== 429) {\n        return response;\n      }\n\n      // Success - return immediately\n      if (response.ok) {\n        return response;\n      }\n\n      lastError = new Error(`HTTP ${response.status}`);\n    } catch (error) {\n      // Network error - retry\n      lastError = error as Error;\n      if (debug) {\n        console.log(`[Gotcha] Network error: ${lastError.message}`);\n      }\n    }\n\n    // Don't delay after last attempt\n    if (attempt < config.maxRetries) {\n      const delay = Math.min(\n        config.baseDelayMs * Math.pow(2, attempt),\n        config.maxDelayMs\n      );\n      await new Promise((resolve) => setTimeout(resolve, delay));\n    }\n  }\n\n  throw lastError;\n}\n\nexport function createApiClient(config: ApiClientConfig) {\n  const { apiKey, baseUrl = API_BASE_URL, debug = false } = config;\n\n  let flushing = false;\n\n  const headers = {\n    'Content-Type': 'application/json',\n    Authorization: `Bearer ${apiKey}`,\n  };\n\n  async function request<T>(\n    method: string,\n    endpoint: string,\n    body?: unknown\n  ): Promise<T> {\n    const url = `${baseUrl}${endpoint}`;\n    const idempotencyKey = generateId();\n\n    if (debug) {\n      console.log(`[Gotcha] ${method} ${endpoint}`, body);\n    }\n\n    const response = await fetchWithRetry(\n      url,\n      {\n        method,\n        headers: {\n          ...headers,\n          'Idempotency-Key': idempotencyKey,\n        },\n        body: body ? JSON.stringify(body) : undefined,\n      },\n      DEFAULT_RETRY_CONFIG,\n      debug\n    );\n\n    let data: Record<string, unknown>;\n    try {\n      data = await response.json();\n    } catch {\n      throw { code: 'PARSE_ERROR', message: 'Invalid response from server', status: response.status } as GotchaError;\n    }\n\n    if (!response.ok) {\n      const error = data.error as GotchaError;\n      if (debug) {\n        console.error(`[Gotcha] Error: ${error.code} - ${error.message}`);\n      }\n      throw error;\n    }\n\n    if (debug) {\n      console.log(`[Gotcha] Response:`, data);\n    }\n\n    return data as T;\n  }\n\n  return {\n    /**\n     * Submit a response (feedback, vote, etc.)\n     */\n    async submitResponse(\n      payload: Omit<SubmitResponsePayload, 'context'>\n    ): Promise<GotchaResponse> {\n      // Ensure user has an ID (anonymous if not provided)\n      const user = payload.user || {};\n      if (!user.id) {\n        user.id = getAnonymousId();\n      }\n\n      const fullPayload: SubmitResponsePayload = {\n        ...payload,\n        user,\n        context: collectContext(),\n        // Only include isBug if true\n        ...(payload.isBug ? { isBug: true } : {}),\n      };\n\n      // Queue if offline\n      if (typeof navigator !== 'undefined' && !navigator.onLine) {\n        enqueue(fullPayload as unknown as Record<string, unknown>, 'create');\n        return {\n          id: generateId(),\n          status: 'queued' as const,\n          createdAt: new Date().toISOString(),\n        };\n      }\n\n      try {\n        return await request<GotchaResponse>('POST', '/responses', fullPayload);\n      } catch (err) {\n        // On network failure, queue for later\n        if (err instanceof TypeError && typeof navigator !== 'undefined' && !navigator.onLine) {\n          enqueue(fullPayload as unknown as Record<string, unknown>, 'create');\n          return {\n            id: generateId(),\n            status: 'queued' as const,\n            createdAt: new Date().toISOString(),\n          };\n        }\n        throw err;\n      }\n    },\n\n    /**\n     * Check if a user has an existing response for an element\n     */\n    async checkExistingResponse(\n      elementId: string,\n      userId: string\n    ): Promise<ExistingResponse | null> {\n      const url = `${baseUrl}/responses/check?elementId=${encodeURIComponent(elementId)}&userId=${encodeURIComponent(userId)}`;\n\n      if (debug) {\n        console.log(`[Gotcha] GET /responses/check`);\n      }\n\n      const response = await fetchWithRetry(\n        url,\n        {\n          method: 'GET',\n          headers,\n        },\n        DEFAULT_RETRY_CONFIG,\n        debug\n      );\n\n      const data = await response.json();\n\n      if (!response.ok) {\n        const error = data.error as GotchaError;\n        if (debug) {\n          console.error(`[Gotcha] Error: ${error.code} - ${error.message}`);\n        }\n        throw error;\n      }\n\n      if (data.exists) {\n        if (debug) {\n          console.log(`[Gotcha] Found existing response:`, data.response);\n        }\n        return data.response as ExistingResponse;\n      }\n\n      return null;\n    },\n\n    /**\n     * Update an existing response\n     */\n    async updateResponse(\n      id: string,\n      payload: {\n        content?: string;\n        title?: string;\n        rating?: number;\n        vote?: VoteType;\n        pollSelected?: string[];\n      },\n      userId?: string\n    ): Promise<GotchaResponse> {\n      const url = `${baseUrl}/responses/${id}${userId ? `?userId=${encodeURIComponent(userId)}` : ''}`;\n\n      if (debug) {\n        console.log(`[Gotcha] PATCH /responses/${id}`, payload);\n      }\n\n      const response = await fetchWithRetry(\n        url,\n        {\n          method: 'PATCH',\n          headers,\n          body: JSON.stringify(payload),\n        },\n        DEFAULT_RETRY_CONFIG,\n        debug\n      );\n\n      const data = await response.json();\n\n      if (!response.ok) {\n        const error = data.error as GotchaError;\n        if (debug) {\n          console.error(`[Gotcha] Error: ${error.code} - ${error.message}`);\n        }\n        throw error;\n      }\n\n      if (debug) {\n        console.log(`[Gotcha] Response updated:`, data);\n      }\n\n      return data as GotchaResponse;\n    },\n\n    /**\n     * Get aggregate score data for an element\n     */\n    async getScore(elementId: string): Promise<ScoreData> {\n      const url = `${baseUrl}/scores/${encodeURIComponent(elementId)}`;\n\n      if (debug) {\n        console.log(`[Gotcha] GET /scores/${elementId}`);\n      }\n\n      const response = await fetchWithRetry(\n        url,\n        {\n          method: 'GET',\n          headers,\n        },\n        DEFAULT_RETRY_CONFIG,\n        debug\n      );\n\n      const data = await response.json();\n\n      if (!response.ok) {\n        const error = data.error as GotchaError;\n        if (debug) {\n          console.error(`[Gotcha] Error: ${error.code} - ${error.message}`);\n        }\n        throw error;\n      }\n\n      if (debug) {\n        console.log(`[Gotcha] Score:`, data);\n      }\n\n      return data as ScoreData;\n    },\n\n    /**\n     * Flag a response as a bug report\n     */\n    async flagAsBug(responseId: string): Promise<{ ticketId: string; status: string }> {\n      const url = `${baseUrl}/responses/${encodeURIComponent(responseId)}/bug`;\n\n      if (debug) {\n        console.log(`[Gotcha] POST /responses/${responseId}/bug`);\n      }\n\n      const response = await fetchWithRetry(\n        url,\n        {\n          method: 'POST',\n          headers,\n        },\n        DEFAULT_RETRY_CONFIG,\n        debug\n      );\n\n      const data = await response.json();\n\n      if (!response.ok) {\n        const error = data.error as GotchaError;\n        if (debug) {\n          console.error(`[Gotcha] Error: ${error.code} - ${error.message}`);\n        }\n        throw error;\n      }\n\n      if (debug) {\n        console.log(`[Gotcha] Bug flagged:`, data);\n      }\n\n      return data as { ticketId: string; status: string };\n    },\n\n    /**\n     * Flush queued offline submissions\n     */\n    async flushQueue(): Promise<void> {\n      if (flushing) return;\n      flushing = true;\n      try {\n        const items = getQueuedItems();\n        for (const item of items) {\n          try {\n            if (item.type === 'update' && item.payload.responseId) {\n              const { responseId, ...updatePayload } = item.payload;\n              await request('PATCH', `/responses/${responseId}`, updatePayload);\n            } else {\n              await request('POST', '/responses', item.payload);\n            }\n            dequeue(item.id);\n          } catch {\n            incrementRetries(item.id);\n          }\n        }\n      } finally {\n        flushing = false;\n      }\n    },\n\n    /**\n     * Get count of queued offline submissions\n     */\n    getQueueLength,\n\n    /**\n     * Get the base URL (for debugging)\n     */\n    getBaseUrl(): string {\n      return baseUrl;\n    },\n  };\n}\n\nexport type ApiClient = ReturnType<typeof createApiClient>;\n","const UNSAFE_KEYS = new Set(['__proto__', 'constructor', 'prototype']);\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function deepMerge(base: any, override: any): any {\n  const result = { ...base };\n  for (const key of Object.keys(override)) {\n    if (UNSAFE_KEYS.has(key)) continue;\n    const val = override[key];\n    if (val !== undefined && val !== null && typeof val === 'object' && !Array.isArray(val)) {\n      result[key] = deepMerge(base[key] ?? {}, val);\n    } else if (val !== undefined) {\n      result[key] = val;\n    }\n  }\n  return result;\n}\n","// ============================================\n// THEME TOKEN SYSTEM\n// ============================================\n//\n// Editorial palette aligned to the Gotcha dashboard / landing site (see\n// apps/web/app/globals.css). Warm paper-and-ink base, hairline rules,\n// burnt sienna as the sole memorable accent, sage + clay as semantic\n// affirm/warn. Zero glassmorphism — the widget is a composed editorial\n// card, not a blurred glass surface.\n//\n// The token *shape* (`ResolvedTheme` + sub-interfaces) is identical to\n// prior releases so customers' `themeConfig` / `customStyles` overrides\n// keep working. Only the values change. Keys like `glassBackground`\n// are retained for type-compat and reassigned to editorial equivalents\n// (paper / sienna ring). See the light preset for the full mapping.\n\nexport interface GotchaThemeColors {\n  primary: string;\n  primaryHover: string;\n  primaryText: string;\n  background: string;\n  backgroundGradient: string;\n  surface: string;\n  surfaceHover: string;\n  text: string;\n  textSecondary: string;\n  textDisabled: string;\n  border: string;\n  borderFocus: string;\n  success: string;\n  successSurface: string;\n  error: string;\n  errorSurface: string;\n  errorBorder: string;\n  warning: string;\n  warningActive: string;\n  warningSurface: string;\n  warningBorder: string;\n  starFilled: string;\n  starEmpty: string;\n  voteUp: string;\n  voteUpSurface: string;\n  voteUpBorder: string;\n  voteDown: string;\n  voteDownSurface: string;\n  voteDownBorder: string;\n  npsColors: string[];\n  buttonBackground: string;\n  buttonBackgroundHover: string;\n  buttonBackgroundDisabled: string;\n  buttonColor: string;\n  buttonColorDisabled: string;\n  buttonBorder: string;\n  buttonShadow: string;\n  backdropColor: string;\n  closeButton: string;\n  closeButtonHover: string;\n  closeButtonBg: string;\n  // Floating button surface (name retained for API compat with 1.1.x —\n  // was glass in prior art; is a paper-card in editorial).\n  glassBackground: string;\n  glassBorder: string;\n  glassColor: string;\n  glassShadow: string;\n  glassHoverShadow: string;\n  // Input\n  inputBackground: string;\n  inputBackgroundFocus: string;\n  inputBorder: string;\n  inputBorderFocus: string;\n  inputFocusRing: string;\n  // Poll\n  pollBorder: string;\n  pollSelectedBorder: string;\n  pollBackground: string;\n  pollSelectedBackground: string;\n  pollColor: string;\n  pollSelectedColor: string;\n  pollCheckBorder: string;\n  pollCheckSelectedBorder: string;\n  pollCheckSelectedBg: string;\n}\n\nexport interface GotchaThemeTypography {\n  fontFamily: string;\n  // A dedicated display stack for the G glyph and modal headlines.\n  // Editorial character that falls back cleanly to system serifs when\n  // Fraunces 144 SemiBold is base64-embedded in fonts/fraunces-subset.ts\n  // and prepended to the SDK stylesheet. The stack starts with the\n  // embedded 'Gotcha Fraunces' family so customer sites render the\n  // branded serif without any third-party font request.\n  fontFamilyDisplay: string;\n  fontSize: {\n    xs: number;\n    sm: number;\n    md: number;\n    lg: number;\n  };\n  fontWeight: {\n    normal: number;\n    medium: number;\n    semibold: number;\n    bold: number;\n  };\n}\n\nexport interface GotchaThemeBorders {\n  radius: {\n    sm: number;\n    md: number;\n    lg: number;\n    full: string;\n  };\n  width: number;\n}\n\nexport interface GotchaThemeShadows {\n  sm: string;\n  md: string;\n  lg: string;\n  modal: string;\n  button: string;\n}\n\nexport interface GotchaThemeAnimation {\n  duration: {\n    fast: string;\n    normal: string;\n    slow: string;\n  };\n  easing: {\n    default: string;\n    spring: string;\n  };\n}\n\nexport interface GotchaThemeConfig {\n  colors?: Partial<GotchaThemeColors>;\n  typography?: Partial<GotchaThemeTypography>;\n  borders?: Partial<GotchaThemeBorders>;\n  shadows?: Partial<GotchaThemeShadows>;\n  animation?: Partial<GotchaThemeAnimation>;\n}\n\nexport interface ResolvedTheme {\n  colors: GotchaThemeColors;\n  typography: GotchaThemeTypography;\n  borders: GotchaThemeBorders;\n  shadows: GotchaThemeShadows;\n  animation: GotchaThemeAnimation;\n}\n\n// ── NPS scale colours ────────────────────────────────────────\n// Editorial discipline: uniform ink across the scale. Selected state is\n// handled at the component layer (ink fill + paper text). No rainbow —\n// the emotional valence is communicated by the user's choice of number,\n// not by the colour. Customers who want the rainbow back override via\n// themeConfig.colors.npsColors.\nconst NPS_INK_LIGHT = Array(11).fill(\"#1A1714\");\nconst NPS_INK_DARK = Array(11).fill(\"#F2EEE6\");\n\n// ── Shared editorial values ──────────────────────────────────\n// 'Gotcha Fraunces' is our base64-embedded subset — see\n// fonts/fraunces-subset.ts. Listed first so the embedded font always\n// wins on customer sites that don't load Fraunces themselves. The\n// remaining entries are defence-in-depth for environments where the\n// data URL fails to decode.\nconst DISPLAY_STACK =\n  \"'Gotcha Fraunces', 'Fraunces 144', 'Fraunces', Georgia, 'Iowan Old Style', Charter, 'Source Serif Pro', serif\";\nconst BODY_STACK =\n  \"-apple-system, BlinkMacSystemFont, 'Inter', 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif\";\n\n// ── Light preset ─────────────────────────────────────────────\n// Palette mirrors apps/web/app/globals.css exactly:\n//   paper  #FAF8F4   ink     #1A1714\n//   rule   #E8E3DA   muted   #6B6660\n//   sienna #D4532A   sage    #6B8E6B   clay #B85A3F\nexport const LIGHT_TOKENS: ResolvedTheme = {\n  colors: {\n    // Primary action surface — editorial ink on paper.\n    primary: \"#1A1714\",\n    primaryHover: \"#2A2622\",\n    primaryText: \"#FAF8F4\",\n\n    // Canvas — flat paper, no gradient. Editorial cards live on a single\n    // neutral; dimension comes from borders and shadows, not colour shifts.\n    background: \"#FAF8F4\",\n    backgroundGradient: \"#FAF8F4\",\n    surface: \"#FAF8F4\",\n    surfaceHover: \"#F2EEE6\",\n\n    // Text ramp — ink for primary, muted for secondary. No pure black.\n    text: \"#1A1714\",\n    textSecondary: \"#6B6660\",\n    textDisabled: \"#A8A098\",\n\n    // Rule lines — the hairline that makes the editorial grid. One colour\n    // for every divider, border, and row separator.\n    border: \"#E8E3DA\",\n    borderFocus: \"#1A1714\",\n\n    // Affirm — sage. Used only for success state + bug-flag confirmation.\n    success: \"#6B8E6B\",\n    successSurface: \"rgba(107,142,107,0.08)\",\n\n    // Alert — clay. Used only for error left-edge + destructive remove.\n    error: \"#B85A3F\",\n    errorSurface: \"rgba(184,90,63,0.06)\",\n    errorBorder: \"rgba(184,90,63,0.18)\",\n\n    // \"Warning\" — mapped to sienna (the accent) so customers referencing\n    // the warning token get the editorial-accent treatment for bug-flag\n    // toggles, not a tech-yellow.\n    warning: \"#D4532A\",\n    warningActive: \"#B8451F\",\n    warningSurface: \"rgba(212,83,42,0.06)\",\n    warningBorder: \"rgba(212,83,42,0.22)\",\n\n    // Stars — ink stroke and fill, no amber. Empty = muted hairline.\n    starFilled: \"#1A1714\",\n    starEmpty: \"#C9C2B6\",\n\n    // Vote pills — ink only. The up/down semantics come from the icon\n    // shape + the prompt copy, not from green/red colour cues.\n    voteUp: \"#1A1714\",\n    voteUpSurface: \"#FAF8F4\",\n    voteUpBorder: \"#E8E3DA\",\n    voteDown: \"#1A1714\",\n    voteDownSurface: \"#FAF8F4\",\n    voteDownBorder: \"#E8E3DA\",\n\n    // NPS — uniform ink. Selected state filled at component layer.\n    npsColors: NPS_INK_LIGHT,\n\n    // Submit / primary button — ink.\n    buttonBackground: \"#1A1714\",\n    buttonBackgroundHover: \"#2A2622\",\n    buttonBackgroundDisabled: \"#E8E3DA\",\n    buttonColor: \"#FAF8F4\",\n    buttonColorDisabled: \"#A8A098\",\n    buttonBorder: \"none\",\n    buttonShadow: \"none\",\n\n    // Modal scrim — subtle ink wash, not a black overlay.\n    backdropColor: \"rgba(26,23,20,0.32)\",\n\n    // Close control — muted stroke that darkens to ink on hover. No\n    // filled background on rest; the hover gets a faint ink tint.\n    closeButton: \"#6B6660\",\n    closeButtonHover: \"#1A1714\",\n    closeButtonBg: \"rgba(26,23,20,0.04)\",\n\n    // Floating G button — the paper card. No glass, no blur. The name is\n    // preserved from the 1.1.x API for theme-override back-compat.\n    // Open-state sienna ring + glyph is applied at the component layer\n    // (see GotchaButton), not in tokens — it's a state, not a static\n    // style.\n    glassBackground: \"#FAF8F4\",\n    glassBorder: \"1px solid #E8E3DA\",\n    glassColor: \"#1A1714\",\n    glassShadow:\n      \"0 1px 2px rgba(26,23,20,0.04), 0 12px 32px -8px rgba(26,23,20,0.12)\",\n    glassHoverShadow:\n      \"0 2px 4px rgba(26,23,20,0.06), 0 16px 40px -8px rgba(26,23,20,0.16)\",\n\n    // Text input — transparent surface, hairline border, ink focus ring\n    // as a border darken (not a glow).\n    inputBackground: \"transparent\",\n    inputBackgroundFocus: \"transparent\",\n    inputBorder: \"#E8E3DA\",\n    inputBorderFocus: \"#1A1714\",\n    inputFocusRing: \"transparent\",\n\n    // Poll — newspaper-column rows. Background paper; selected row gets\n    // a 2px sienna left-edge applied at component layer.\n    pollBorder: \"#E8E3DA\",\n    pollSelectedBorder: \"#D4532A\",\n    pollBackground: \"#FAF8F4\",\n    pollSelectedBackground: \"#FAF8F4\",\n    pollColor: \"#1A1714\",\n    pollSelectedColor: \"#1A1714\",\n    pollCheckBorder: \"#C9C2B6\",\n    pollCheckSelectedBorder: \"#1A1714\",\n    pollCheckSelectedBg: \"#1A1714\",\n  },\n  typography: {\n    fontFamily: BODY_STACK,\n    fontFamilyDisplay: DISPLAY_STACK,\n    fontSize: { xs: 11, sm: 13, md: 15, lg: 17 },\n    fontWeight: { normal: 400, medium: 500, semibold: 600, bold: 700 },\n  },\n  borders: {\n    // Editorial radius scale — sharper than the slate aesthetic, closer\n    // to a print card. sm for small chips, md for inputs, lg for modal.\n    radius: { sm: 6, md: 10, lg: 14, full: \"999px\" },\n    width: 1,\n  },\n  shadows: {\n    // Softer, more directional shadow scale. Light comes from the top.\n    sm: \"0 1px 2px rgba(26,23,20,0.04)\",\n    md: \"0 2px 4px rgba(26,23,20,0.06), 0 8px 20px -6px rgba(26,23,20,0.08)\",\n    lg: \"0 2px 4px rgba(26,23,20,0.06), 0 16px 40px -8px rgba(26,23,20,0.12)\",\n    modal:\n      \"0 2px 4px rgba(26,23,20,0.06), 0 24px 64px -12px rgba(26,23,20,0.18)\",\n    button:\n      \"0 1px 2px rgba(26,23,20,0.04), 0 12px 32px -8px rgba(26,23,20,0.12)\",\n  },\n  animation: {\n    // 240ms page-turn language from the dashboard. `default` is the\n    // workhorse; `spring` is aliased to the same value so legacy code\n    // paths still read as editorial rather than bouncy.\n    duration: { fast: \"0.18s\", normal: \"0.24s\", slow: \"0.32s\" },\n    easing: {\n      default: \"cubic-bezier(0.22, 0.61, 0.36, 1)\",\n      spring: \"cubic-bezier(0.22, 0.61, 0.36, 1)\",\n    },\n  },\n};\n\n// ── Dark preset ──────────────────────────────────────────────\n// Not pure black — a warm near-black ink with ivory paper. Canvas (the\n// page / G button's host surface) sits at #141210; the modal lifts to\n// #1A1714 so the shadow has something to separate against. Without the\n// 6% step the card reads pasted-on.\n//\n// Contrast notes:\n//   - textSecondary #9A928A on #1A1714 = 4.76:1 (AA body, AA 10px ucase).\n//   - sienna #DC6340 tuned to preserve hue relationship with light\n//     #D4532A (not a hot-orange drift).\n//   - starEmpty raised to #4A433A so unrated stars remain perceptible.\nexport const DARK_TOKENS: ResolvedTheme = {\n  colors: {\n    primary: \"#F2EEE6\",\n    primaryHover: \"#FAF8F4\",\n    primaryText: \"#141210\",\n\n    // Modal surface — one step lighter than the body so the card lifts.\n    background: \"#1A1714\",\n    backgroundGradient: \"#1A1714\",\n    surface: \"#1A1714\",\n    surfaceHover: \"#221E1A\",\n\n    text: \"#F2EEE6\",\n    textSecondary: \"#9A928A\",\n    textDisabled: \"#5A5449\",\n\n    border: \"#2A2622\",\n    borderFocus: \"#F2EEE6\",\n\n    success: \"#8FAE8F\",\n    successSurface: \"rgba(143,174,143,0.1)\",\n\n    error: \"#D17560\",\n    errorSurface: \"rgba(209,117,96,0.06)\",\n    errorBorder: \"rgba(209,117,96,0.22)\",\n\n    // Sienna in dark — same hue family as light #D4532A, pushed just\n    // enough brighter to hold on dark ink without drifting toward orange.\n    warning: \"#DC6340\",\n    warningActive: \"#E8704A\",\n    warningSurface: \"rgba(220,99,64,0.08)\",\n    warningBorder: \"rgba(220,99,64,0.28)\",\n\n    starFilled: \"#F2EEE6\",\n    starEmpty: \"#4A433A\",\n\n    voteUp: \"#F2EEE6\",\n    voteUpSurface: \"#1A1714\",\n    voteUpBorder: \"#2A2622\",\n    voteDown: \"#F2EEE6\",\n    voteDownSurface: \"#1A1714\",\n    voteDownBorder: \"#2A2622\",\n\n    npsColors: NPS_INK_DARK,\n\n    buttonBackground: \"#F2EEE6\",\n    buttonBackgroundHover: \"#FAF8F4\",\n    buttonBackgroundDisabled: \"#2A2622\",\n    buttonColor: \"#141210\",\n    buttonColorDisabled: \"#5A5449\",\n    buttonBorder: \"none\",\n    buttonShadow: \"none\",\n\n    backdropColor: \"rgba(0,0,0,0.52)\",\n\n    closeButton: \"#9A928A\",\n    closeButtonHover: \"#F2EEE6\",\n    closeButtonBg: \"rgba(242,238,230,0.06)\",\n\n    // Floating G button — lifted one step above the canvas tone (#141210\n    // → #1A1714) so the card reads as a floating object on any dark host.\n    // Prior iteration sat at canvas which made the button disappear into\n    // typical dark-mode customer sites (which also use #141210-ish\n    // backgrounds). 6% lift is enough to separate without becoming a\n    // loud chrome element. Open-state sienna ring + glyph applied at\n    // component layer.\n    glassBackground: \"#1A1714\",\n    glassBorder: \"1px solid #2A2622\",\n    glassColor: \"#F2EEE6\",\n    glassShadow: \"0 2px 4px rgba(0,0,0,0.4), 0 16px 40px -8px rgba(0,0,0,0.5)\",\n    glassHoverShadow:\n      \"0 4px 8px rgba(0,0,0,0.45), 0 20px 48px -8px rgba(0,0,0,0.55)\",\n\n    inputBackground: \"transparent\",\n    inputBackgroundFocus: \"transparent\",\n    inputBorder: \"#2A2622\",\n    inputBorderFocus: \"#F2EEE6\",\n    inputFocusRing: \"transparent\",\n\n    pollBorder: \"#2A2622\",\n    pollSelectedBorder: \"#DC6340\",\n    pollBackground: \"#1A1714\",\n    pollSelectedBackground: \"#1A1714\",\n    pollColor: \"#F2EEE6\",\n    pollSelectedColor: \"#F2EEE6\",\n    pollCheckBorder: \"#3A342E\",\n    pollCheckSelectedBorder: \"#F2EEE6\",\n    pollCheckSelectedBg: \"#F2EEE6\",\n  },\n  typography: {\n    fontFamily: BODY_STACK,\n    fontFamilyDisplay: DISPLAY_STACK,\n    fontSize: { xs: 11, sm: 13, md: 15, lg: 17 },\n    fontWeight: { normal: 400, medium: 500, semibold: 600, bold: 700 },\n  },\n  borders: {\n    radius: { sm: 6, md: 10, lg: 14, full: \"999px\" },\n    width: 1,\n  },\n  shadows: {\n    sm: \"0 1px 2px rgba(0,0,0,0.3)\",\n    md: \"0 2px 4px rgba(0,0,0,0.35), 0 8px 20px -6px rgba(0,0,0,0.4)\",\n    lg: \"0 2px 4px rgba(0,0,0,0.4), 0 16px 40px -8px rgba(0,0,0,0.5)\",\n    modal: \"0 2px 4px rgba(0,0,0,0.4), 0 24px 64px -12px rgba(0,0,0,0.6)\",\n    button: \"0 1px 2px rgba(0,0,0,0.3), 0 12px 32px -8px rgba(0,0,0,0.45)\",\n  },\n  animation: {\n    duration: { fast: \"0.18s\", normal: \"0.24s\", slow: \"0.32s\" },\n    easing: {\n      default: \"cubic-bezier(0.22, 0.61, 0.36, 1)\",\n      spring: \"cubic-bezier(0.22, 0.61, 0.36, 1)\",\n    },\n  },\n};\n\n// ── Helper ───────────────────────────────────────────────────\n\nimport { deepMerge } from \"../utils/deepMerge\";\n\n/** Create a custom theme by merging partial overrides onto a preset */\nexport function createTheme(\n  base: \"light\" | \"dark\",\n  overrides: GotchaThemeConfig,\n): GotchaThemeConfig {\n  const preset = base === \"dark\" ? DARK_TOKENS : LIGHT_TOKENS;\n  return deepMerge(preset, overrides) as GotchaThemeConfig;\n}\n","import { LIGHT_TOKENS, DARK_TOKENS, GotchaThemeConfig, ResolvedTheme } from './tokens';\nimport { deepMerge } from '../utils/deepMerge';\n\n/**\n * Resolve a complete theme from the base preset + optional provider & instance overrides.\n * Returns a fully-resolved object with no undefined values.\n */\nexport function resolveTheme(\n  theme: 'light' | 'dark' | 'auto' | 'custom',\n  systemTheme: 'light' | 'dark',\n  providerConfig?: GotchaThemeConfig,\n): ResolvedTheme {\n  const effectiveTheme = theme === 'auto' || theme === 'custom' ? systemTheme : theme;\n  let resolved: ResolvedTheme = effectiveTheme === 'dark'\n    ? deepMerge({}, DARK_TOKENS) as ResolvedTheme\n    : deepMerge({}, LIGHT_TOKENS) as ResolvedTheme;\n\n  if (providerConfig) {\n    resolved = deepMerge(resolved, providerConfig) as ResolvedTheme;\n  }\n\n  return resolved;\n}\n","/**\n * Fraunces 9pt Regular (weight 400) — subsetted to printable ASCII\n * (U+0020-007E), no hinting, with kern + liga features retained.\n *\n * The 9pt optical size is chosen to match the marketing site's navbar,\n * which loads Fraunces as a variable font and renders at ~20px where\n * the browser auto-selects a 9pt opsz. The 144pt optical size (for\n * giant display headlines) reads chunky and condensed at the widget's\n * 22–40px range; 9pt reads elegant.\n *\n * Source: https://github.com/undercasetype/Fraunces (OFL-licensed).\n * Pinned upstream commit: 7ccdec31c6028118dce3e47fe864e3744460371d.\n * License text: packages/sdk/LICENSE.FRAUNCES.txt (shipped with the npm\n * package per package.json `files`).\n *\n * Subset command (kept for re-generation):\n *   pyftsubset Fraunces9pt-Regular.ttf \\\n *     --unicodes=U+0020-007E \\\n *     --flavor=woff2 \\\n *     --layout-features='kern,liga' \\\n *     --no-hinting --desubroutinize \\\n *     --drop-tables+=DSIG,FFTM\n *\n * The subset is embedded here so the SDK makes zero third-party font\n * requests — the widget's \"G\" glyph and \"Gotcha!\" success headline\n * render in the branded serif on any host page, privacy posture intact.\n */\n\n// font-family name used by the @font-face rule below. Chosen to avoid\n// colliding with a host page that already loads \"Fraunces\" via\n// next/font or Google Fonts — prefer ours by putting GOTCHA_FRAUNCES\n// first in the display stack so the embedded subset always wins on\n// customer sites.\nexport const GOTCHA_FRAUNCES_FAMILY = \"Gotcha Fraunces\";\n\nconst FRAUNCES_9PT_REGULAR_WOFF2_BASE64 =\n  \"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\";\n\n/**\n * @font-face CSS fragment. Injected via the SDK's style block (see\n * `theme/styles.ts`) at module-load time so the font is ready before\n * the first button render — avoids a FOUT on initial mount.\n *\n * font-display: block — show nothing for up to 3s then swap once the\n * (inlined) font is decoded. In practice the font is already in the\n * stylesheet as a data URL, so decode is synchronous and the swap is\n * effectively instant; 'block' just hedges against exotic environments\n * where data URLs aren't decoded synchronously.\n */\nexport const FRAUNCES_FONT_FACE = `\n@font-face {\n  font-family: '${GOTCHA_FRAUNCES_FAMILY}';\n  font-weight: 400;\n  font-style: normal;\n  font-display: block;\n  src: url(data:font/woff2;base64,${FRAUNCES_9PT_REGULAR_WOFF2_BASE64}) format('woff2');\n}\n`;\n","import { ResolvedTheme } from \"./tokens\";\nimport { FRAUNCES_FONT_FACE } from \"../fonts/fraunces-subset\";\n\nconst STYLE_ID = \"gotcha-styles\";\n\n/**\n * Strip characters that could break out of a CSS value context. Defensive\n * when interpolating tokens that customers could have overridden with a\n * malicious string via `themeConfig`.\n */\nfunction sanitizeCSS(value: string): string {\n  return value.replace(/[{}<>;@\\\\]/g, \"\");\n}\n\n/**\n * Build the SDK's stylesheet. The editorial refresh drops Carter One and\n * embeds a subsetted Fraunces 144 SemiBold instead (see\n * `fonts/fraunces-subset.ts`). The @font-face is prepended to the stylesheet\n * so the branded serif is available for the \"G\" glyph and \"Gotcha!\" success\n * headline on any host page — zero third-party font requests.\n *\n * Keyframes kept lean: a single page-turn entrance (opacity + 8px rise),\n * a stroke-draw for the success check, a textarea expand, a spinner, and\n * the reduced-motion blanket. All the bouncy \"bubble-pop / arrive-glow /\n * letter-in\" animation — the pre-editorial signature — is gone.\n */\nexport function generateStyleTag(theme: ResolvedTheme): string {\n  const easing = sanitizeCSS(theme.animation.easing.default);\n  const dNormal = sanitizeCSS(theme.animation.duration.normal);\n  const dFast = sanitizeCSS(theme.animation.duration.fast);\n  const fontFamily = sanitizeCSS(theme.typography.fontFamily);\n  const textDisabled = sanitizeCSS(theme.colors.textDisabled);\n  const borderFocus = sanitizeCSS(theme.colors.borderFocus);\n\n  return `\n/* ── Embedded Fraunces 144 SemiBold (OFL, subsetted to ASCII) ── */\n${FRAUNCES_FONT_FACE}\n/* ── Gotcha keyframes (editorial) ───────────────────────────── */\n\n@keyframes gotcha-fade-up {\n  from { opacity: 0; transform: translateY(8px); }\n  to { opacity: 1; transform: translateY(0); }\n}\n\n@keyframes gotcha-modal-in {\n  from { opacity: 0; transform: translateY(8px); }\n  to { opacity: 1; transform: translateY(0); }\n}\n\n@keyframes gotcha-modal-in-above {\n  from { opacity: 0; transform: translateY(-8px); }\n  to { opacity: 1; transform: translateY(0); }\n}\n\n@keyframes gotcha-modal-in-center {\n  from { opacity: 0; transform: translate(-50%, calc(-50% + 8px)); }\n  to { opacity: 1; transform: translate(-50%, -50%); }\n}\n\n@keyframes gotcha-overlay-in {\n  from { opacity: 0; }\n  to { opacity: 1; }\n}\n\n@keyframes gotcha-check-draw {\n  from { stroke-dashoffset: 30; }\n  to { stroke-dashoffset: 0; }\n}\n\n@keyframes gotcha-expand-in {\n  from { opacity: 0; max-height: 0; margin-top: 0; }\n  to { opacity: 1; max-height: 240px; margin-top: 14px; }\n}\n\n@keyframes gotcha-progress {\n  from { transform: scaleX(0); }\n  to { transform: scaleX(1); }\n}\n\n@keyframes gotcha-spin {\n  from { transform: rotate(0deg); }\n  to { transform: rotate(360deg); }\n}\n\n/* ── Base styles ────────────────────────────────────────────── */\n\n[data-gotcha] {\n  font-family: ${fontFamily};\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n  text-rendering: optimizeLegibility;\n  font-feature-settings: 'kern' 1, 'liga' 1;\n}\n\n[data-gotcha] *, [data-gotcha] *::before, [data-gotcha] *::after {\n  box-sizing: border-box;\n}\n\n[data-gotcha] button {\n  outline: none;\n}\n\n[data-gotcha] button:focus-visible {\n  outline: none;\n  box-shadow: 0 0 0 2px ${borderFocus};\n}\n\n.gotcha-root textarea::placeholder {\n  color: ${textDisabled};\n  /* Upright, not italic — italic placeholders depress comprehension in\n     form inputs (Baymard). Italic is reserved for verb states like\n     \"Sending…\" where it communicates motion/time. */\n}\n\n/* ── Animation utilities ───────────────────────────────────── */\n\n.gotcha-fade-up {\n  animation: gotcha-fade-up ${dNormal} ${easing} both;\n}\n\n.gotcha-modal-enter {\n  animation: gotcha-modal-in ${dNormal} ${easing} both;\n}\n\n.gotcha-modal-enter-above {\n  animation: gotcha-modal-in-above ${dNormal} ${easing} both;\n}\n\n.gotcha-modal-enter-center {\n  animation: gotcha-modal-in-center ${dNormal} ${easing} both;\n}\n\n.gotcha-overlay-enter {\n  animation: gotcha-overlay-in ${dFast} ${easing} both;\n}\n\n/* ── Reduced motion ──────────────────────────────────────────\n   Kill transforms and retime animations to near-instant. We carve out\n   the Spinner explicitly — it's the one widget surface where animation\n   communicates indeterminate status. Silencing it would leave reduced-\n   motion users staring at a static arc with no feedback that work is\n   in flight.\n*/\n@media (prefers-reduced-motion: reduce) {\n  [data-gotcha] *:not([role=\"img\"]), [data-gotcha] *::before, [data-gotcha] *::after {\n    animation-duration: 0.01ms !important;\n    animation-iteration-count: 1 !important;\n    transition-duration: 0.01ms !important;\n    transition-delay: 0ms !important;\n    transform: none !important;\n  }\n  [data-gotcha] .gotcha-fade-up,\n  [data-gotcha] .gotcha-modal-enter,\n  [data-gotcha] .gotcha-modal-enter-above,\n  [data-gotcha] .gotcha-modal-enter-center,\n  [data-gotcha] .gotcha-overlay-enter {\n    opacity: 1 !important;\n  }\n}\n`.trim();\n}\n\n/**\n * Inject the style tag into the document head (idempotent).\n *\n * Privacy: makes zero third-party network calls. No Google Fonts link,\n * no CDN fetch. The Fraunces 144 SemiBold subset is base64-embedded as\n * a data URL inside the @font-face rule, so the branded serif is\n * available for the \"G\" glyph and \"Gotcha!\" success headline on any\n * host page without an outbound request.\n */\nexport function injectStyles(theme: ResolvedTheme): void {\n  if (typeof document === \"undefined\") return;\n\n  let styleEl = document.getElementById(STYLE_ID) as HTMLStyleElement | null;\n  if (!styleEl) {\n    styleEl = document.createElement(\"style\");\n    styleEl.id = STYLE_ID;\n    document.head.appendChild(styleEl);\n  }\n  styleEl.textContent = generateStyleTag(theme);\n}\n","import React, {\n  createContext,\n  useContext,\n  useMemo,\n  useState,\n  useCallback,\n  useEffect,\n} from \"react\";\nimport { createApiClient, ApiClient } from \"../api/client\";\nimport { GotchaUser } from \"../types\";\nimport { GotchaThemeConfig } from \"../theme/tokens\";\nimport { resolveTheme } from \"../theme/resolveTheme\";\nimport { injectStyles } from \"../theme/styles\";\nimport { startErrorCapture, stopErrorCapture } from \"../utils/errorBuffer\";\n\nexport interface GotchaProviderProps {\n  /** Your Gotcha API key */\n  apiKey: string;\n  /** React children */\n  children: React.ReactNode;\n  /** Override the API base URL (for testing/staging) */\n  baseUrl?: string;\n  /** Enable debug logging */\n  debug?: boolean;\n  /** Disable all Gotcha buttons globally */\n  disabled?: boolean;\n  /** Default user metadata applied to all submissions */\n  defaultUser?: GotchaUser;\n  /**\n   * Default submitter email applied to all <Gotcha /> instances under this\n   * provider. Per-instance `userEmail` prop wins when both are set. Used\n   * by the dashboard to send \"we shipped what you asked for\" notify-back.\n   */\n  defaultUserEmail?: string;\n  /** Theme configuration overrides applied to all instances */\n  themeConfig?: GotchaThemeConfig;\n}\n\nexport interface GotchaContextValue {\n  client: ApiClient;\n  disabled: boolean;\n  defaultUser: GotchaUser;\n  defaultUserEmail?: string;\n  debug: boolean;\n  // Modal management - only one open at a time\n  activeModalId: string | null;\n  openModal: (elementId: string) => void;\n  closeModal: () => void;\n  // Theme\n  themeConfig?: GotchaThemeConfig;\n}\n\nconst GotchaContext = createContext<GotchaContextValue | null>(null);\n\nconst EMPTY_USER: GotchaUser = {};\n\nexport function GotchaProvider({\n  apiKey,\n  children,\n  baseUrl,\n  debug = false,\n  disabled = false,\n  defaultUser,\n  defaultUserEmail,\n  themeConfig,\n}: GotchaProviderProps) {\n  const [activeModalId, setActiveModalId] = useState<string | null>(null);\n\n  if (\n    baseUrl &&\n    !baseUrl.startsWith(\"https://\") &&\n    !baseUrl.startsWith(\"/\") &&\n    !baseUrl.includes(\"localhost\")\n  ) {\n    console.warn(\"[Gotcha] baseUrl should use HTTPS in production:\", baseUrl);\n  }\n\n  const client = useMemo(\n    () => createApiClient({ apiKey, baseUrl, debug }),\n    [apiKey, baseUrl, debug],\n  );\n\n  // Stabilize defaultUser reference\n  const stableDefaultUser = useMemo(\n    () => defaultUser ?? EMPTY_USER,\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n    [JSON.stringify(defaultUser)],\n  );\n\n  // Inject styles on mount. The embedded Fraunces @font-face is part of the\n  // stylesheet produced by generateStyleTag(), so the branded serif is\n  // available for both the \"G\" button glyph and the \"Gotcha!\" success\n  // headline without a network round-trip.\n  useEffect(() => {\n    const resolved = resolveTheme(\"light\", \"light\", themeConfig);\n    injectStyles(resolved);\n  }, [themeConfig]);\n\n  // Capture JS errors for context enrichment\n  useEffect(() => {\n    startErrorCapture();\n    return () => stopErrorCapture();\n  }, []);\n\n  // Flush offline queue on reconnect and on mount\n  useEffect(() => {\n    client.flushQueue();\n    const handleOnline = () => client.flushQueue();\n    window.addEventListener(\"online\", handleOnline);\n    return () => window.removeEventListener(\"online\", handleOnline);\n  }, [client]);\n\n  const openModal = useCallback((elementId: string) => {\n    setActiveModalId(elementId);\n  }, []);\n\n  const closeModal = useCallback(() => {\n    setActiveModalId(null);\n  }, []);\n\n  const value: GotchaContextValue = useMemo(\n    () => ({\n      client,\n      disabled,\n      defaultUser: stableDefaultUser,\n      defaultUserEmail,\n      debug,\n      activeModalId,\n      openModal,\n      closeModal,\n      themeConfig,\n    }),\n    [\n      client,\n      disabled,\n      stableDefaultUser,\n      defaultUserEmail,\n      debug,\n      activeModalId,\n      openModal,\n      closeModal,\n      themeConfig,\n    ],\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  /** Opt-in submitter email for notify-back when feedback ships */\n  userEmail?: string;\n  onePerUser?: boolean;\n  /** When onePerUser is true, allow a new submission after this many days */\n  cooldownDays?: number;\n  onSuccess?: (response: GotchaResponse) => void;\n  onError?: (error: Error) => void;\n}\n\ninterface SubmitData {\n  content?: string;\n  title?: string;\n  rating?: number;\n  vote?: VoteType;\n  pollSelected?: string[];\n  isBug?: boolean;\n  screenshot?: string;\n}\n\nfunction isResponseExpired(createdAt: string, cooldownDays: number): boolean {\n  const createdTime = new Date(createdAt).getTime();\n  if (isNaN(createdTime)) return true;\n  const ageMs = Date.now() - createdTime;\n  const cooldownMs = cooldownDays * 24 * 60 * 60 * 1000;\n  return ageMs >= cooldownMs;\n}\n\nexport function useSubmit(options: UseSubmitOptions) {\n  const { client, defaultUser } = useGotchaContext();\n  const [isLoading, setIsLoading] = useState(false);\n  const [isCheckingExisting, setIsCheckingExisting] = useState(false);\n  const [error, setError] = useState<string | null>(null);\n  const [existingResponse, setExistingResponse] = useState<ExistingResponse | null>(null);\n\n  // Check for existing response when user ID is provided and onePerUser is enabled\n  useEffect(() => {\n    if (process.env.NODE_ENV !== 'production' && options.cooldownDays && !options.onePerUser) {\n      console.warn('[Gotcha] cooldownDays has no effect without onePerUser=true');\n    }\n\n    const userId = options.user?.id || defaultUser?.id;\n    if (!userId || !options.onePerUser) {\n      setExistingResponse(null);\n      return;\n    }\n\n    let cancelled = false;\n\n    const checkExisting = async () => {\n      setIsCheckingExisting(true);\n      try {\n        const existing = await client.checkExistingResponse(options.elementId, userId);\n        if (!cancelled) {\n          if (existing && options.cooldownDays && options.cooldownDays > 0 &&\n              isResponseExpired(existing.createdAt, options.cooldownDays)) {\n            setExistingResponse(null);\n          } else {\n            setExistingResponse(existing);\n          }\n        }\n      } catch {\n        // Ignore errors - just means no existing response found\n        if (!cancelled) {\n          setExistingResponse(null);\n        }\n      } finally {\n        if (!cancelled) {\n          setIsCheckingExisting(false);\n        }\n      }\n    };\n\n    checkExisting();\n\n    return () => {\n      cancelled = true;\n    };\n  }, [client, options.elementId, options.user?.id, defaultUser?.id, options.onePerUser, options.cooldownDays]);\n\n  const submit = useCallback(\n    async (data: SubmitData) => {\n      setIsLoading(true);\n      setError(null);\n\n      try {\n        const userId = options.user?.id || defaultUser?.id;\n        let response: GotchaResponse;\n\n        // If onePerUser is enabled and we have an existing response, update instead of create\n        if (options.onePerUser && existingResponse && userId) {\n          response = await client.updateResponse(\n            existingResponse.id,\n            {\n              content: data.content,\n              title: data.title,\n              rating: data.rating,\n              vote: data.vote,\n              pollSelected: data.pollSelected,\n            },\n            userId\n          );\n        } else {\n          response = await client.submitResponse({\n            elementId: options.elementId,\n            mode: options.mode,\n            content: data.content,\n            title: data.title,\n            rating: data.rating,\n            vote: data.vote,\n            pollOptions: options.pollOptions,\n            pollSelected: data.pollSelected,\n            isBug: data.isBug,\n            screenshot: data.screenshot,\n            user: { ...defaultUser, ...options.user },\n            userEmail: options.userEmail,\n          });\n        }\n\n        // Update existingResponse so isEditing flips to true after first submit (only for onePerUser)\n        if (options.onePerUser) {\n          setExistingResponse({\n            id: response.id,\n            mode: options.mode,\n            content: data.content ?? null,\n            title: data.title ?? null,\n            rating: data.rating ?? null,\n            vote: data.vote ?? null,\n            pollSelected: data.pollSelected ?? null,\n            createdAt: response.createdAt,\n          });\n        }\n\n        options.onSuccess?.(response);\n        return response;\n      } catch (err) {\n        const errorMessage = err instanceof Error ? err.message : 'Something went wrong';\n        setError(errorMessage);\n        options.onError?.(err instanceof Error ? err : new Error(errorMessage));\n        throw err;\n      } finally {\n        setIsLoading(false);\n      }\n    },\n    [client, defaultUser, options, existingResponse]\n  );\n\n  return {\n    submit,\n    isLoading,\n    isCheckingExisting,\n    error,\n    existingResponse,\n    isEditing: !!existingResponse,\n    clearError: () => setError(null),\n  };\n}\n","import { useState, useCallback, useEffect, useMemo } from 'react';\nimport { STORAGE_KEYS } from '../constants';\nimport { getAnonymousId } from '../utils/anonymous';\nimport { safeGetItem, safeSetItem } from '../utils/localStorage';\n\ninterface UseHideAfterSubmitOptions {\n  elementId: string;\n  userId?: string;\n  hideAfterSubmitDays?: number;\n}\n\nfunction getStorageKey(elementId: string, userId: string): string {\n  return `${STORAGE_KEYS.HIDDEN_UNTIL}_${elementId}_${userId}`;\n}\n\nfunction checkIsHidden(elementId: string, resolvedUserId: string, hideAfterSubmitDays?: number): boolean {\n  if (!hideAfterSubmitDays || hideAfterSubmitDays <= 0) return false;\n  const key = getStorageKey(elementId, resolvedUserId);\n  const hiddenUntilStr = safeGetItem(key);\n  if (!hiddenUntilStr) return false;\n  return new Date(hiddenUntilStr).getTime() > Date.now();\n}\n\nexport function useHideAfterSubmit(options: UseHideAfterSubmitOptions) {\n  const { elementId, userId, hideAfterSubmitDays } = options;\n  const resolvedUserId = useMemo(() => userId || getAnonymousId(), [userId]);\n\n  const [isHidden, setIsHidden] = useState(() =>\n    checkIsHidden(elementId, resolvedUserId, hideAfterSubmitDays)\n  );\n\n  // Re-evaluate when props change dynamically\n  useEffect(() => {\n    setIsHidden(checkIsHidden(elementId, resolvedUserId, hideAfterSubmitDays));\n  }, [elementId, resolvedUserId, hideAfterSubmitDays]);\n\n  const markHidden = useCallback(() => {\n    if (!hideAfterSubmitDays || hideAfterSubmitDays <= 0) return;\n\n    const key = getStorageKey(elementId, resolvedUserId);\n    const hiddenUntil = new Date(\n      Date.now() + hideAfterSubmitDays * 24 * 60 * 60 * 1000\n    );\n    safeSetItem(key, hiddenUntil.toISOString());\n    setIsHidden(true);\n  }, [elementId, resolvedUserId, hideAfterSubmitDays]);\n\n  return { isHidden, markHidden };\n}\n","import { useState, useEffect } from 'react';\nimport { STORAGE_KEYS } from '../constants';\nimport { safeGetItem, safeSetItem } from '../utils/localStorage';\n\ninterface UseTriggerConditionsOptions {\n  elementId: string;\n  showAfterSeconds?: number;\n  showAfterScrollPercent?: number;\n  showAfterVisits?: number;\n}\n\nfunction getVisitKey(elementId: string): string {\n  return `${STORAGE_KEYS.VISIT_COUNT}_${elementId}`;\n}\n\nexport function useTriggerConditions(options: UseTriggerConditionsOptions) {\n  const { elementId, showAfterSeconds, showAfterScrollPercent, showAfterVisits } = options;\n\n  const hasConditions = showAfterSeconds != null || showAfterScrollPercent != null || showAfterVisits != null;\n\n  const [timeMet, setTimeMet] = useState(!showAfterSeconds);\n  const [scrollMet, setScrollMet] = useState(!showAfterScrollPercent);\n  const [visitsMet] = useState(() => {\n    if (!showAfterVisits) return true;\n    const key = getVisitKey(elementId);\n    const current = parseInt(safeGetItem(key) || '0', 10);\n    const next = current + 1;\n    safeSetItem(key, String(next));\n    return next >= showAfterVisits;\n  });\n\n  // Time delay\n  useEffect(() => {\n    if (!showAfterSeconds || showAfterSeconds <= 0) return;\n\n    const start = Date.now();\n    const targetMs = showAfterSeconds * 1000;\n\n    const check = () => {\n      if (Date.now() - start >= targetMs) {\n        setTimeMet(true);\n      } else {\n        timer = setTimeout(check, Math.min(1000, targetMs - (Date.now() - start)));\n      }\n    };\n\n    let timer = setTimeout(check, Math.min(1000, targetMs));\n    return () => clearTimeout(timer);\n  }, [showAfterSeconds]);\n\n  // Scroll depth\n  useEffect(() => {\n    if (!showAfterScrollPercent || showAfterScrollPercent <= 0) return;\n\n    const checkScroll = () => {\n      const scrollHeight = document.documentElement.scrollHeight;\n      const viewportHeight = window.innerHeight;\n\n      // If page can't scroll, condition is auto-met\n      if (scrollHeight <= viewportHeight) {\n        setScrollMet(true);\n        return;\n      }\n\n      const scrolled = (window.scrollY + viewportHeight) / scrollHeight * 100;\n      if (scrolled >= showAfterScrollPercent) {\n        setScrollMet(true);\n      }\n    };\n\n    checkScroll();\n    if (!scrollMet) {\n      window.addEventListener('scroll', checkScroll, { passive: true });\n      return () => window.removeEventListener('scroll', checkScroll);\n    }\n  }, [showAfterScrollPercent, scrollMet]);\n\n  return {\n    conditionsMet: !hasConditions || (timeMet && scrollMet && visitsMet),\n  };\n}\n","/**\n * Simple class name utility\n * Combines class names, filtering out falsy values\n */\nexport function cn(...classes: (string | undefined | null | false)[]): string {\n  return classes.filter(Boolean).join(' ');\n}\n","/**\n * Detect if the device supports touch\n */\nexport const isTouchDevice = (): boolean => {\n  if (typeof window === 'undefined') return false;\n  return 'ontouchstart' in window || navigator.maxTouchPoints > 0;\n};\n\n/**\n * Get the appropriate size based on device type\n */\nexport const getResponsiveSize = (\n  size: 'sm' | 'md' | 'lg',\n  isTouch: boolean\n): number => {\n  const sizes = {\n    sm: { desktop: 24, mobile: 28 },\n    md: { desktop: 32, mobile: 34 },\n    lg: { desktop: 40, mobile: 40 },\n  };\n\n  return isTouch ? sizes[size].mobile : sizes[size].desktop;\n};\n","import React, { useState, useEffect, useMemo } from \"react\";\nimport { Size, Theme, GotchaStyles } from \"../types\";\nimport { cn } from \"../utils/cn\";\nimport { isTouchDevice, getResponsiveSize } from \"../utils/device\";\nimport { resolveTheme } from \"../theme/resolveTheme\";\nimport { useGotchaContext } from \"./GotchaProvider\";\n\nexport interface GotchaButtonProps {\n  size: Size;\n  theme: Theme;\n  customStyles?: GotchaStyles;\n  showOnHover: boolean;\n  touchBehavior: \"always-visible\" | \"tap-to-reveal\";\n  onClick: () => void;\n  isOpen: boolean;\n  isParentHovered?: boolean;\n  /** Enable entrance animation (default: true) */\n  animated?: boolean;\n  /** Number of queued offline submissions */\n  queuedCount?: number;\n}\n\nfunction getInitialSystemTheme(): \"light\" | \"dark\" {\n  if (typeof window === \"undefined\") return \"light\";\n  return window.matchMedia(\"(prefers-color-scheme: dark)\").matches\n    ? \"dark\"\n    : \"light\";\n}\n\n/**\n * The floating G button — the single most-seen surface of the widget.\n *\n * Editorial aesthetic: a composed paper card (not glassmorphism), hairline\n * border, soft directional shadow, serif G. On hover the button lifts by\n * 1px and the shadow deepens — a quiet, confident hover. On active (press)\n * it settles back by 1px, scales to 97%.\n *\n * The open state is the one brand moment: border switches to burnt sienna\n * and the G glyph turns sienna too. This is the only place on the button\n * the accent appears. It tells the user \"you've activated this — it's\n * listening.\"\n *\n * Entrance: opacity 0 → 1 with a 6px rise over 320ms page-turn. No bubble-\n * pop, no arrive-glow, no letter-in flutter. The whole pre-editorial\n * animation vocabulary is gone; the widget arrives like a card settling\n * onto a page, not a chat bubble bursting onto screen.\n */\nexport function GotchaButton({\n  size,\n  theme,\n  customStyles,\n  showOnHover,\n  touchBehavior,\n  onClick,\n  isOpen,\n  isParentHovered = false,\n  animated = true,\n  queuedCount = 0,\n}: GotchaButtonProps) {\n  const [isTouch, setIsTouch] = useState(false);\n  const [tapRevealed, setTapRevealed] = useState(false);\n  const [systemTheme, setSystemTheme] = useState<\"light\" | \"dark\">(\n    getInitialSystemTheme,\n  );\n  const [isHovered, setIsHovered] = useState(false);\n  const [isPressed, setIsPressed] = useState(false);\n  const [hasEntered, setHasEntered] = useState(false);\n\n  const { themeConfig } = useGotchaContext();\n\n  useEffect(() => {\n    setIsTouch(isTouchDevice());\n\n    if (typeof window === \"undefined\") return;\n    const darkQuery = window.matchMedia(\"(prefers-color-scheme: dark)\");\n    const handler = (e: MediaQueryListEvent) =>\n      setSystemTheme(e.matches ? \"dark\" : \"light\");\n    darkQuery.addEventListener(\"change\", handler);\n    return () => darkQuery.removeEventListener(\"change\", handler);\n  }, []);\n\n  // Determine visibility\n  const shouldShow = (() => {\n    if (isOpen) return true;\n    if (!isTouch && showOnHover) return isParentHovered;\n    if (isTouch && touchBehavior === \"tap-to-reveal\") return tapRevealed;\n    return true;\n  })();\n\n  // Mark the entrance animation complete so subsequent hover/press\n  // transforms use the smooth page-turn easing.\n  useEffect(() => {\n    if (shouldShow && !hasEntered) {\n      const timer = setTimeout(() => setHasEntered(true), 320);\n      return () => clearTimeout(timer);\n    }\n  }, [shouldShow, hasEntered]);\n\n  const handleClick = () => {\n    if (isTouch && touchBehavior === \"tap-to-reveal\" && !tapRevealed) {\n      setTapRevealed(true);\n      return;\n    }\n    onClick();\n  };\n\n  const buttonSize = getResponsiveSize(size, isTouch);\n  const t = useMemo(\n    () => resolveTheme(theme, systemTheme, themeConfig),\n    [theme, systemTheme, themeConfig],\n  );\n\n  // The open-state brand moment — border + glyph colour switch to the\n  // editorial accent. Computed once per render so the transition can\n  // interpolate borderColor smoothly.\n  const borderColor = isOpen ? t.colors.warning /* sienna */ : t.colors.border;\n  const glyphColor = isOpen ? t.colors.warning : t.colors.glassColor;\n\n  // Transform ladder — editorial button stays put on hover. Lift-on-hover\n  // reads as tech-button bounce; a quiet editorial card earns attention\n  // with shadow weight, not movement. Only press registers a scale-down\n  // (tactile \"click received\"), and entrance fades in from slight scale.\n  //   hidden:  scale(0.96), opacity 0\n  //   press:   scale(0.97)\n  //   rest/hover: scale(1)  — shadow + border-color carry the hover cue\n  const getTransform = () => {\n    if (!shouldShow) return \"scale(0.96)\";\n    if (isPressed) return \"scale(0.97)\";\n    return \"scale(1)\";\n  };\n\n  // Asymmetric press timing: fast on the way in (80ms = \"you registered my\n  // click immediately\"), slower on the way out (160ms = \"settling back\"),\n  // smoothest on rest hover (180ms). Open-state colour swap gets its own\n  // 240ms curve — deliberate brand moment, not a reactive flicker.\n  const transitionDur = isPressed ? \"80ms\" : \"160ms\";\n  const easing = t.animation.easing.default;\n\n  // Hover cue: background warms one step (paper → surface-hover) + shadow\n  // deepens. Glyph stays untouched — no scale, no opacity shift. Button\n  // geometry stays put (no lift).\n  const backgroundColor =\n    isHovered && !isOpen ? t.colors.surfaceHover : t.colors.glassBackground;\n\n  const baseStyles: React.CSSProperties = {\n    position: \"relative\",\n    width: buttonSize,\n    height: buttonSize,\n    borderRadius: t.borders.radius.full,\n    border: `1px solid ${borderColor}`,\n    cursor: \"pointer\",\n    display: \"flex\",\n    alignItems: \"center\",\n    justifyContent: \"center\",\n    background: backgroundColor,\n    color: glyphColor,\n    boxShadow: isHovered ? t.colors.glassHoverShadow : t.colors.glassShadow,\n    transition: hasEntered\n      ? `transform ${transitionDur} ${easing}, background-color 180ms ${easing}, box-shadow 180ms ${easing}, border-color 240ms ${easing}, color 240ms ${easing}`\n      : `opacity 320ms ${easing}, transform 320ms ${easing}`,\n    opacity: shouldShow ? 1 : 0,\n    transform: getTransform(),\n    pointerEvents: shouldShow ? \"auto\" : \"none\",\n    ...customStyles?.button,\n  };\n\n  return (\n    <button\n      type=\"button\"\n      onClick={handleClick}\n      onMouseEnter={() => setIsHovered(true)}\n      onMouseLeave={() => {\n        setIsHovered(false);\n        setIsPressed(false);\n      }}\n      onMouseDown={() => setIsPressed(true)}\n      onMouseUp={() => setIsPressed(false)}\n      onTouchStart={() => setIsPressed(true)}\n      onTouchEnd={() => setIsPressed(false)}\n      style={baseStyles}\n      className={cn(\"gotcha-button\", isOpen && \"gotcha-button--open\")}\n      aria-label=\"Give feedback on this feature\"\n      aria-expanded={isOpen}\n      aria-haspopup=\"dialog\"\n    >\n      <GotchaIcon\n        size={buttonSize * 0.62}\n        color={glyphColor}\n        fontFamilyDisplay={t.typography.fontFamilyDisplay}\n        animated={animated && !hasEntered}\n      />\n      {queuedCount > 0 && (\n        <span\n          aria-label={`${queuedCount} queued`}\n          style={{\n            position: \"absolute\",\n            top: -2,\n            right: -2,\n            width: 8,\n            height: 8,\n            borderRadius: \"50%\",\n            backgroundColor: t.colors.warning,\n            border: `1.5px solid ${t.colors.background}`,\n          }}\n        />\n      )}\n    </button>\n  );\n}\n\nfunction GotchaIcon({\n  size,\n  color,\n  fontFamilyDisplay,\n  animated,\n}: {\n  size: number;\n  color: string;\n  fontFamilyDisplay: string;\n  animated: boolean;\n}) {\n  const [mounted, setMounted] = useState(false);\n  useEffect(() => {\n    setMounted(true);\n  }, []);\n\n  return (\n    <span\n      aria-hidden=\"true\"\n      style={{\n        // The serif G is the brand mark. Fraunces-first with system-serif\n        // fallback. Weight 400 (Regular) matches the embedded Fraunces 9pt\n        // subset and the marketing navbar's effective weight. Avoids the\n        // browser synthesizing bold against a regular-only @font-face.\n        fontFamily: fontFamilyDisplay,\n        fontWeight: 400,\n        fontSize: size,\n        fontStyle: \"normal\",\n        lineHeight: 1,\n        color,\n        // Optical centering — a capital G's visible bowl sits slightly\n        // ABOVE the ink-rect center. Prior iteration used translateY(0.5px)\n        // which is sub-pixel; during the button's bg-color hover\n        // transition the text AA re-snapped per repaint and the glyph\n        // appeared to \"twitch\" each frame. Fix: snap to integer pixel\n        // with translateY(1px) (0.5px imperceptibly different from 1px\n        // at this size) and promote to its own compositor layer via\n        // translateZ(0) + will-change: transform so the glyph is\n        // composited once and not repainted with the button.\n        transform: \"translateY(1px) translateZ(0)\",\n        willChange: \"transform\",\n        letterSpacing: \"normal\",\n        userSelect: \"none\",\n        display: \"inline-block\",\n        opacity: animated ? (mounted ? 1 : 0) : 1,\n        transition: animated\n          ? \"opacity 240ms cubic-bezier(0.22, 0.61, 0.36, 1) 120ms\"\n          : \"none\",\n      }}\n    >\n      G\n    </span>\n  );\n}\n","import React, { useEffect, useState } from 'react';\nimport { ResolvedTheme } from '../theme/tokens';\nimport { isTouchDevice } from '../utils/device';\n\ninterface ScreenshotPreviewProps {\n  src: string;\n  onRemove: () => void;\n  resolvedTheme: ResolvedTheme;\n}\n\n/**\n * Screenshot preview — paper-framed image with a mono caption beneath\n * and a remove affordance that sits in the top-right. At rest the remove\n * button is a hairline X on paper; hover fills clay (the destructive\n * brand moment).\n *\n * On touch devices (no hover), the button is always fully visible —\n * tap-to-reveal-then-tap-to-confirm was two taps for a destructive\n * action and felt wrong.\n */\nexport function ScreenshotPreview({ src, onRemove, resolvedTheme: t }: ScreenshotPreviewProps) {\n  const [isTouch, setIsTouch] = useState(false);\n  const [removeHover, setRemoveHover] = useState(false);\n\n  useEffect(() => {\n    setIsTouch(isTouchDevice());\n  }, []);\n\n  // Approximate the image byte size from the data URL length (base64 ≈ 4/3\n  // of the raw bytes). Good enough for a \"~142 KB\" caption hint.\n  const approxKb = (() => {\n    if (!src.startsWith('data:')) return null;\n    const commaIdx = src.indexOf(',');\n    if (commaIdx < 0) return null;\n    const b64 = src.slice(commaIdx + 1);\n    return Math.round((b64.length * 3) / 4 / 1024);\n  })();\n\n  return (\n    <div style={{ marginTop: 12 }}>\n      <div\n        style={{\n          position: 'relative',\n          borderRadius: t.borders.radius.sm,\n          overflow: 'hidden',\n          border: `1px solid ${t.colors.border}`,\n          padding: 4,\n          background: t.colors.background,\n        }}\n      >\n        <img\n          src={src}\n          alt=\"Screenshot attached to the feedback\"\n          style={{\n            display: 'block',\n            width: '100%',\n            maxHeight: 140,\n            objectFit: 'cover',\n            borderRadius: Math.max(0, t.borders.radius.sm - 2),\n          }}\n        />\n        <button\n          type=\"button\"\n          onClick={onRemove}\n          onMouseEnter={() => setRemoveHover(true)}\n          onMouseLeave={() => setRemoveHover(false)}\n          aria-label=\"Remove screenshot\"\n          style={{\n            position: 'absolute',\n            top: 8,\n            right: 8,\n            // Touch: 32×32 so the hit area clears WCAG AAA. Desktop: a\n            // tighter 24×24 since cursor precision is higher.\n            width: isTouch ? 32 : 24,\n            height: isTouch ? 32 : 24,\n            borderRadius: '50%',\n            border: `1px solid ${removeHover ? t.colors.error : t.colors.border}`,\n            backgroundColor: removeHover ? t.colors.error : t.colors.background,\n            color: removeHover ? t.colors.primaryText : t.colors.textSecondary,\n            cursor: 'pointer',\n            display: 'flex',\n            alignItems: 'center',\n            justifyContent: 'center',\n            transition: `all ${t.animation.duration.fast} ${t.animation.easing.default}`,\n          }}\n        >\n          <svg width={10} height={10} viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\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      </div>\n      <p\n        style={{\n          margin: '6px 0 0',\n          fontFamily:\n            \"ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, 'Liberation Mono', monospace\",\n          fontSize: 10,\n          letterSpacing: '0.08em',\n          textTransform: 'uppercase',\n          color: t.colors.textSecondary,\n        }}\n      >\n        screenshot.png{approxKb != null ? ` · ${approxKb} KB` : ''}\n      </p>\n    </div>\n  );\n}\n","import React, { useState, useEffect, useRef } from 'react';\nimport { GotchaStyles } from '../../types';\nimport { ResolvedTheme } from '../../theme/tokens';\nimport { isTouchDevice } from '../../utils/device';\nimport { ScreenshotPreview } from '../ScreenshotPreview';\n\ninterface FeedbackModeProps {\n  resolvedTheme: ResolvedTheme;\n  placeholder?: string;\n  submitText: string;\n  isLoading: boolean;\n  onSubmit: (data: { content?: string; rating?: number; isBug?: boolean; screenshot?: string }) => void;\n  customStyles?: GotchaStyles;\n  initialValues?: {\n    content?: string | null;\n    rating?: number | null;\n  };\n  isEditing?: boolean;\n  showText?: boolean;\n  showRating?: boolean;\n  enableBugFlag?: boolean;\n  bugFlagLabel?: string;\n  enableScreenshot?: boolean;\n}\n\n/**\n * Feedback mode — stars + textarea + optional bug flag + screenshot.\n *\n * Editorial details:\n *   - Stars: ink stroke when empty, ink fill when rated. Hover cascades the\n *     fill up to the cursor with a 30ms per-star stagger. No glow, no pulse.\n *   - Textarea: transparent, hairline border, italic placeholder. Focus\n *     darkens the border to ink — no 3px glow ring.\n *   - Submit: ink pill, \"Sending…\" italic for the loading state, no spinner.\n *   - Bug flag: a hairline-bordered row with a checkbox-style indicator\n *     on the right. Active state uses sienna (warning token) — aligned\n *     with the dashboard's bug-report affordance.\n *   - Screenshot: paper-framed preview with a mono caption and a remove\n *     affordance that surfaces on hover (clay colour — the destructive\n *     brand moment).\n */\nexport function FeedbackMode({\n  resolvedTheme: t,\n  placeholder,\n  submitText,\n  isLoading,\n  onSubmit,\n  customStyles,\n  initialValues,\n  isEditing = false,\n  showText = true,\n  showRating = true,\n  enableBugFlag = false,\n  bugFlagLabel,\n  enableScreenshot = false,\n}: FeedbackModeProps) {\n  const [content, setContent] = useState(initialValues?.content || '');\n  const [rating, setRating] = useState<number | null>(initialValues?.rating ?? null);\n  const [isBug, setIsBug] = useState(false);\n  const [isTouch, setIsTouch] = useState(false);\n  const [screenshot, setScreenshot] = useState<string | null>(null);\n  const [capturingScreenshot, setCapturingScreenshot] = useState(false);\n  const [screenshotError, setScreenshotError] = useState(false);\n\n  useEffect(() => {\n    setIsTouch(isTouchDevice());\n  }, []);\n\n  useEffect(() => {\n    if (initialValues?.content !== undefined) setContent(initialValues.content || '');\n    if (initialValues?.rating !== undefined) setRating(initialValues.rating ?? null);\n  }, [initialValues?.content, initialValues?.rating]);\n\n  const canSubmit = (() => {\n    if (showText && showRating) return content.trim().length > 0 || rating !== null;\n    if (showText) return content.trim().length > 0;\n    if (showRating) return rating !== null;\n    return false;\n  })();\n\n  const handleScreenshotCapture = async () => {\n    setCapturingScreenshot(true);\n    setScreenshotError(false);\n    try {\n      const { captureScreenshot } = await import('../../utils/screenshot');\n      const result = await captureScreenshot();\n      if (result) setScreenshot(result);\n      else setScreenshotError(true);\n    } catch {\n      setScreenshotError(true);\n    } finally {\n      setCapturingScreenshot(false);\n    }\n    // Deliberately no auto-clear — 3s dismiss was too fast to read on\n    // mobile. The error persists until the user taps \"Try again\" or\n    // toggles bug-flag off.\n  };\n\n  const handleSubmit = (e: React.FormEvent) => {\n    e.preventDefault();\n    if (!canSubmit || isLoading) return;\n    onSubmit({\n      content: showText && content.trim() ? content.trim() : undefined,\n      rating: showRating && rating !== null ? rating : undefined,\n      isBug: isBug || undefined,\n      screenshot: screenshot || undefined,\n    });\n  };\n\n  const inputStyles: React.CSSProperties = {\n    width: '100%',\n    padding: isTouch ? '12px 0' : '10px 0',\n    border: 'none',\n    borderBottom: `1px solid ${t.colors.inputBorder}`,\n    borderRadius: 0,\n    backgroundColor: 'transparent',\n    color: t.colors.text,\n    fontSize: isTouch ? t.typography.fontSize.lg : t.typography.fontSize.md,\n    resize: 'none',\n    minHeight: isTouch ? 96 : 80,\n    fontFamily: t.typography.fontFamily,\n    outline: 'none',\n    transition: `border-color ${t.animation.duration.fast} ${t.animation.easing.default}`,\n    lineHeight: 1.55,\n    ...customStyles?.input,\n  };\n\n  return (\n    <form onSubmit={handleSubmit}>\n      {/* Rating */}\n      {showRating && (\n        <div\n          style={{\n            marginBottom: showText ? (isTouch ? 18 : 16) : 0,\n            ...(!showText ? { display: 'flex', justifyContent: 'center', padding: '6px 0' } : {}),\n          }}\n        >\n          <StarRating value={rating} onChange={setRating} theme={t} isTouch={isTouch} large={!showText} />\n        </div>\n      )}\n\n      {/* Text input — hairline-only bottom border, transparent ground */}\n      {showText && (\n        <textarea\n          value={content}\n          onChange={(e) => setContent(e.target.value)}\n          placeholder={placeholder || 'Share your thoughts…'}\n          maxLength={5000}\n          style={inputStyles}\n          disabled={isLoading}\n          aria-label=\"Your feedback\"\n          onFocus={(e) => {\n            e.currentTarget.style.borderBottomColor = t.colors.inputBorderFocus;\n          }}\n          onBlur={(e) => {\n            e.currentTarget.style.borderBottomColor = t.colors.inputBorder;\n          }}\n        />\n      )}\n\n      {/* Bug flag toggle — editorial row with a checkbox indicator */}\n      {enableBugFlag && (\n        <button\n          type=\"button\"\n          role=\"switch\"\n          aria-checked={isBug}\n          onClick={() => setIsBug(!isBug)}\n          style={{\n            display: 'flex',\n            alignItems: 'center',\n            gap: 10,\n            width: '100%',\n            marginTop: 16,\n            padding: isTouch ? '12px 12px' : '10px 12px',\n            border: `1px solid ${isBug ? t.colors.warningBorder : t.colors.border}`,\n            borderRadius: t.borders.radius.sm,\n            backgroundColor: isBug ? t.colors.warningSurface : 'transparent',\n            cursor: 'pointer',\n            transition: `all ${t.animation.duration.fast} ${t.animation.easing.default}`,\n            fontFamily: t.typography.fontFamily,\n            ...customStyles?.bugFlag,\n          }}\n        >\n          {/* Checkbox indicator (left) — hairline square that fills sienna when active */}\n          <span\n            aria-hidden=\"true\"\n            style={{\n              width: 14,\n              height: 14,\n              borderRadius: 3,\n              border: `1px solid ${isBug ? t.colors.warningActive : t.colors.border}`,\n              backgroundColor: isBug ? t.colors.warning : 'transparent',\n              display: 'flex',\n              alignItems: 'center',\n              justifyContent: 'center',\n              flexShrink: 0,\n              transition: `all ${t.animation.duration.fast} ${t.animation.easing.default}`,\n            }}\n          >\n            {isBug && (\n              <svg width={8} height={8} viewBox=\"0 0 10 10\" fill=\"none\" aria-hidden=\"true\">\n                <path\n                  d=\"M2 5L4 7L8 3\"\n                  stroke={t.colors.primaryText}\n                  strokeWidth=\"1.75\"\n                  strokeLinecap=\"round\"\n                  strokeLinejoin=\"round\"\n                />\n              </svg>\n            )}\n          </span>\n\n          <span\n            style={{\n              fontSize: t.typography.fontSize.sm,\n              fontWeight: t.typography.fontWeight.normal,\n              color: isBug ? t.colors.text : t.colors.textSecondary,\n              letterSpacing: '0',\n              textAlign: 'left',\n              flex: 1,\n            }}\n          >\n            {isBug ? 'Reported as an issue' : (bugFlagLabel || 'Report an issue')}\n          </span>\n        </button>\n      )}\n\n      {/* Screenshot capture button — ghost with mono label */}\n      {enableBugFlag && enableScreenshot && isBug && !screenshot && (\n        <button\n          type=\"button\"\n          onClick={handleScreenshotCapture}\n          disabled={capturingScreenshot}\n          style={{\n            display: 'flex',\n            alignItems: 'center',\n            gap: 8,\n            width: '100%',\n            marginTop: 8,\n            padding: '9px 12px',\n            border: `1px solid ${t.colors.border}`,\n            borderRadius: t.borders.radius.sm,\n            backgroundColor: 'transparent',\n            cursor: capturingScreenshot ? 'progress' : 'pointer',\n            fontFamily: t.typography.fontFamily,\n            fontSize: t.typography.fontSize.xs,\n            letterSpacing: '0.06em',\n            textTransform: 'uppercase',\n            color: t.colors.textSecondary,\n            transition: `all ${t.animation.duration.fast} ${t.animation.easing.default}`,\n          }}\n          onMouseEnter={(e) => {\n            e.currentTarget.style.borderColor = t.colors.inputBorderFocus;\n            e.currentTarget.style.color = t.colors.text;\n          }}\n          onMouseLeave={(e) => {\n            e.currentTarget.style.borderColor = t.colors.border;\n            e.currentTarget.style.color = t.colors.textSecondary;\n          }}\n        >\n          <svg width={12} height={12} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={1.5} strokeLinecap=\"round\" strokeLinejoin=\"round\">\n            <rect x=\"2\" y=\"3\" width=\"20\" height=\"14\" rx=\"2\" />\n            <circle cx=\"12\" cy=\"10\" r=\"3\" />\n            <path d=\"M2 17l4-4 3 3 4-4 9 9\" />\n          </svg>\n          {capturingScreenshot ? 'Capturing…' : 'Attach screenshot'}\n        </button>\n      )}\n\n      {screenshotError && (\n        <div\n          role=\"alert\"\n          style={{\n            marginTop: 8,\n            padding: '6px 0 6px 10px',\n            borderLeft: `2px solid ${t.colors.error}`,\n            fontSize: t.typography.fontSize.xs,\n            color: t.colors.text,\n            fontFamily: t.typography.fontFamily,\n            display: 'flex',\n            alignItems: 'center',\n            gap: 10,\n            flexWrap: 'wrap',\n          }}\n        >\n          <span>Screenshot capture unavailable.</span>\n          <button\n            type=\"button\"\n            onClick={handleScreenshotCapture}\n            style={{\n              background: 'none',\n              border: 'none',\n              padding: 0,\n              color: t.colors.text,\n              fontFamily: t.typography.fontFamily,\n              fontSize: t.typography.fontSize.xs,\n              textDecoration: 'underline',\n              textDecorationColor: t.colors.border,\n              textUnderlineOffset: 3,\n              cursor: 'pointer',\n            }}\n          >\n            Try again\n          </button>\n        </div>\n      )}\n\n      {/* Screenshot preview */}\n      {enableBugFlag && enableScreenshot && isBug && screenshot && (\n        <ScreenshotPreview\n          src={screenshot}\n          onRemove={() => setScreenshot(null)}\n          resolvedTheme={t}\n        />\n      )}\n\n      {/* Submit — ink button, italic \"Sending…\" when loading, no spinner */}\n      <button\n        type=\"submit\"\n        disabled={isLoading || !canSubmit}\n        style={{\n          width: '100%',\n          padding: isTouch ? '14px 16px' : '11px 16px',\n          marginTop: 18,\n          border: 'none',\n          borderRadius: t.borders.radius.sm,\n          backgroundColor: !canSubmit\n            ? t.colors.buttonBackgroundDisabled\n            : t.colors.buttonBackground,\n          color: !canSubmit ? t.colors.buttonColorDisabled : t.colors.buttonColor,\n          fontSize: t.typography.fontSize.sm,\n          fontWeight: t.typography.fontWeight.medium,\n          fontFamily: t.typography.fontFamily,\n          cursor: isLoading || !canSubmit ? 'not-allowed' : 'pointer',\n          transition: `background-color ${t.animation.duration.fast} ${t.animation.easing.default}`,\n          fontStyle: isLoading ? 'italic' : 'normal',\n          ...customStyles?.submitButton,\n        }}\n        onMouseEnter={(e) => {\n          if (!e.currentTarget.disabled) {\n            e.currentTarget.style.backgroundColor = t.colors.buttonBackgroundHover;\n          }\n        }}\n        onMouseLeave={(e) => {\n          if (!e.currentTarget.disabled) {\n            e.currentTarget.style.backgroundColor = t.colors.buttonBackground;\n          }\n        }}\n      >\n        {isLoading\n          ? (isEditing ? 'Updating…' : 'Sending…')\n          : (isEditing ? 'Update' : submitText)}\n      </button>\n    </form>\n  );\n}\n\ninterface StarRatingProps {\n  value: number | null;\n  onChange: (rating: number) => void;\n  theme: ResolvedTheme;\n  isTouch: boolean;\n  large?: boolean;\n}\n\nfunction StarRating({ value, onChange, theme: t, isTouch, large = false }: StarRatingProps) {\n  const [hovered, setHovered] = useState<number | null>(null);\n  const starSize = large ? (isTouch ? 34 : 28) : (isTouch ? 26 : 20);\n  const gap = large ? (isTouch ? 8 : 8) : (isTouch ? 6 : 6);\n  const buttonPadding = large ? (isTouch ? 6 : 4) : (isTouch ? 6 : 2);\n\n  // Hover cascade: when the cursor lands on a star, fill light-to-right up\n  // to that position with a 30ms stagger so each star lights in sequence.\n  // When the cursor leaves, every star returns to resting state in\n  // parallel (no reverse cascade — felt wrong on unhover). Clicks commit\n  // immediately (value update) and the stagger no longer applies because\n  // hovered is still the cursor position.\n  const delayFor = (star: number): string =>\n    hovered !== null && hovered >= star ? `${(star - 1) * 30}ms` : '0ms';\n\n  return (\n    <div\n      style={{ display: 'flex', gap }}\n      role=\"group\"\n      aria-label=\"Rating\"\n      onMouseLeave={() => setHovered(null)}\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            aria-label={`Rate ${star} out of 5`}\n            aria-pressed={value === star}\n            style={{\n              background: 'none',\n              border: 'none',\n              cursor: 'pointer',\n              padding: buttonPadding,\n              color: isFilled ? t.colors.starFilled : t.colors.starEmpty,\n              transition: `color 180ms ${t.animation.easing.default}`,\n              transitionDelay: delayFor(star),\n              outline: 'none',\n              WebkitTapHighlightColor: 'transparent',\n            }}\n          >\n            <svg\n              width={starSize}\n              height={starSize}\n              viewBox=\"0 0 24 24\"\n              fill={isFilled ? 'currentColor' : 'none'}\n              stroke=\"currentColor\"\n              strokeWidth={isFilled ? 0 : 1.5}\n              strokeLinejoin=\"round\"\n            >\n              <path d=\"M12 3.5L14.472 8.506L20 9.308L16 13.205L16.944 18.706L12 16.107L7.056 18.706L8 13.205L4 9.308L9.528 8.506L12 3.5Z\" />\n            </svg>\n          </button>\n        );\n      })}\n    </div>\n  );\n}\n","import React, { useEffect, useState } from 'react';\nimport { ResolvedTheme } from '../../theme/tokens';\nimport { isTouchDevice } from '../../utils/device';\n\ninterface VoteModeProps {\n  resolvedTheme: ResolvedTheme;\n  isLoading: boolean;\n  onSubmit: (data: { vote: 'up' | 'down' }) => void;\n  initialVote?: 'up' | 'down' | null;\n  isEditing?: boolean;\n  labels?: { up: string; down: string };\n}\n\n/**\n * Vote mode — two editorial pills. Up/down semantics come from the icon\n * shape and the label, not from colour. Selected state fills the pill\n * with ink. Unselected is paper with a hairline border; hover darkens\n * the border to ink.\n *\n * Loading affordance: the active pill's label switches to italic\n * \"Sending…\". No translateY bounce, no spinner, no shimmer — the\n * editorial discipline is to stay still while waiting.\n *\n * Back-compat: reads vote* tokens (voteUp / voteUpSurface / voteUpBorder\n * and down equivalents) so customers who override them via `themeConfig`\n * still get their override. Default values in tokens.ts now resolve to\n * the same ink/rule pair, so the default aesthetic is uniform.\n */\nexport function VoteMode({\n  resolvedTheme: t,\n  isLoading,\n  onSubmit,\n  initialVote,\n  isEditing = false,\n  labels,\n}: VoteModeProps) {\n  const [isTouch, setIsTouch] = useState(false);\n  const [activeVote, setActiveVote] = useState<'up' | 'down' | null>(initialVote || null);\n  const [previousVote, setPreviousVote] = useState<'up' | 'down' | null>(initialVote || null);\n\n  useEffect(() => {\n    setIsTouch(isTouchDevice());\n  }, []);\n\n  useEffect(() => {\n    if (initialVote !== undefined) {\n      setPreviousVote(initialVote);\n      setActiveVote(initialVote);\n    }\n  }, [initialVote]);\n\n  useEffect(() => {\n    if (!isLoading && !isEditing) {\n      setActiveVote(null);\n    }\n  }, [isLoading, isEditing]);\n\n  const handleVote = (vote: 'up' | 'down') => {\n    setActiveVote(vote);\n    onSubmit({ vote });\n  };\n\n  const iconSize = isTouch ? 24 : 20;\n\n  const getButtonStyles = (voteType: 'up' | 'down'): React.CSSProperties => {\n    const isSelected = previousVote === voteType;\n    // Read through the vote-specific tokens so customer overrides survive.\n    const accent = voteType === 'up' ? t.colors.voteUp : t.colors.voteDown;\n    const surface = voteType === 'up' ? t.colors.voteUpSurface : t.colors.voteDownSurface;\n    const border = voteType === 'up' ? t.colors.voteUpBorder : t.colors.voteDownBorder;\n    return {\n      flex: 1,\n      minWidth: 0,\n      padding: isTouch ? '14px 18px' : '11px 16px',\n      border: `1px solid ${isSelected ? accent : border}`,\n      borderRadius: t.borders.radius.full,\n      background: isSelected ? accent : surface,\n      color: isSelected ? t.colors.primaryText : t.colors.text,\n      fontSize: isTouch ? 15 : 13,\n      fontWeight: t.typography.fontWeight.medium,\n      fontFamily: t.typography.fontFamily,\n      cursor: isLoading ? 'not-allowed' : 'pointer',\n      transition: `background-color ${t.animation.duration.fast} ${t.animation.easing.default}, border-color ${t.animation.duration.fast} ${t.animation.easing.default}, color ${t.animation.duration.fast} ${t.animation.easing.default}`,\n      display: 'flex',\n      alignItems: 'center',\n      justifyContent: 'center',\n      gap: isTouch ? 10 : 8,\n      outline: 'none',\n    };\n  };\n\n  const buildLabel = (voteType: 'up' | 'down', isSelected: boolean): string => {\n    if (labels?.[voteType]) return labels[voteType];\n    if (voteType === 'up') return isSelected ? 'Liked' : 'Like';\n    return isSelected ? 'Disliked' : 'Dislike';\n  };\n\n  return (\n    <div\n      style={{ display: 'flex', gap: isTouch ? 12 : 10 }}\n      role=\"group\"\n      aria-label=\"Vote\"\n    >\n      {(['up', 'down'] as const).map((voteType) => {\n        const isSelected = previousVote === voteType;\n        const isActiveLoading = isLoading && activeVote === voteType;\n        const label = buildLabel(voteType, isSelected);\n        // aria-label matches the visible label so screen-reader users hear\n        // \"Like / Liked\" rather than a longer expanded description that\n        // drifts from sighted UX.\n        const ariaLabel = isActiveLoading\n          ? `${label}, submitting`\n          : label;\n        const inactiveBorder =\n          voteType === 'up' ? t.colors.voteUpBorder : t.colors.voteDownBorder;\n        return (\n          <button\n            key={voteType}\n            type=\"button\"\n            onClick={() => handleVote(voteType)}\n            disabled={isLoading}\n            style={getButtonStyles(voteType)}\n            aria-label={ariaLabel}\n            aria-pressed={isSelected}\n            onMouseEnter={(e) => {\n              if (isLoading || isSelected) return;\n              e.currentTarget.style.borderColor = t.colors.inputBorderFocus;\n            }}\n            onMouseLeave={(e) => {\n              if (isSelected) return;\n              e.currentTarget.style.borderColor = inactiveBorder;\n            }}\n          >\n            {voteType === 'up' ? <ThumbsUpIcon size={iconSize} /> : <ThumbsDownIcon size={iconSize} />}\n            <span style={{ fontStyle: isActiveLoading ? 'italic' : 'normal' }}>\n              {isActiveLoading\n                ? (isEditing ? 'Updating…' : 'Sending…')\n                : label}\n            </span>\n          </button>\n        );\n      })}\n    </div>\n  );\n}\n\nfunction ThumbsUpIcon({ size = 20 }: { 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 = 20 }: { size?: number }) {\n  return (\n    <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.75\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n      <path d=\"M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17\" />\n    </svg>\n  );\n}\n","import React, { useState, useEffect } from 'react';\nimport { ResolvedTheme } from '../../theme/tokens';\nimport { isTouchDevice } from '../../utils/device';\n\ninterface PollModeProps {\n  resolvedTheme: ResolvedTheme;\n  options: string[];\n  allowMultiple: boolean;\n  isLoading: boolean;\n  onSubmit: (data: { pollSelected: string[] }) => void;\n  initialSelected?: string[] | null;\n  isEditing?: boolean;\n}\n\n/**\n * Poll mode — newspaper-column list.\n *\n * Layout: flat list of option rows separated by hairline rules (no outer\n * border, no individual card chrome). Selected rows get a 2px sienna\n * left-edge — the single brand moment in this mode, replacing the old\n * full-tint selected background. Check indicator on the right: hairline\n * square for multi-select, hairline circle for single-select.\n *\n * Hover: background darkens to paper-hover tone. No translateX nudge —\n * the rows are columns of text, not buttons that animate laterally.\n */\nexport function PollMode({\n  resolvedTheme: t,\n  options,\n  allowMultiple,\n  isLoading,\n  onSubmit,\n  initialSelected,\n  isEditing = false,\n}: PollModeProps) {\n  const [selected, setSelected] = useState<string[]>(initialSelected || []);\n  const [isTouch, setIsTouch] = useState(false);\n  const [hoverIdx, setHoverIdx] = useState<number | null>(null);\n\n  useEffect(() => {\n    setIsTouch(isTouchDevice());\n  }, []);\n\n  useEffect(() => {\n    if (initialSelected) setSelected(initialSelected);\n  }, [initialSelected]);\n\n  const handleToggle = (option: string) => {\n    if (isLoading) return;\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 || isLoading) return;\n    onSubmit({ pollSelected: selected });\n  };\n\n  const rowPadding = isTouch ? '14px 14px' : '12px 14px';\n\n  return (\n    <div>\n      <ul\n        role=\"group\"\n        aria-label={allowMultiple ? 'Select one or more options' : 'Select an option'}\n        style={{\n          listStyle: 'none',\n          margin: 0,\n          padding: 0,\n          borderTop: `1px solid ${t.colors.border}`,\n        }}\n      >\n        {options.map((option, index) => {\n          const isSelected = selected.includes(option);\n          const isHovered = hoverIdx === index;\n          return (\n            <li\n              key={option}\n              style={{\n                borderBottom: `1px solid ${t.colors.border}`,\n                position: 'relative',\n                animation: `gotcha-fade-up ${t.animation.duration.normal} ${t.animation.easing.default} both`,\n                animationDelay: `${index * 0.04}s`,\n              }}\n            >\n              {/* 2px sienna left-edge on selected — the brand moment.\n                  Inset 8px top/bottom so the mark reads as a true pulled\n                  margin rule (newspaper-column convention), not a\n                  bar-button edge butting against the hairline rows. */}\n              {isSelected && (\n                <span\n                  aria-hidden=\"true\"\n                  style={{\n                    position: 'absolute',\n                    left: 0,\n                    top: 8,\n                    bottom: 8,\n                    width: 2,\n                    backgroundColor: t.colors.pollSelectedBorder,\n                  }}\n                />\n              )}\n              <button\n                type=\"button\"\n                onClick={() => handleToggle(option)}\n                onMouseEnter={() => setHoverIdx(index)}\n                onMouseLeave={() => setHoverIdx(null)}\n                disabled={isLoading}\n                aria-pressed={isSelected}\n                style={{\n                  display: 'flex',\n                  alignItems: 'center',\n                  gap: 12,\n                  width: '100%',\n                  padding: rowPadding,\n                  paddingLeft: isSelected\n                    ? (isTouch ? 16 : 16)\n                    : (isTouch ? 14 : 14),\n                  border: 'none',\n                  background: isHovered && !isSelected ? t.colors.surfaceHover : 'transparent',\n                  color: t.colors.text,\n                  fontSize: isTouch ? 15 : t.typography.fontSize.md,\n                  fontWeight: isSelected\n                    ? t.typography.fontWeight.medium\n                    : t.typography.fontWeight.normal,\n                  fontFamily: t.typography.fontFamily,\n                  cursor: isLoading ? 'not-allowed' : 'pointer',\n                  transition: `background-color ${t.animation.duration.fast} ${t.animation.easing.default}`,\n                  textAlign: 'left',\n                  letterSpacing: '0',\n                  outline: 'none',\n                }}\n              >\n                <span style={{ flex: 1 }}>{option}</span>\n\n                {/* Indicator on the right — square for multi, circle for single */}\n                <span\n                  aria-hidden=\"true\"\n                  style={{\n                    width: 14,\n                    height: 14,\n                    borderRadius: allowMultiple ? 3 : '50%',\n                    border: `1px solid ${isSelected ? t.colors.pollCheckSelectedBorder : t.colors.pollCheckBorder}`,\n                    backgroundColor: isSelected ? t.colors.pollCheckSelectedBg : 'transparent',\n                    display: 'flex',\n                    alignItems: 'center',\n                    justifyContent: 'center',\n                    flexShrink: 0,\n                    transition: `all ${t.animation.duration.fast} ${t.animation.easing.default}`,\n                  }}\n                >\n                  {isSelected && (\n                    <svg width={8} height={8} viewBox=\"0 0 10 10\" fill=\"none\">\n                      <path\n                        d=\"M2 5L4 7L8 3\"\n                        stroke={t.colors.primaryText}\n                        strokeWidth=\"1.5\"\n                        strokeLinecap=\"round\"\n                        strokeLinejoin=\"round\"\n                      />\n                    </svg>\n                  )}\n                </span>\n              </button>\n            </li>\n          );\n        })}\n      </ul>\n\n      {/* Submit */}\n      <button\n        type=\"button\"\n        onClick={handleSubmit}\n        disabled={isLoading || selected.length === 0}\n        style={{\n          width: '100%',\n          marginTop: 18,\n          padding: isTouch ? '14px 16px' : '11px 16px',\n          border: 'none',\n          borderRadius: t.borders.radius.sm,\n          backgroundColor:\n            selected.length === 0\n              ? t.colors.buttonBackgroundDisabled\n              : t.colors.buttonBackground,\n          color:\n            selected.length === 0\n              ? t.colors.buttonColorDisabled\n              : t.colors.buttonColor,\n          fontSize: t.typography.fontSize.sm,\n          fontWeight: t.typography.fontWeight.medium,\n          fontFamily: t.typography.fontFamily,\n          cursor: isLoading || selected.length === 0 ? 'not-allowed' : 'pointer',\n          transition: `background-color ${t.animation.duration.fast} ${t.animation.easing.default}`,\n          fontStyle: isLoading ? 'italic' : 'normal',\n        }}\n        onMouseEnter={(e) => {\n          if (!e.currentTarget.disabled) {\n            e.currentTarget.style.backgroundColor = t.colors.buttonBackgroundHover;\n          }\n        }}\n        onMouseLeave={(e) => {\n          if (!e.currentTarget.disabled) {\n            e.currentTarget.style.backgroundColor = t.colors.buttonBackground;\n          }\n        }}\n      >\n        {isLoading\n          ? (isEditing ? 'Updating…' : 'Sending…')\n          : (isEditing ? 'Update' : 'Submit')}\n      </button>\n    </div>\n  );\n}\n","import React from 'react';\n\ninterface SpinnerProps {\n  size?: number;\n  color?: string;\n}\n\n/**\n * Editorial spinner — a hairline arc rotating over a faint full circle.\n * Only used in the \"checking for existing response\" path on the modal;\n * submit buttons switched to italic \"Sending…\" text instead. Minimal,\n * quiet, matches the one-px-hairline discipline of the rest of the\n * widget.\n */\nexport function Spinner({ size = 16, color = 'currentColor' }: SpinnerProps) {\n  const radius = 9;\n  const circumference = 2 * Math.PI * radius;\n  // Show a ~25% arc (90 degrees).\n  const arc = circumference * 0.25;\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      role=\"img\"\n      aria-label=\"Loading\"\n      style={{\n        animation: 'gotcha-spin 1.1s linear infinite',\n        transformOrigin: 'center',\n      }}\n    >\n      <circle\n        cx=\"12\"\n        cy=\"12\"\n        r={radius}\n        stroke={color}\n        strokeOpacity=\"0.18\"\n        strokeWidth=\"1.25\"\n        fill=\"none\"\n      />\n      <circle\n        cx=\"12\"\n        cy=\"12\"\n        r={radius}\n        stroke={color}\n        strokeWidth=\"1.25\"\n        strokeLinecap=\"round\"\n        fill=\"none\"\n        strokeDasharray={`${arc} ${circumference}`}\n        strokeDashoffset=\"0\"\n      />\n    </svg>\n  );\n}\n","import React, { useState, useEffect } from 'react';\nimport { GotchaStyles } from '../../types';\nimport { ResolvedTheme } from '../../theme/tokens';\nimport { isTouchDevice } from '../../utils/device';\n\ninterface NpsModeProps {\n  resolvedTheme: ResolvedTheme;\n  submitText: string;\n  isLoading: boolean;\n  onSubmit: (data: { rating?: number; content?: string }) => void;\n  customStyles?: GotchaStyles;\n  showFollowUp?: boolean;\n  followUpPlaceholder?: string;\n  lowLabel?: string;\n  highLabel?: string;\n  initialValues?: {\n    rating?: number | null;\n    content?: string | null;\n  };\n  isEditing?: boolean;\n}\n\n/**\n * NPS mode — eleven uniform mono-labelled ink squares (0–10).\n *\n * The old version used a rainbow (red→green) scale that pre-decided the\n * valence of each number. Editorial discipline: every score is visually\n * equal at rest. Hover darkens the border; selected state fills the\n * square ink with paper text. The follow-up textarea reveals beneath\n * with a 240ms page-turn.\n *\n * Labels beneath the scale are small-caps mono — \"NOT LIKELY\" / \"VERY\n * LIKELY\" — matching the modal header label treatment.\n */\nexport function NpsMode({\n  resolvedTheme: t,\n  submitText,\n  isLoading,\n  onSubmit,\n  customStyles,\n  showFollowUp = true,\n  followUpPlaceholder,\n  lowLabel = 'Not likely',\n  highLabel = 'Very likely',\n  initialValues,\n  isEditing = false,\n}: NpsModeProps) {\n  const [score, setScore] = useState<number | null>(initialValues?.rating ?? null);\n  const [content, setContent] = useState(initialValues?.content || '');\n  const [isTouch, setIsTouch] = useState(false);\n  const [hoveredScore, setHoveredScore] = useState<number | null>(null);\n\n  useEffect(() => {\n    setIsTouch(isTouchDevice());\n  }, []);\n\n  useEffect(() => {\n    if (initialValues?.rating !== undefined) setScore(initialValues.rating ?? null);\n    if (initialValues?.content !== undefined) setContent(initialValues.content || '');\n  }, [initialValues?.rating, initialValues?.content]);\n\n  const canSubmit = score !== null;\n\n  const handleSubmit = (e: React.FormEvent) => {\n    e.preventDefault();\n    if (!canSubmit || isLoading) 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 — 11 uniform squares. aspectRatio: 1 enforces\n          square cells regardless of container width, killing the\n          flex:1 drift that made cells slightly horizontal at 360px\n          modal width. */}\n      <div\n        style={{\n          position: 'relative',\n          display: 'flex',\n          gap: isTouch ? 4 : 5,\n          justifyContent: 'center',\n        }}\n        role=\"group\"\n        aria-label=\"NPS Score\"\n        onMouseLeave={() => setHoveredScore(null)}\n      >\n        {Array.from({ length: 11 }, (_, i) => {\n          const selected = score === i;\n          const hovered = hoveredScore === i;\n\n          return (\n            <button\n              key={i}\n              type=\"button\"\n              onClick={() => setScore(i)}\n              onMouseEnter={() => setHoveredScore(i)}\n              aria-label={`Score ${i} out of 10`}\n              aria-pressed={selected}\n              style={{\n                flex: 1,\n                minWidth: 0,\n                aspectRatio: '1',\n                borderRadius: t.borders.radius.sm,\n                border: `1px solid ${\n                  selected\n                    ? t.colors.buttonBackground\n                    : hovered\n                      ? t.colors.inputBorderFocus\n                      : t.colors.border\n                }`,\n                backgroundColor: selected\n                  ? t.colors.buttonBackground\n                  : 'transparent',\n                color: selected ? t.colors.buttonColor : t.colors.text,\n                fontSize: 15,\n                fontWeight: selected\n                  ? t.typography.fontWeight.medium\n                  : t.typography.fontWeight.normal,\n                // Tabular numerals so the column widths stay uniform as the\n                // selection moves across the scale.\n                fontFamily:\n                  \"ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, 'Liberation Mono', monospace\",\n                fontVariantNumeric: 'tabular-nums',\n                cursor: 'pointer',\n                padding: 0,\n                display: 'flex',\n                alignItems: 'center',\n                justifyContent: 'center',\n                transition: `background-color ${t.animation.duration.fast} ${t.animation.easing.default}, border-color ${t.animation.duration.fast} ${t.animation.easing.default}, color ${t.animation.duration.fast} ${t.animation.easing.default}`,\n                outline: 'none',\n                ...customStyles?.npsButton,\n                ...(selected ? customStyles?.npsButtonSelected : {}),\n              }}\n            >\n              {i}\n            </button>\n          );\n        })}\n      </div>\n\n      {/* Labels — small-caps mono, matches modal header eyebrow. Color\n          raised from textSecondary to text so the 11px labels hold\n          contrast at small optical size (WCAG AA). The valence cue\n          (which end is good/bad) is the label copy itself, not a\n          rainbow gradient. */}\n      <div\n        style={{\n          display: 'flex',\n          justifyContent: 'space-between',\n          alignItems: 'center',\n          marginTop: 12,\n          padding: '0 2px',\n          ...customStyles?.npsLabels,\n        }}\n      >\n        {[lowLabel, highLabel].map((label) => (\n          <span\n            key={label}\n            style={{\n              fontFamily: t.typography.fontFamily,\n              fontSize: 11,\n              color: t.colors.text,\n              fontWeight: t.typography.fontWeight.medium,\n              letterSpacing: '0.14em',\n              textTransform: 'uppercase',\n            }}\n          >\n            {label}\n          </span>\n        ))}\n      </div>\n\n      {/* Follow-up textarea — reveals when a score is chosen */}\n      {showFollowUp && score !== null && (\n        <textarea\n          value={content}\n          onChange={(e) => setContent(e.target.value)}\n          placeholder={followUpPlaceholder || \"What's the main reason for your score?\"}\n          maxLength={5000}\n          style={{\n            width: '100%',\n            padding: isTouch ? '12px 0' : '10px 0',\n            marginTop: 18,\n            border: 'none',\n            borderBottom: `1px solid ${t.colors.inputBorder}`,\n            borderRadius: 0,\n            backgroundColor: 'transparent',\n            color: t.colors.text,\n            fontSize: isTouch ? t.typography.fontSize.lg : t.typography.fontSize.md,\n            resize: 'none',\n            minHeight: isTouch ? 72 : 56,\n            fontFamily: t.typography.fontFamily,\n            outline: 'none',\n            transition: `border-color ${t.animation.duration.fast} ${t.animation.easing.default}`,\n            lineHeight: 1.55,\n            animation: `gotcha-expand-in ${t.animation.duration.normal} ${t.animation.easing.default} both`,\n            overflow: 'hidden',\n            ...customStyles?.input,\n          }}\n          disabled={isLoading}\n          aria-label=\"Follow-up feedback\"\n          onFocus={(e) => {\n            e.currentTarget.style.borderBottomColor = t.colors.inputBorderFocus;\n          }}\n          onBlur={(e) => {\n            e.currentTarget.style.borderBottomColor = t.colors.inputBorder;\n          }}\n        />\n      )}\n\n      {/* Submit */}\n      <button\n        type=\"submit\"\n        disabled={isLoading || !canSubmit}\n        style={{\n          width: '100%',\n          marginTop: 18,\n          padding: isTouch ? '14px 16px' : '11px 16px',\n          border: 'none',\n          borderRadius: t.borders.radius.sm,\n          backgroundColor: !canSubmit\n            ? t.colors.buttonBackgroundDisabled\n            : t.colors.buttonBackground,\n          color: !canSubmit ? t.colors.buttonColorDisabled : t.colors.buttonColor,\n          fontSize: t.typography.fontSize.sm,\n          fontWeight: t.typography.fontWeight.medium,\n          fontFamily: t.typography.fontFamily,\n          cursor: isLoading || !canSubmit ? 'not-allowed' : 'pointer',\n          transition: `background-color ${t.animation.duration.fast} ${t.animation.easing.default}`,\n          fontStyle: isLoading ? 'italic' : 'normal',\n          ...customStyles?.submitButton,\n        }}\n        onMouseEnter={(e) => {\n          if (!e.currentTarget.disabled) {\n            e.currentTarget.style.backgroundColor = t.colors.buttonBackgroundHover;\n          }\n        }}\n        onMouseLeave={(e) => {\n          if (!e.currentTarget.disabled) {\n            e.currentTarget.style.backgroundColor = t.colors.buttonBackground;\n          }\n        }}\n      >\n        {isLoading\n          ? (isEditing ? 'Updating…' : 'Sending…')\n          : (isEditing ? 'Update' : submitText)}\n      </button>\n    </form>\n  );\n}\n","import React, { useState, useEffect } from 'react';\nimport { ResolvedTheme } from '../theme/tokens';\nimport { isTouchDevice } from '../utils/device';\n\ninterface FollowUpPromptProps {\n  resolvedTheme: ResolvedTheme;\n  promptText: string;\n  placeholder?: string;\n  isLoading: boolean;\n  onSubmit: (content: string) => void;\n}\n\n/**\n * Follow-up prompt — the deeper question after a low rating or negative\n * vote. Serif italic prompt sets the tone as conversational; the input\n * matches the editorial textarea pattern (transparent, hairline bottom).\n */\nexport function FollowUpPrompt({\n  resolvedTheme: t,\n  promptText,\n  placeholder,\n  isLoading,\n  onSubmit,\n}: FollowUpPromptProps) {\n  const [content, setContent] = useState('');\n  const [isTouch, setIsTouch] = useState(false);\n\n  useEffect(() => {\n    setIsTouch(isTouchDevice());\n  }, []);\n\n  const handleSubmit = (e: React.FormEvent) => {\n    e.preventDefault();\n    if (!content.trim() || isLoading) return;\n    onSubmit(content.trim());\n  };\n\n  return (\n    <form onSubmit={handleSubmit}>\n      <p\n        style={{\n          margin: '0 0 14px 0',\n          fontFamily: t.typography.fontFamilyDisplay,\n          fontSize: isTouch ? 17 : 16,\n          fontStyle: 'italic',\n          color: t.colors.text,\n          lineHeight: 1.45,\n          letterSpacing: '-0.01em',\n        }}\n      >\n        {promptText}\n      </p>\n\n      <textarea\n        value={content}\n        onChange={(e) => setContent(e.target.value)}\n        placeholder={placeholder || 'Tell us more…'}\n        maxLength={5000}\n        disabled={isLoading}\n        aria-label=\"Follow-up feedback\"\n        style={{\n          width: '100%',\n          padding: isTouch ? '12px 0' : '10px 0',\n          border: 'none',\n          borderBottom: `1px solid ${t.colors.inputBorder}`,\n          borderRadius: 0,\n          backgroundColor: 'transparent',\n          color: t.colors.text,\n          fontSize: isTouch ? t.typography.fontSize.lg : t.typography.fontSize.md,\n          resize: 'none',\n          minHeight: isTouch ? 96 : 72,\n          fontFamily: t.typography.fontFamily,\n          outline: 'none',\n          transition: `border-color ${t.animation.duration.fast} ${t.animation.easing.default}`,\n          lineHeight: 1.55,\n        }}\n        onFocus={(e) => {\n          e.currentTarget.style.borderBottomColor = t.colors.inputBorderFocus;\n        }}\n        onBlur={(e) => {\n          e.currentTarget.style.borderBottomColor = t.colors.inputBorder;\n        }}\n      />\n\n      <button\n        type=\"submit\"\n        disabled={isLoading || !content.trim()}\n        style={{\n          width: '100%',\n          marginTop: 16,\n          padding: isTouch ? '14px 16px' : '11px 16px',\n          border: 'none',\n          borderRadius: t.borders.radius.sm,\n          backgroundColor: !content.trim()\n            ? t.colors.buttonBackgroundDisabled\n            : t.colors.buttonBackground,\n          color: !content.trim() ? t.colors.buttonColorDisabled : t.colors.buttonColor,\n          fontSize: t.typography.fontSize.sm,\n          fontWeight: t.typography.fontWeight.medium,\n          fontFamily: t.typography.fontFamily,\n          cursor: isLoading || !content.trim() ? 'not-allowed' : 'pointer',\n          transition: `background-color ${t.animation.duration.fast} ${t.animation.easing.default}`,\n          fontStyle: isLoading ? 'italic' : 'normal',\n        }}\n        onMouseEnter={(e) => {\n          if (!e.currentTarget.disabled) {\n            e.currentTarget.style.backgroundColor = t.colors.buttonBackgroundHover;\n          }\n        }}\n        onMouseLeave={(e) => {\n          if (!e.currentTarget.disabled) {\n            e.currentTarget.style.backgroundColor = t.colors.buttonBackground;\n          }\n        }}\n      >\n        {isLoading ? 'Sending…' : 'Submit'}\n      </button>\n    </form>\n  );\n}\n","import React, { useRef, useEffect, useState, useMemo } from \"react\";\nimport { Theme, GotchaStyles, ResponseMode, ExistingResponse } from \"../types\";\nimport { ResolvedTheme } from \"../theme/tokens\";\nimport { resolveTheme } from \"../theme/resolveTheme\";\nimport { injectStyles } from \"../theme/styles\";\nimport { cn } from \"../utils/cn\";\nimport { useGotchaContext } from \"./GotchaProvider\";\nimport { FeedbackMode } from \"./modes/FeedbackMode\";\nimport { VoteMode } from \"./modes/VoteMode\";\nimport { PollMode } from \"./modes/PollMode\";\nimport { Spinner } from \"./Spinner\";\nimport { NpsMode } from \"./modes/NpsMode\";\nimport { FollowUpPrompt } from \"./FollowUpPrompt\";\n\nexport interface GotchaModalProps {\n  mode: ResponseMode;\n  theme: Theme;\n  customStyles?: GotchaStyles;\n  promptText?: string;\n  placeholder?: string;\n  submitText: string;\n  thankYouMessage: string;\n  // State\n  isLoading: boolean;\n  isCheckingExisting?: boolean;\n  isSubmitted: boolean;\n  phase?: \"form\" | \"followUp\" | \"success\";\n  followUpConfig?: { promptText: string; placeholder?: string };\n  followUpLoading?: boolean;\n  onFollowUpSubmit?: (content: string) => void;\n  error: string | null;\n  // Edit mode\n  existingResponse?: ExistingResponse | null;\n  isEditing?: boolean;\n  // Vote mode\n  voteLabels?: { up: string; down: string };\n  // Feedback mode field visibility\n  showText?: boolean;\n  showRating?: boolean;\n  // Poll mode\n  options?: string[];\n  allowMultiple?: boolean;\n  // NPS mode\n  npsQuestion?: string;\n  npsFollowUp?: boolean;\n  npsFollowUpPlaceholder?: string;\n  npsLowLabel?: string;\n  npsHighLabel?: string;\n  // Bug flagging\n  enableBugFlag?: boolean;\n  bugFlagLabel?: string;\n  enableScreenshot?: boolean;\n  // Handlers\n  onSubmit: (data: {\n    content?: string;\n    rating?: number;\n    vote?: \"up\" | \"down\";\n    pollSelected?: string[];\n    isBug?: boolean;\n    screenshot?: string;\n  }) => void;\n  onClose: () => void;\n  // Position info from parent\n  anchorRect?: DOMRect;\n  /**\n   * When true (desktop portal), use fixed positioning relative to the viewport\n   * instead of absolute positioning relative to the container.\n   */\n  useFixedPosition?: boolean;\n  /**\n   * Viewport-width state hoisted from the parent so there's a single\n   * source of truth across the portal boundary. Without this, the parent\n   * and the modal each ran their own matchMedia listeners and could\n   * temporarily disagree across React ticks — visible as one-frame flicker\n   * during breakpoint crossings.\n   */\n  isMobile?: boolean;\n}\n\n// ── Mode label (small-caps above the H1) ─────────────────────\n//\n// Matches the dashboard's mono-uppercase eyebrow pattern. The label tells\n// the user at a glance what kind of response the modal expects — without\n// decoration, without colour. It's the editorial \"section name\" above the\n// headline.\nconst MODE_LABEL: Record<ResponseMode, string> = {\n  feedback: \"Feedback\",\n  vote: \"Vote\",\n  poll: \"Poll\",\n  nps: \"Rate\",\n};\n\n// ── Default prompts ──────────────────────────────────────────\nfunction getDefaultPrompt(mode: ResponseMode, npsQuestion?: string): string {\n  switch (mode) {\n    case \"vote\":\n      return \"What do you think?\";\n    case \"poll\":\n      return \"Cast your vote.\";\n    case \"nps\":\n      return npsQuestion || \"How likely are you to recommend us?\";\n    case \"feedback\":\n    default:\n      return \"What do you think of this feature?\";\n  }\n}\n\n// Autoclose timeout in ms — must match the value in Gotcha.tsx so the\n// progress rule finishes just as the modal dismisses. 4s gives the\n// reading tempo room: the user can take in the \"Gotcha!\" + subline\n// before the modal slides away.\nconst AUTOCLOSE_MS = 4000;\n\nexport function GotchaModal({\n  mode,\n  theme,\n  customStyles,\n  promptText,\n  placeholder,\n  submitText,\n  thankYouMessage,\n  isLoading,\n  isCheckingExisting = false,\n  isSubmitted,\n  phase = \"form\",\n  followUpConfig,\n  followUpLoading = false,\n  onFollowUpSubmit,\n  error,\n  existingResponse,\n  isEditing = false,\n  showText = true,\n  showRating = true,\n  voteLabels,\n  options,\n  allowMultiple = false,\n  npsQuestion,\n  npsFollowUp = true,\n  npsFollowUpPlaceholder,\n  npsLowLabel,\n  npsHighLabel,\n  enableBugFlag = false,\n  bugFlagLabel,\n  enableScreenshot = false,\n  onSubmit,\n  onClose,\n  anchorRect,\n  useFixedPosition = false,\n  isMobile: isMobileProp,\n}: GotchaModalProps) {\n  const modalRef = useRef<HTMLDivElement>(null);\n  const firstFocusableRef = useRef<HTMLButtonElement>(null);\n  const onCloseRef = useRef(onClose);\n  onCloseRef.current = onClose;\n\n  // Read viewport width from the prop when provided (single source of\n  // truth — Gotcha.tsx owns the live matchMedia listener). Fall back to\n  // internal state only if the modal is rendered without the prop (legacy\n  // or direct instantiation path).\n  const [internalIsMobile, setInternalIsMobile] = useState(false);\n  const isMobile = isMobileProp ?? internalIsMobile;\n  const [systemTheme, setSystemTheme] = useState<\"light\" | \"dark\">(\"light\");\n\n  const { themeConfig } = useGotchaContext();\n\n  // Colour-scheme tracking only. Mobile state comes from the parent via\n  // the `isMobile` prop (single source of truth across the portal\n  // boundary). If the prop isn't provided, we fall back to an internal\n  // matchMedia listener so the modal still self-adapts when rendered\n  // standalone.\n  useEffect(() => {\n    if (typeof window === \"undefined\") return;\n\n    const darkQuery = window.matchMedia(\"(prefers-color-scheme: dark)\");\n    const syncTheme = (e: MediaQueryListEvent | MediaQueryList) =>\n      setSystemTheme(e.matches ? \"dark\" : \"light\");\n    syncTheme(darkQuery);\n    const darkHandler = (e: MediaQueryListEvent) => syncTheme(e);\n    darkQuery.addEventListener(\"change\", darkHandler);\n\n    const listeners: Array<() => void> = [\n      () => darkQuery.removeEventListener(\"change\", darkHandler),\n    ];\n\n    if (isMobileProp === undefined) {\n      const mobileQuery = window.matchMedia(\"(max-width: 1023px)\");\n      const syncMobile = () => setInternalIsMobile(mobileQuery.matches);\n      syncMobile();\n      mobileQuery.addEventListener(\"change\", syncMobile);\n      listeners.push(() =>\n        mobileQuery.removeEventListener(\"change\", syncMobile),\n      );\n    }\n\n    return () => {\n      for (const off of listeners) off();\n    };\n  }, [isMobileProp]);\n\n  // Resolve theme with provider config\n  const t: ResolvedTheme = useMemo(\n    () => resolveTheme(theme, systemTheme, themeConfig),\n    [theme, systemTheme, themeConfig],\n  );\n\n  // Re-inject styles when theme changes\n  useEffect(() => {\n    injectStyles(t);\n  }, [t]);\n\n  // Determine if modal should appear above or below the anchor.\n  const showAbove = (() => {\n    if (typeof window === \"undefined\" || !anchorRect) return false;\n    const spaceBelow = window.innerHeight - anchorRect.bottom;\n    return spaceBelow < 340;\n  })();\n\n  // Focus trap — use ref for onClose so effect runs once\n  useEffect(() => {\n    const modal = modalRef.current;\n    if (!modal) return;\n\n    firstFocusableRef.current?.focus();\n\n    const handleKeyDown = (e: KeyboardEvent) => {\n      if (e.key === \"Escape\") {\n        onCloseRef.current();\n        return;\n      }\n\n      if (e.key === \"Tab\") {\n        const focusableElements = modal.querySelectorAll<HTMLElement>(\n          'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])',\n        );\n        const firstElement = focusableElements[0];\n        const lastElement = focusableElements[focusableElements.length - 1];\n\n        if (e.shiftKey && document.activeElement === firstElement) {\n          e.preventDefault();\n          lastElement?.focus();\n        } else if (!e.shiftKey && document.activeElement === lastElement) {\n          e.preventDefault();\n          firstElement?.focus();\n        }\n      }\n    };\n\n    document.addEventListener(\"keydown\", handleKeyDown);\n    return () => document.removeEventListener(\"keydown\", handleKeyDown);\n  }, []);\n\n  const prompt = promptText || getDefaultPrompt(mode, npsQuestion);\n  const modeLabel = MODE_LABEL[mode];\n\n  // Slightly wider on NPS because the 0–10 scale needs elbow room; poll\n  // wants room for 4-word options. Feedback/vote stay tight.\n  const modalPadding = isMobile ? 24 : 28;\n  const modalWidth = mode === \"nps\" ? 420 : mode === \"poll\" ? 400 : 360;\n\n  // Animation class\n  const animationClass = isMobile\n    ? \"gotcha-modal-enter-center\"\n    : showAbove\n      ? \"gotcha-modal-enter-above\"\n      : \"gotcha-modal-enter\";\n\n  const viewportHeight = typeof window !== \"undefined\" ? window.innerHeight : 0;\n\n  // Modal container styles. Editorial card: flat paper, hairline border,\n  // soft layered shadow, no gradient, no backdrop blur. The container is\n  // a composed object on a page, not a glass panel floating above one.\n  const baseContainer: React.CSSProperties = {\n    padding: 0, // padding now lives per-section so we can hairline-rule the header\n    borderRadius: t.borders.radius.lg,\n    background: t.colors.background,\n    color: t.colors.text,\n    boxShadow: t.shadows.modal,\n    border: `${t.borders.width}px solid ${t.colors.border}`,\n    fontFamily: t.typography.fontFamily,\n    textAlign: \"left\" as const,\n    overflow: \"hidden\", // so the success-autoclose progress rule clips cleanly\n  };\n\n  const modalStyles: React.CSSProperties = isMobile\n    ? {\n        ...baseContainer,\n        position: \"fixed\",\n        left: \"50%\",\n        top: \"50%\",\n        transform: \"translate(-50%, -50%)\",\n        width: \"calc(100vw - 32px)\",\n        maxWidth: modalWidth,\n        zIndex: 9999,\n        ...customStyles?.modal,\n      }\n    : useFixedPosition && anchorRect && viewportHeight\n      ? (() => {\n          const viewportWidth = window.innerWidth;\n          const edgePadding = 24;\n          const centerX = anchorRect.left + anchorRect.width / 2;\n          const idealLeft = centerX - modalWidth / 2;\n          const clampedLeft = Math.max(\n            edgePadding,\n            Math.min(idealLeft, viewportWidth - modalWidth - edgePadding),\n          );\n          return {\n            ...baseContainer,\n            position: \"fixed\" as const,\n            left: clampedLeft,\n            width: modalWidth,\n            zIndex: 99999,\n            ...(showAbove\n              ? { bottom: viewportHeight - anchorRect.top + 10 }\n              : { top: anchorRect.bottom + 10 }),\n            ...customStyles?.modal,\n          };\n        })()\n      : {\n          ...baseContainer,\n          position: \"absolute\" as const,\n          left: \"50%\",\n          width: modalWidth,\n          zIndex: 9999,\n          ...(showAbove\n            ? {\n                bottom: \"100%\",\n                marginBottom: 10,\n                transform: \"translateX(-50%)\",\n              }\n            : { top: \"100%\", marginTop: 10, transform: \"translateX(-50%)\" }),\n          ...customStyles?.modal,\n        };\n\n  // Form-field stagger (desktop only — on mobile the modal centers via\n  // translate, which conflicts with per-child translateY animations).\n  const fadeUpStyle = (index: number): React.CSSProperties =>\n    isMobile\n      ? {}\n      : {\n          animation: `gotcha-fade-up ${t.animation.duration.normal} ${t.animation.easing.default} both`,\n          animationDelay: `${index * 0.04}s`,\n        };\n\n  // Padding around the body content (below the header rule). 20/20 top\n  // keeps the rule 20px off the content (vs the header's 16px rule gap) —\n  // ~36px total around the hairline, matching editorial print discipline\n  // of ~1.5× cap-height.\n  const bodyPadding = isMobile ? \"20px 24px 24px\" : \"20px 28px 24px\";\n\n  return (\n    <div\n      ref={modalRef}\n      role=\"dialog\"\n      aria-modal=\"true\"\n      aria-label={isSubmitted ? \"Feedback submitted\" : undefined}\n      aria-labelledby={isSubmitted ? undefined : \"gotcha-modal-title\"}\n      data-gotcha\n      style={modalStyles}\n      className={cn(\"gotcha-modal\", \"gotcha-root\", animationClass)}\n    >\n      {/* Header — small-caps eyebrow, serif H1, hairline rule beneath.\n          Not rendered on success state (see below). */}\n      {!isSubmitted && (\n        <header\n          style={{\n            padding: isMobile ? \"20px 24px 16px\" : \"22px 28px 16px\",\n            borderBottom: `${t.borders.width}px solid ${t.colors.border}`,\n            position: \"relative\",\n          }}\n        >\n          {/* Small-caps mode label — eyebrow hairline at 16px + 8px gap\n              reads as a single typographic unit (hairline+label), not two\n              parts of a form. */}\n          <div\n            style={{\n              display: \"flex\",\n              alignItems: \"center\",\n              gap: 8,\n              marginBottom: 10,\n              ...fadeUpStyle(0),\n            }}\n          >\n            <span\n              aria-hidden=\"true\"\n              style={{\n                display: \"inline-block\",\n                width: 16,\n                height: 1,\n                backgroundColor:\n                  t.colors.warning /* sienna hairline — brand accent */,\n              }}\n            />\n            <span\n              style={{\n                fontFamily: t.typography.fontFamily,\n                fontSize: 10,\n                fontWeight: t.typography.fontWeight.medium,\n                letterSpacing: \"0.16em\",\n                textTransform: \"uppercase\",\n                color: t.colors.textSecondary,\n              }}\n            >\n              {modeLabel}\n            </span>\n          </div>\n\n          {/* Serif H1 — the prompt itself. Tracking -0.01em matches\n              Fraunces 9pt's letter-fit at this scale. Weight 400\n              matches our embedded subset (see fonts/fraunces-subset.ts)\n              so the browser never synthesizes bold. */}\n          <h2\n            id=\"gotcha-modal-title\"\n            style={{\n              margin: 0,\n              paddingRight: isMobile ? 52 : 44,\n              fontFamily: t.typography.fontFamilyDisplay,\n              fontSize: isMobile ? 22 : 20,\n              fontWeight: t.typography.fontWeight.normal,\n              letterSpacing: \"-0.01em\",\n              lineHeight: 1.25,\n              color: t.colors.text,\n              ...fadeUpStyle(1),\n              ...customStyles?.title,\n            }}\n          >\n            {prompt}\n          </h2>\n\n          {/* Close — muted → ink on hover. Hit target 32×32 desktop (WCAG\n              2.5.5 minimum) / 44×44 mobile (HIG); visible glyph stays\n              compact. Denser stroke (1.5) at 12×12 reads as a\n              typographic mark rather than a thin ui control. */}\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 ? 14 : 16,\n              right: isMobile ? 14 : 18,\n              width: isMobile ? 44 : 32,\n              height: isMobile ? 44 : 32,\n              border: \"none\",\n              background: \"transparent\",\n              outline: \"none\",\n              cursor: \"pointer\",\n              color: t.colors.closeButton,\n              display: \"flex\",\n              alignItems: \"center\",\n              justifyContent: \"center\",\n              borderRadius: t.borders.radius.sm,\n              transition: `color ${t.animation.duration.fast} ${t.animation.easing.default}`,\n              ...customStyles?.closeButton,\n            }}\n            onMouseEnter={(e) => {\n              e.currentTarget.style.color = t.colors.closeButtonHover;\n            }}\n            onMouseLeave={(e) => {\n              e.currentTarget.style.color = t.colors.closeButton;\n            }}\n          >\n            <svg width={12} height={12} viewBox=\"0 0 12 12\" fill=\"none\">\n              <path\n                d=\"M1 1L11 11M1 11L11 1\"\n                stroke=\"currentColor\"\n                strokeWidth=\"1.5\"\n                strokeLinecap=\"round\"\n              />\n            </svg>\n          </button>\n        </header>\n      )}\n\n      {/* Body */}\n      <div\n        style={{ padding: isSubmitted ? 0 : bodyPadding, position: \"relative\" }}\n      >\n        {/* Error — left-edge clay bar only. No tinted background; the\n            edge + ink body carries the signal with editorial restraint.\n            The \" — try again?\" suffix uses a real em-dash (already in\n            source) as the visual separator, so no marginLeft needed. */}\n        {error && !isSubmitted && (\n          <div\n            role=\"alert\"\n            style={{\n              padding: \"2px 0 2px 14px\",\n              marginBottom: 16,\n              borderLeft: `2px solid ${t.colors.error}`,\n              color: t.colors.text,\n              fontSize: t.typography.fontSize.sm,\n              lineHeight: 1.55,\n              ...fadeUpStyle(2),\n              ...customStyles?.errorMessage,\n            }}\n          >\n            {error}\n            <span style={{ color: t.colors.textSecondary }}> — try again?</span>\n          </div>\n        )}\n\n        {/* Success — editorial checkmark + serif \"Gotcha!\" + progress rule */}\n        {isSubmitted && (\n          <div\n            style={{\n              padding: isMobile ? \"32px 24px 28px\" : \"36px 28px 28px\",\n              textAlign: \"center\",\n              position: \"relative\",\n            }}\n          >\n            {/* Check path length ~30 units — dasharray + offset 30 means\n                the stroke starts fully hidden and draws in over 320ms. */}\n            <svg\n              width=\"40\"\n              height=\"40\"\n              viewBox=\"0 0 40 40\"\n              fill=\"none\"\n              style={{\n                display: \"block\",\n                margin: \"0 auto 14px\",\n                ...customStyles?.successIcon,\n              }}\n            >\n              <path\n                d=\"M10 20.5L17 27.5L31 13.5\"\n                stroke={t.colors.success}\n                strokeWidth=\"1.75\"\n                strokeLinecap=\"round\"\n                strokeLinejoin=\"round\"\n                style={{\n                  strokeDasharray: 30,\n                  strokeDashoffset: 30,\n                  animation: `gotcha-check-draw 320ms ${t.animation.easing.default} forwards`,\n                }}\n              />\n            </svg>\n\n            <p\n              style={{\n                margin: 0,\n                fontFamily: t.typography.fontFamilyDisplay,\n                fontSize: 22,\n                // Regular weight matches the embedded Fraunces 9pt subset\n                // and the marketing navbar's treatment — avoids faux-bold\n                // against a regular-only @font-face.\n                fontWeight: t.typography.fontWeight.normal,\n                letterSpacing: \"-0.01em\",\n                color: t.colors.text,\n                ...customStyles?.successMessage,\n              }}\n            >\n              {thankYouMessage}\n            </p>\n\n            <p\n              style={{\n                margin: \"8px 0 0\",\n                fontFamily: t.typography.fontFamily,\n                fontSize: t.typography.fontSize.sm,\n                color: t.colors.textSecondary,\n                fontStyle: \"italic\",\n              }}\n            >\n              We&rsquo;ll close this in a moment.\n            </p>\n\n            {/* Autoclose progress rule — 1px sage bar across the modal's\n                inner bottom edge that fills left-to-right over the\n                autoclose period. Inset by 1px so it doesn't visually\n                fight the modal's bottom border. Subtle affordance; the\n                modal is dismissing on its own without any chrome shout. */}\n            <span\n              aria-hidden=\"true\"\n              style={{\n                position: \"absolute\",\n                left: 1,\n                right: 1,\n                bottom: 1,\n                height: 1,\n                backgroundColor: t.colors.success,\n                transformOrigin: \"left center\",\n                animation: `gotcha-progress ${AUTOCLOSE_MS}ms linear forwards`,\n              }}\n            />\n          </div>\n        )}\n\n        {/* Follow-up question */}\n        {phase === \"followUp\" &&\n          followUpConfig &&\n          onFollowUpSubmit &&\n          !isSubmitted && (\n            <div style={fadeUpStyle(2)}>\n              <FollowUpPrompt\n                resolvedTheme={t}\n                promptText={followUpConfig.promptText}\n                placeholder={followUpConfig.placeholder}\n                isLoading={followUpLoading}\n                onSubmit={onFollowUpSubmit}\n              />\n            </div>\n          )}\n\n        {/* Checking for existing response */}\n        {phase === \"form\" && isCheckingExisting && (\n          <div\n            style={{\n              display: \"flex\",\n              justifyContent: \"center\",\n              padding: \"24px 0\",\n              ...fadeUpStyle(2),\n            }}\n          >\n            <Spinner size={20} color={t.colors.textSecondary} />\n          </div>\n        )}\n\n        {/* Form content based on mode */}\n        {phase === \"form\" && !isCheckingExisting && !isSubmitted && (\n          <div style={fadeUpStyle(2)}>\n            {mode === \"feedback\" && (\n              <FeedbackMode\n                resolvedTheme={t}\n                placeholder={placeholder}\n                submitText={submitText}\n                isLoading={isLoading}\n                onSubmit={onSubmit}\n                customStyles={customStyles}\n                initialValues={\n                  existingResponse\n                    ? {\n                        content: existingResponse.content,\n                        rating: existingResponse.rating,\n                      }\n                    : undefined\n                }\n                isEditing={isEditing}\n                showText={showText}\n                showRating={showRating}\n                enableBugFlag={enableBugFlag}\n                bugFlagLabel={bugFlagLabel}\n                enableScreenshot={enableScreenshot}\n              />\n            )}\n            {mode === \"vote\" && (\n              <VoteMode\n                resolvedTheme={t}\n                isLoading={isLoading}\n                onSubmit={onSubmit}\n                initialVote={existingResponse?.vote || undefined}\n                isEditing={isEditing}\n                labels={voteLabels}\n              />\n            )}\n            {mode === \"nps\" && (\n              <NpsMode\n                resolvedTheme={t}\n                submitText={submitText}\n                isLoading={isLoading}\n                onSubmit={onSubmit}\n                showFollowUp={npsFollowUp}\n                followUpPlaceholder={npsFollowUpPlaceholder}\n                lowLabel={npsLowLabel}\n                highLabel={npsHighLabel}\n                customStyles={customStyles}\n                initialValues={\n                  existingResponse\n                    ? {\n                        rating: existingResponse.rating,\n                        content: existingResponse.content,\n                      }\n                    : undefined\n                }\n                isEditing={isEditing}\n              />\n            )}\n            {mode === \"poll\" && options && options.length > 0 && (\n              <PollMode\n                resolvedTheme={t}\n                options={options}\n                allowMultiple={allowMultiple}\n                isLoading={isLoading}\n                onSubmit={onSubmit}\n                initialSelected={existingResponse?.pollSelected || undefined}\n                isEditing={isEditing}\n              />\n            )}\n          </div>\n        )}\n      </div>\n\n      {/* Screen reader announcement — single announcement at a time so\n          AT doesn't read both \"submitted\" and \"error\" if a race occurs. */}\n      <div\n        aria-live=\"polite\"\n        className=\"sr-only\"\n        style={{ position: \"absolute\", left: -9999 }}\n      >\n        {isSubmitted\n          ? \"Thank you. Your feedback has been submitted.\"\n          : error\n            ? `Error: ${error}`\n            : \"\"}\n      </div>\n    </div>\n  );\n}\n","import React, { useState, useCallback, useEffect, useRef } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport {\n  ResponseMode,\n  GotchaUser,\n  Position,\n  Size,\n  Theme,\n  TouchBehavior,\n  GotchaStyles,\n  GotchaResponse,\n  GotchaError,\n} from \"../types\";\nimport { DEFAULTS } from \"../constants\";\nimport { useGotchaContext } from \"./GotchaProvider\";\nimport { useSubmit } from \"../hooks/useSubmit\";\nimport { useHideAfterSubmit } from \"../hooks/useHideAfterSubmit\";\nimport { useTriggerConditions } from \"../hooks/useTriggerConditions\";\nimport { GotchaButton } from \"./GotchaButton\";\nimport { GotchaModal } from \"./GotchaModal\";\n\nexport interface GotchaProps {\n  /** Unique identifier for this element */\n  elementId: string;\n\n  // User data\n  /** User metadata for segmentation */\n  user?: GotchaUser;\n\n  /**\n   * Submitter's email address. When set, the dashboard can email the user\n   * a \"we shipped what you asked for\" note when their feedback hits the\n   * SHIPPED status. Pass only with explicit user consent — store no other\n   * PII in this field.\n   */\n  userEmail?: string;\n\n  // Behavior\n  /** Feedback mode */\n  mode?: ResponseMode;\n\n  // Feedback mode field visibility\n  /** Show the text input in feedback mode (default: true) */\n  showText?: boolean;\n  /** Show the star rating in feedback mode (default: true) */\n  showRating?: boolean;\n\n  // Vote mode specific\n  /** Custom labels for vote buttons (default: Like/Dislike) */\n  voteLabels?: { up: string; down: string };\n\n  // Poll mode specific\n  /** Required if mode is 'poll' (2-6 options) */\n  options?: string[];\n  /** Allow selecting multiple options */\n  allowMultiple?: boolean;\n\n  // NPS mode specific\n  /** Custom NPS question (default: \"How likely are you to recommend us?\") */\n  npsQuestion?: string;\n  /** Show follow-up textarea after score selection (default: true) */\n  npsFollowUp?: boolean;\n  /** Placeholder for NPS follow-up textarea */\n  npsFollowUpPlaceholder?: string;\n  /** Label for low end of NPS scale (default: \"Not likely\") */\n  npsLowLabel?: string;\n  /** Label for high end of NPS scale (default: \"Very likely\") */\n  npsHighLabel?: string;\n\n  // Appearance\n  /** Button position relative to parent */\n  position?: Position;\n  /** Button size */\n  size?: Size;\n  /** Color theme */\n  theme?: Theme;\n  /** Custom style overrides */\n  customStyles?: GotchaStyles;\n  /** Control visibility programmatically */\n  visible?: boolean;\n  /** Only show when parent is hovered (default: true) */\n  showOnHover?: boolean;\n  /** Mobile behavior (default: 'always-visible') */\n  touchBehavior?: TouchBehavior;\n\n  // Content\n  /** Custom prompt text */\n  promptText?: string;\n  /** Input placeholder text */\n  placeholder?: string;\n  /** Submit button text */\n  submitText?: string;\n  /** Post-submission message */\n  thankYouMessage?: string;\n\n  // Bug flagging\n  /** Show \"Report an issue\" toggle in feedback form (default: false) */\n  enableBugFlag?: boolean;\n  /** Custom label for the bug flag toggle (default: \"Report an issue\") */\n  bugFlagLabel?: string;\n  /** Enable screenshot capture when bug flag is toggled (uses modern-screenshot, bundled — no extra install needed) */\n  enableScreenshot?: boolean;\n\n  // Deduplication\n  /** When true and user has already responded, show submitted state and allow review/edit instead of new submission */\n  onePerUser?: boolean;\n  /** When onePerUser is true, allow a new submission after this many days. Has no effect without onePerUser. */\n  cooldownDays?: number;\n  /** After submission, hide the widget for this many days (client-side, localStorage).\n   *  Independent of cooldownDays — the widget stays hidden for the full duration even if cooldown expires sooner. */\n  hideAfterSubmitDays?: number;\n\n  // Trigger conditions\n  /** Delay showing widget by N seconds after page load */\n  showAfterSeconds?: number;\n  /** Show widget after user scrolls past this percentage (0-100) */\n  showAfterScrollPercent?: number;\n  /** Show widget after user has visited N times (uses localStorage) */\n  showAfterVisits?: number;\n\n  // Follow-up\n  /** Show a follow-up question after low rating or negative vote */\n  followUp?: {\n    /** Rating threshold (inclusive) — e.g., 2 means ratings 1-2 trigger follow-up */\n    ratingThreshold?: number;\n    /** Also trigger on negative vote */\n    onNegativeVote?: boolean;\n    /** The prompt text shown */\n    promptText: string;\n    /** Placeholder for the follow-up textarea */\n    placeholder?: string;\n  };\n\n  // Animation\n  /** Enable entrance animations on the button and modal (default: true) */\n  animated?: boolean;\n\n  // Callbacks\n  /** Called after successful submission */\n  onSubmit?: (response: GotchaResponse) => void;\n  /** Called when modal opens */\n  onOpen?: () => void;\n  /** Called when modal closes */\n  onClose?: () => void;\n  /** Called on error */\n  onError?: (error: GotchaError) => void;\n}\n\nexport function Gotcha({\n  elementId,\n  user,\n  userEmail,\n  mode = \"feedback\",\n  showText = true,\n  showRating = true,\n  voteLabels,\n  options,\n  allowMultiple = false,\n  npsQuestion,\n  npsFollowUp = true,\n  npsFollowUpPlaceholder,\n  npsLowLabel,\n  npsHighLabel,\n  enableBugFlag = false,\n  bugFlagLabel,\n  enableScreenshot = false,\n  onePerUser = false,\n  cooldownDays,\n  hideAfterSubmitDays,\n  showAfterSeconds,\n  showAfterScrollPercent,\n  showAfterVisits,\n  followUp,\n  animated = true,\n  position = DEFAULTS.POSITION,\n  size = DEFAULTS.SIZE,\n  theme = DEFAULTS.THEME,\n  customStyles,\n  visible = true,\n  showOnHover = DEFAULTS.SHOW_ON_HOVER,\n  touchBehavior = DEFAULTS.TOUCH_BEHAVIOR,\n  promptText,\n  placeholder,\n  submitText = DEFAULTS.SUBMIT_TEXT,\n  thankYouMessage = DEFAULTS.THANK_YOU_MESSAGE,\n  onSubmit,\n  onOpen,\n  onClose,\n  onError,\n}: GotchaProps) {\n  const {\n    disabled,\n    activeModalId,\n    openModal,\n    closeModal,\n    defaultUser,\n    defaultUserEmail,\n    client,\n    debug,\n  } = useGotchaContext();\n\n  const { conditionsMet } = useTriggerConditions({\n    elementId,\n    showAfterSeconds,\n    showAfterScrollPercent,\n    showAfterVisits,\n  });\n\n  const { isHidden, markHidden } = useHideAfterSubmit({\n    elementId,\n    userId: user?.id || defaultUser?.id,\n    hideAfterSubmitDays,\n  });\n  const [phase, setPhase] = useState<\"form\" | \"followUp\" | \"success\">(\"form\");\n  const [lastResponseId, setLastResponseId] = useState<string | null>(null);\n  const [followUpLoading, setFollowUpLoading] = useState(false);\n  const [queuedCount, setQueuedCount] = useState(0);\n  const [isParentHovered, setIsParentHovered] = useState(false);\n  const [anchorRect, setAnchorRect] = useState<DOMRect | null>(null);\n  const [isMobile, setIsMobile] = useState(false);\n  const [hasMounted, setHasMounted] = useState(false);\n  const containerRef = useRef<HTMLDivElement>(null);\n  const autoCloseTimerRef = useRef<ReturnType<typeof setTimeout>>();\n  const lastSubmitDataRef = useRef<{\n    rating?: number;\n    vote?: \"up\" | \"down\";\n  } | null>(null);\n\n  // Full SubmitData payload for the most recent click. Held so the failure\n  // toast's \"Retry\" button can re-fire the exact same payload — the modal\n  // has closed by the time the user sees the toast, so we can't re-read\n  // form state from children. Cleared on successful settle.\n  const pendingDataRef = useRef<{\n    content?: string;\n    title?: string;\n    rating?: number;\n    vote?: \"up\" | \"down\";\n    pollSelected?: string[];\n    isBug?: boolean;\n    screenshot?: string;\n  } | null>(null);\n\n  // Failure toast — only shown when the optimistic UI was already flipped\n  // to success but the background POST rejected. Preserves the payload so\n  // the user can retry without reopening the modal.\n  const [failureToast, setFailureToast] = useState<{\n    message: string;\n    retrying: boolean;\n  } | null>(null);\n\n  // SSR-safe mount detection + live viewport tracking. Uses matchMedia so\n  // we only re-render when the viewport actually crosses the breakpoint,\n  // not on every resize pixel.\n  //\n  // Breakpoint at 1023px (Tailwind `lg:` — standard laptop threshold).\n  // Below that, the modal centres with a full-width backdrop; above, it\n  // anchors beneath the button. Two lower breakpoints (639, 767) were\n  // tested first and both left a middle-viewport dead-zone where the\n  // modal hugged the button in a narrow column with the rest of the\n  // viewport empty — neither small enough for the mobile centered\n  // treatment nor wide enough for anchored-popover to read as integrated.\n  // Anchored-popover is a desktop pattern; it needs desktop width to work.\n  useEffect(() => {\n    setHasMounted(true);\n    if (typeof window === \"undefined\") return;\n    const mq = window.matchMedia(\"(max-width: 1023px)\");\n    const sync = () => setIsMobile(mq.matches);\n    sync();\n    mq.addEventListener(\"change\", sync);\n    return () => {\n      mq.removeEventListener(\"change\", sync);\n      clearTimeout(autoCloseTimerRef.current);\n    };\n  }, []);\n\n  // Track offline queue length\n  useEffect(() => {\n    setQueuedCount(client.getQueueLength());\n    const handleOnline = () => {\n      // Queue will be flushed by provider; update count after a delay\n      setTimeout(() => setQueuedCount(client.getQueueLength()), 2000);\n    };\n    window.addEventListener(\"online\", handleOnline);\n    return () => window.removeEventListener(\"online\", handleOnline);\n  }, [client]);\n\n  const isOpen = activeModalId === elementId;\n\n  // Re-measure the anchor rect when viewport changes while the modal is\n  // open. Only runs on desktop (isMobile=false) because the mobile\n  // centered layout ignores anchorRect entirely — re-measuring during a\n  // drag across the breakpoint just caused a per-pixel flicker without\n  // any visual benefit.\n  //\n  // rAF-throttled: resize events fire at ~60Hz during a drag; without\n  // throttling React re-renders the portal modal dozens of times per\n  // second, causing position jitter. Coalescing into the next animation\n  // frame keeps the modal rock-steady.\n  useEffect(() => {\n    if (!isOpen || isMobile) return;\n    let rafId = 0;\n    const reanchor = () => {\n      if (rafId) return;\n      rafId = requestAnimationFrame(() => {\n        rafId = 0;\n        const el = containerRef.current;\n        if (!el) return;\n        const button = el.querySelector(\"button\");\n        setAnchorRect((button ?? el).getBoundingClientRect());\n      });\n    };\n    window.addEventListener(\"resize\", reanchor);\n    window.addEventListener(\"scroll\", reanchor, { passive: true });\n    return () => {\n      if (rafId) cancelAnimationFrame(rafId);\n      window.removeEventListener(\"resize\", reanchor);\n      window.removeEventListener(\"scroll\", reanchor);\n    };\n  }, [isOpen, isMobile]);\n\n  // Reset phase when modal is closed externally (e.g., another modal opens)\n  useEffect(() => {\n    if (!isOpen) {\n      setPhase(\"form\");\n      clearTimeout(autoCloseTimerRef.current);\n    }\n  }, [isOpen]);\n\n  // Scroll lock on mobile when modal is open\n  useEffect(() => {\n    if (!isOpen || !isMobile) return;\n    const prev = document.body.style.overflow;\n    document.body.style.overflow = \"hidden\";\n    return () => {\n      document.body.style.overflow = prev;\n    };\n  }, [isOpen, isMobile]);\n\n  // Attach hover listeners to the parent element\n  useEffect(() => {\n    if (!showOnHover) return;\n\n    const container = containerRef.current;\n    if (!container) return;\n\n    const parent = container.parentElement;\n    if (!parent) return;\n\n    const handleMouseEnter = () => setIsParentHovered(true);\n    const handleMouseLeave = () => setIsParentHovered(false);\n\n    parent.addEventListener(\"mouseenter\", handleMouseEnter);\n    parent.addEventListener(\"mouseleave\", handleMouseLeave);\n\n    return () => {\n      parent.removeEventListener(\"mouseenter\", handleMouseEnter);\n      parent.removeEventListener(\"mouseleave\", handleMouseLeave);\n    };\n  }, [showOnHover]);\n\n  const {\n    submit,\n    isLoading,\n    isCheckingExisting,\n    error,\n    existingResponse,\n    isEditing,\n  } = useSubmit({\n    elementId,\n    mode,\n    pollOptions: options,\n    user,\n    userEmail: userEmail ?? defaultUserEmail,\n    onePerUser,\n    cooldownDays,\n    // Phase flip happens synchronously in handleSubmit (optimistic UI);\n    // onSuccess reconciles the server-returned id + clears any pending\n    // retry toast from a previous attempt.\n    onSuccess: (response) => {\n      setLastResponseId(response.id);\n      onSubmit?.(response);\n      setFailureToast(null);\n      pendingDataRef.current = null;\n    },\n    onError: (err) => {\n      console.warn(\n        \"[Gotcha] Submission failed:\",\n        err instanceof Error ? err.message : err,\n      );\n      onError?.(err as unknown as GotchaError);\n      // Background POST rejected after the optimistic success flip.\n      // Show a retry toast with the preserved payload so the user can\n      // recover without losing their input. The modal has already moved\n      // on — never silently swallow the failure.\n      if (pendingDataRef.current) {\n        setFailureToast({\n          message: err instanceof Error ? err.message : \"Something went wrong\",\n          retrying: false,\n        });\n      }\n    },\n  });\n\n  const handleOpen = useCallback(() => {\n    if (containerRef.current) {\n      // Measure the actual button element, not the container div.\n      // The container (inline-flex) can be larger than the button due to\n      // line-height, baseline alignment, or inherited layout styles from\n      // the parent — causing the modal to appear with a gap.\n      const button = containerRef.current.querySelector(\"button\");\n      setAnchorRect((button ?? containerRef.current).getBoundingClientRect());\n    }\n    openModal(elementId);\n    onOpen?.();\n  }, [elementId, openModal, onOpen]);\n\n  const handleClose = useCallback(() => {\n    clearTimeout(autoCloseTimerRef.current);\n    closeModal();\n    setPhase(\"form\");\n    onClose?.();\n  }, [closeModal, onClose]);\n\n  // Optimistic submit — flip phase BEFORE the server round-trip so the\n  // user sees the success state (or follow-up prompt) within one paint\n  // frame. The POST runs in the background via submit(); onSuccess\n  // reconciles the id, onError shows a retry toast with preserved data.\n  //\n  // Follow-up decision + markHidden() both run from in-hand data (rating,\n  // vote) — they never needed the server response.\n  const handleSubmit = useCallback(\n    (data: {\n      content?: string;\n      title?: string;\n      rating?: number;\n      vote?: \"up\" | \"down\";\n      pollSelected?: string[];\n      isBug?: boolean;\n      screenshot?: string;\n    }) => {\n      lastSubmitDataRef.current = { rating: data.rating, vote: data.vote };\n      pendingDataRef.current = data;\n\n      const shouldFollowUp =\n        followUp &&\n        ((followUp.ratingThreshold != null &&\n          data.rating != null &&\n          data.rating <= followUp.ratingThreshold) ||\n          (followUp.onNegativeVote && data.vote === \"down\"));\n\n      if (shouldFollowUp && mode !== \"poll\") {\n        setPhase(\"followUp\");\n      } else {\n        setPhase(\"success\");\n        autoCloseTimerRef.current = setTimeout(() => {\n          closeModal();\n          setPhase(\"form\");\n        }, 4000);\n      }\n\n      if (hideAfterSubmitDays) markHidden();\n\n      // Fire the POST in background. onSuccess/onError in useSubmit\n      // handle reconciliation; swallow rejection here so the unhandled\n      // promise doesn't bubble to the host page.\n      const submitStart =\n        typeof performance !== \"undefined\" ? performance.now() : Date.now();\n      submit(data)\n        .catch(() => {\n          // Handled in onError.\n        })\n        .finally(() => {\n          if (debug) {\n            const ms =\n              (typeof performance !== \"undefined\"\n                ? performance.now()\n                : Date.now()) - submitStart;\n            console.log(`[Gotcha] Server ack in ${ms.toFixed(0)}ms`);\n          }\n        });\n    },\n    [\n      submit,\n      followUp,\n      mode,\n      hideAfterSubmitDays,\n      markHidden,\n      closeModal,\n      debug,\n    ],\n  );\n\n  // Retry the most recent failed submission. The modal has closed by\n  // this point — we fire the POST silently and dismiss the toast on\n  // success (via onSuccess → setFailureToast(null)). On a second\n  // failure, onError re-shows the toast with the new error.\n  const handleRetrySubmission = useCallback(() => {\n    const data = pendingDataRef.current;\n    if (!data || !failureToast || failureToast.retrying) return;\n    setFailureToast({ ...failureToast, retrying: true });\n    submit(data).catch(() => {\n      // onError re-paints the toast.\n    });\n  }, [failureToast, submit]);\n\n  const handleDismissToast = useCallback(() => {\n    setFailureToast(null);\n    pendingDataRef.current = null;\n  }, []);\n\n  // Handle follow-up submission\n  const handleFollowUpSubmit = useCallback(\n    async (content: string) => {\n      if (!lastResponseId) return;\n      setFollowUpLoading(true);\n      try {\n        await client.updateResponse(lastResponseId, { content });\n      } catch (err) {\n        // If follow-up fails, still show success — initial response is already saved\n        console.warn(\n          \"[Gotcha] Follow-up submission failed:\",\n          err instanceof Error ? err.message : err,\n        );\n      } finally {\n        setFollowUpLoading(false);\n        setPhase(\"success\");\n        autoCloseTimerRef.current = setTimeout(() => {\n          closeModal();\n          setPhase(\"form\");\n        }, 4000);\n      }\n    },\n    [lastResponseId, closeModal, client],\n  );\n\n  const effectiveSubmitText = onePerUser && isEditing ? \"Update\" : submitText;\n\n  if (disabled || !visible || isHidden || !conditionsMet) return null;\n\n  const positionStyles: Record<Position, React.CSSProperties> = {\n    \"top-right\": {\n      position: \"absolute\",\n      top: 0,\n      right: 0,\n      transform: \"translate(50%, -50%)\",\n    },\n    \"top-left\": {\n      position: \"absolute\",\n      top: 0,\n      left: 0,\n      transform: \"translate(-50%, -50%)\",\n    },\n    \"bottom-right\": {\n      position: \"absolute\",\n      bottom: 0,\n      right: 0,\n      transform: \"translate(50%, 50%)\",\n    },\n    \"bottom-left\": {\n      position: \"absolute\",\n      bottom: 0,\n      left: 0,\n      transform: \"translate(-50%, 50%)\",\n    },\n    inline: { position: \"relative\", display: \"inline-flex\" },\n  };\n\n  const modalProps = {\n    mode,\n    theme,\n    customStyles,\n    promptText,\n    placeholder,\n    submitText: effectiveSubmitText,\n    thankYouMessage,\n    isLoading,\n    isCheckingExisting: onePerUser && isCheckingExisting,\n    isSubmitted: phase === \"success\",\n    phase,\n    followUpConfig: followUp,\n    followUpLoading,\n    onFollowUpSubmit: handleFollowUpSubmit,\n    error,\n    existingResponse: onePerUser ? existingResponse : null,\n    isEditing: onePerUser && isEditing,\n    showText,\n    showRating,\n    voteLabels,\n    options,\n    allowMultiple,\n    npsQuestion,\n    npsFollowUp,\n    npsFollowUpPlaceholder,\n    npsLowLabel,\n    npsHighLabel,\n    enableBugFlag,\n    bugFlagLabel,\n    enableScreenshot,\n    onSubmit: handleSubmit,\n    onClose: handleClose,\n    anchorRect: anchorRect || undefined,\n    useFixedPosition: !isMobile,\n    isMobile,\n  };\n\n  return (\n    <div\n      ref={containerRef}\n      style={{\n        ...positionStyles[position],\n        // Intentionally `auto` even when open: the modal is portaled to\n        // document.body and sits at z-index 99999 in the root stacking\n        // context. Elevating the container here traps it inside the host\n        // page's stacking context, and the button then renders over the\n        // portal at anchor-adjacent positions (the original \"G floats on\n        // top of the modal\" bug). Leave the button's own stacking to the\n        // host page — the modal's portal handles above/below behaviour.\n        zIndex: \"auto\",\n      }}\n      className=\"gotcha-container\"\n      data-gotcha-element={elementId}\n    >\n      <GotchaButton\n        size={size}\n        theme={theme}\n        customStyles={customStyles}\n        showOnHover={showOnHover}\n        touchBehavior={touchBehavior}\n        onClick={handleOpen}\n        isOpen={isOpen}\n        isParentHovered={isParentHovered}\n        animated={animated}\n        queuedCount={queuedCount}\n      />\n\n      {/* Single portal that adapts between desktop-anchored and mobile-\n          centred layouts without unmounting GotchaModal. Keeping the same\n          wrapper tree across breakpoints means form state (textarea\n          content, selected stars/poll options, NPS score, bug flag,\n          screenshot) survives a viewport resize across the 1023px\n          threshold — without this, dragging a browser narrow mid-\n          submission would wipe the user's work.\n\n          The outer wrapper stays `position: fixed; inset: 0` in both\n          layouts; only opacity + pointer-events toggle on isMobile. On\n          desktop the backdrop is transparent + click-through (modal\n          anchors via its own internal fixed-position calc). On mobile\n          it's a 40% ink wash with 8px blur + click-to-close. Keeping\n          layout constant — no jump from static-flow to fixed-fullscreen\n          — kills the paint flicker that showed up when dragging across\n          the breakpoint. */}\n      {failureToast &&\n        hasMounted &&\n        createPortal(\n          <FailureToast\n            message={failureToast.message}\n            retrying={failureToast.retrying}\n            onRetry={handleRetrySubmission}\n            onDismiss={handleDismissToast}\n          />,\n          document.body,\n        )}\n\n      {isOpen &&\n        hasMounted &&\n        createPortal(\n          <div\n            role=\"presentation\"\n            onClick={isMobile ? handleClose : undefined}\n            style={{\n              position: \"fixed\",\n              inset: 0,\n              zIndex: 99999,\n              backgroundColor: isMobile ? \"rgba(26,23,20,0.32)\" : \"transparent\",\n              backdropFilter: isMobile ? \"blur(8px)\" : \"none\",\n              WebkitBackdropFilter: isMobile ? \"blur(8px)\" : \"none\",\n              pointerEvents: isMobile ? \"auto\" : \"none\",\n              transition:\n                \"background-color 180ms cubic-bezier(0.22, 0.61, 0.36, 1)\",\n            }}\n          >\n            <div\n              onClick={isMobile ? (e) => e.stopPropagation() : undefined}\n              style={{ pointerEvents: \"auto\" }}\n            >\n              <GotchaModal {...modalProps} />\n            </div>\n          </div>,\n          document.body,\n        )}\n    </div>\n  );\n}\n\n/**\n * Failure toast — shown only when the background POST rejects after the\n * optimistic phase flip. Bottom-right on desktop, bottom-centre on mobile.\n * Never blocks interaction with the host page; `role=\"status\"` +\n * `aria-live=\"polite\"` so screen readers announce without interrupting.\n *\n * Keeps the retry count implicit: if the retry also fails, the `onError`\n * callback re-renders this same toast with a fresh message. If the retry\n * succeeds, `onSuccess` clears `failureToast` state and the toast unmounts.\n */\nfunction FailureToast({\n  message,\n  retrying,\n  onRetry,\n  onDismiss,\n}: {\n  message: string;\n  retrying: boolean;\n  onRetry: () => void;\n  onDismiss: () => void;\n}) {\n  return (\n    <div\n      role=\"status\"\n      aria-live=\"polite\"\n      className=\"editorial\"\n      style={{\n        position: \"fixed\",\n        bottom: 16,\n        right: 16,\n        zIndex: 99998,\n        maxWidth: 360,\n        borderRadius: 6,\n        border: \"1px solid rgba(155, 58, 46, 0.35)\",\n        backgroundColor: \"#FAF8F4\",\n        boxShadow: \"0 4px 16px rgba(26, 23, 20, 0.12)\",\n        padding: \"14px 16px\",\n        fontFamily:\n          \"-apple-system, BlinkMacSystemFont, 'Inter', 'Segoe UI', Roboto, sans-serif\",\n        color: \"#1A1714\",\n        animation: \"gotcha-fade-up 240ms cubic-bezier(0.22, 0.61, 0.36, 1)\",\n      }}\n    >\n      <div\n        style={{\n          fontFamily:\n            \"ui-monospace, SFMono-Regular, Menlo, Monaco, 'Courier New', monospace\",\n          fontSize: 10,\n          textTransform: \"uppercase\",\n          letterSpacing: \"0.18em\",\n          color: \"#9B3A2E\",\n          marginBottom: 6,\n        }}\n      >\n        Couldn&rsquo;t save\n      </div>\n      <p\n        style={{ margin: 0, fontSize: 13, lineHeight: 1.55, color: \"#1A1714\" }}\n      >\n        {message || \"Your feedback didn\\u2019t reach us. Retry?\"}\n      </p>\n      <div style={{ marginTop: 12, display: \"flex\", gap: 8 }}>\n        <button\n          type=\"button\"\n          onClick={onRetry}\n          disabled={retrying}\n          style={{\n            backgroundColor: \"#1A1714\",\n            color: \"#FAF8F4\",\n            border: \"none\",\n            borderRadius: 4,\n            padding: \"6px 14px\",\n            fontSize: 12,\n            fontWeight: 500,\n            cursor: retrying ? \"default\" : \"pointer\",\n            opacity: retrying ? 0.6 : 1,\n            transition: \"opacity 180ms\",\n          }}\n        >\n          {retrying ? \"Retrying\\u2026\" : \"Retry\"}\n        </button>\n        <button\n          type=\"button\"\n          onClick={onDismiss}\n          style={{\n            backgroundColor: \"transparent\",\n            color: \"#6B655D\",\n            border: \"1px solid #E8E2D9\",\n            borderRadius: 4,\n            padding: \"6px 14px\",\n            fontSize: 12,\n            cursor: \"pointer\",\n            transition: \"color 180ms\",\n          }}\n        >\n          Dismiss\n        </button>\n      </div>\n    </div>\n  );\n}\n","import { useState, useEffect } from 'react';\nimport { useGotchaContext } from '../components/GotchaProvider';\nimport { ScoreData } from '../types';\n\ninterface UseScoreOptions {\n  elementId: string;\n  refreshInterval?: number;\n}\n\ninterface UseScoreResult {\n  score: ScoreData | null;\n  isLoading: boolean;\n  error: string | null;\n}\n\nexport function useScore({ elementId, refreshInterval }: UseScoreOptions): UseScoreResult {\n  const { client } = useGotchaContext();\n  const [score, setScore] = useState<ScoreData | null>(null);\n  const [isLoading, setIsLoading] = useState(true);\n  const [error, setError] = useState<string | null>(null);\n\n  useEffect(() => {\n    let cancelled = false;\n\n    const fetchScore = async () => {\n      try {\n        const data = await client.getScore(elementId);\n        if (!cancelled) {\n          setScore(data);\n          setError(null);\n        }\n      } catch (err) {\n        if (!cancelled) {\n          setError(err instanceof Error ? err.message : 'Failed to load score');\n        }\n      } finally {\n        if (!cancelled) {\n          setIsLoading(false);\n        }\n      }\n    };\n\n    fetchScore();\n\n    let intervalId: ReturnType<typeof setInterval> | undefined;\n    if (refreshInterval && refreshInterval > 0) {\n      intervalId = setInterval(fetchScore, refreshInterval);\n    }\n\n    return () => {\n      cancelled = true;\n      if (intervalId) clearInterval(intervalId);\n    };\n  }, [client, elementId, refreshInterval]);\n\n  return { score, isLoading, error };\n}\n","import React, { useState, useEffect, useMemo } from 'react';\nimport { Theme, Size } from '../types';\nimport { useScore } from '../hooks/useScore';\nimport { resolveTheme } from '../theme/resolveTheme';\nimport { useGotchaContext } from './GotchaProvider';\n\nexport type ScoreVariant = 'stars' | 'number' | 'compact' | 'votes';\n\nexport interface GotchaScoreProps {\n  elementId: string;\n  variant?: ScoreVariant;\n  showCount?: boolean;\n  size?: Size;\n  theme?: Theme;\n  refreshInterval?: number;\n  style?: React.CSSProperties;\n}\n\nconst SIZE_MAP: Record<Size, {\n  fontSize: number;\n  ratingFontSize: number;\n  starSize: number;\n  gap: number;\n  pillPx: number;\n  pillPy: number;\n  barHeight: number;\n  iconSize: number;\n}> = {\n  sm: { fontSize: 11, ratingFontSize: 13, starSize: 13, gap: 5, pillPx: 8, pillPy: 4, barHeight: 3, iconSize: 12 },\n  md: { fontSize: 12.5, ratingFontSize: 15, starSize: 15, gap: 6, pillPx: 10, pillPy: 5, barHeight: 4, iconSize: 14 },\n  lg: { fontSize: 14, ratingFontSize: 18, starSize: 18, gap: 8, pillPx: 12, pillPy: 6, barHeight: 5, iconSize: 16 },\n};\n\n/** Crisp, rounded 5-point star SVG with partial fill via clipPath */\nfunction Stars({ rating, size, filledColor, emptyColor }: {\n  rating: number;\n  size: number;\n  filledColor: string;\n  emptyColor: string;\n}) {\n  const clipId = `gotcha-star-clip-${Math.random().toString(36).slice(2, 8)}`;\n  const stars = [];\n  for (let i = 1; i <= 5; i++) {\n    const fill = Math.min(1, Math.max(0, rating - (i - 1)));\n    const id = `${clipId}-${i}`;\n    stars.push(\n      <svg key={i} width={size} height={size} viewBox=\"0 0 24 24\" style={{ display: 'block' }}>\n        <defs>\n          <clipPath id={id}>\n            <rect x=\"0\" y=\"0\" width={24 * fill} height=\"24\" />\n          </clipPath>\n        </defs>\n        <path\n          d=\"M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z\"\n          fill={emptyColor}\n        />\n        <path\n          d=\"M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z\"\n          fill={filledColor}\n          clipPath={`url(#${id})`}\n        />\n      </svg>\n    );\n  }\n  return <span style={{ display: 'inline-flex', gap: Math.max(1, size * 0.08), alignItems: 'center' }}>{stars}</span>;\n}\n\n/** Compact positive rate bar */\nfunction PositiveBar({ rate, height, filledColor, trackColor }: {\n  rate: number;\n  height: number;\n  filledColor: string;\n  trackColor: string;\n}) {\n  return (\n    <span style={{\n      display: 'inline-block',\n      width: 48,\n      height,\n      borderRadius: height,\n      backgroundColor: trackColor,\n      overflow: 'hidden',\n      verticalAlign: 'middle',\n    }}>\n      <span style={{\n        display: 'block',\n        width: `${rate}%`,\n        height: '100%',\n        borderRadius: height,\n        background: filledColor,\n        transition: 'width 0.6s cubic-bezier(0.4, 0, 0.2, 1)',\n      }} />\n    </span>\n  );\n}\n\n/** Thumbs up SVG icon — outlined stroke to match VoteMode's treatment */\nfunction ThumbIcon({ size, color }: { size: number; color: string }) {\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      stroke={color}\n      strokeWidth=\"1.5\"\n      strokeLinecap=\"round\"\n      strokeLinejoin=\"round\"\n      style={{ display: 'block' }}\n    >\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\nexport function GotchaScore({\n  elementId,\n  variant = 'stars',\n  showCount = true,\n  size = 'md',\n  theme = 'auto',\n  refreshInterval,\n  style,\n}: GotchaScoreProps) {\n  const { score, isLoading } = useScore({ elementId, refreshInterval });\n  const [systemTheme, setSystemTheme] = useState<'light' | 'dark'>('light');\n\n  useEffect(() => {\n    if (typeof window === 'undefined') return;\n    const mq = window.matchMedia('(prefers-color-scheme: dark)');\n    setSystemTheme(mq.matches ? 'dark' : 'light');\n    const handler = (e: MediaQueryListEvent) => setSystemTheme(e.matches ? 'dark' : 'light');\n    mq.addEventListener('change', handler);\n    return () => mq.removeEventListener('change', handler);\n  }, []);\n\n  const { themeConfig } = useGotchaContext();\n  const t = useMemo(() => resolveTheme(theme, systemTheme, themeConfig), [theme, systemTheme, themeConfig]);\n\n  if (isLoading || !score) return null;\n  const s = SIZE_MAP[size];\n\n  // Color tokens from resolved theme\n  const ratingColor = t.colors.text;\n  const mutedColor = t.colors.textDisabled;\n  const starFilled = t.colors.starFilled;\n  const starEmpty = t.colors.starEmpty;\n  const positiveColor = t.colors.voteUp;\n  const positiveTrack = t.colors.starEmpty;\n\n  const baseStyle: React.CSSProperties = {\n    display: 'inline-flex',\n    alignItems: 'center',\n    gap: s.gap,\n    fontFamily: t.typography.fontFamily,\n    lineHeight: 1,\n    WebkitFontSmoothing: 'antialiased',\n    ...style,\n  };\n\n  // Rating number: body-sans at bold weight, tabular numerals so widths\n  // stay uniform across rating changes. Reads as a data readout — the\n  // counterpart to the editorial count label beneath.\n  const ratingNumberStyle: React.CSSProperties = {\n    fontFamily: t.typography.fontFamily,\n    fontSize: s.ratingFontSize,\n    fontWeight: 700,\n    color: ratingColor,\n    fontVariantNumeric: 'tabular-nums',\n    letterSpacing: '-0.01em',\n    lineHeight: 1,\n  };\n\n  // Count label — small-caps mono, matches modal eyebrow + dashboard\n  // stat-card sub-text pattern. Quiet typographic signature that ties\n  // the score surface into the rest of the editorial system.\n  const countLabelStyle: React.CSSProperties = {\n    fontFamily:\n      \"ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, 'Liberation Mono', monospace\",\n    fontSize: Math.max(9, s.fontSize - 1),\n    color: mutedColor,\n    fontWeight: 400,\n    letterSpacing: '0.1em',\n    textTransform: 'uppercase',\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={{ ...ratingNumberStyle, color: positiveColor }}>{positiveRate}%</span>\n        <PositiveBar rate={positiveRate ?? 0} height={s.barHeight} filledColor={positiveColor} trackColor={positiveTrack} />\n        {showCount && (\n          <span style={countLabelStyle}>{countText(total, 'vote')}</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={ratingNumberStyle}>{displayRating}</span>\n        {showCount && (\n          <span style={countLabelStyle}>({totalResponses.toLocaleString()})</span>\n        )}\n      </span>\n    );\n  }\n\n  // ── Number ─────────────────────────────────────────────────────\n  if (variant === 'number') {\n    return (\n      <span style={baseStyle}>\n        <span style={ratingNumberStyle}>{displayRating}</span>\n        <span style={{ ...countLabelStyle, marginLeft: 2 }}>/ 5</span>\n        {showCount && (\n          <span style={{ ...countLabelStyle, marginLeft: 2 }}>\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={ratingNumberStyle}>{displayRating}</span>\n      {showCount && (\n        <span style={countLabelStyle}>({countText(totalResponses, 'response')})</span>\n      )}\n    </span>\n  );\n}\n","import { useGotchaContext } from '../components/GotchaProvider';\n\n/**\n * Hook to access Gotcha context\n * Must be used within a GotchaProvider\n */\nexport function useGotcha() {\n  const { client, disabled, defaultUser, debug, openModal, closeModal, activeModalId } = useGotchaContext();\n\n  return {\n    /** The API client for manual submissions */\n    client,\n    /** Whether Gotcha is globally disabled */\n    disabled,\n    /** Default user metadata */\n    defaultUser,\n    /** Whether debug mode is enabled */\n    debug,\n    /** Submit feedback programmatically */\n    submitFeedback: client.submitResponse.bind(client),\n    /** Open a specific Gotcha modal by elementId */\n    openModal,\n    /** Close the currently open modal */\n    closeModal,\n    /** The currently open modal's elementId, or null */\n    activeModalId,\n  };\n}\n","import { useCallback } from 'react';\nimport { useGotchaContext } from '../components/GotchaProvider';\n\n/**\n * Hook to programmatically open/close a specific Gotcha widget.\n * The corresponding <Gotcha elementId=\"...\"> must be mounted for the modal to render.\n */\nexport function useGotchaTrigger(elementId: string) {\n  const { activeModalId, openModal, closeModal } = useGotchaContext();\n\n  const open = useCallback(() => openModal(elementId), [openModal, elementId]);\n  const close = useCallback(() => closeModal(), [closeModal]);\n\n  return {\n    open,\n    close,\n    isOpen: activeModalId === elementId,\n  };\n}\n"]}