{"version":3,"file":"error-recovery-ui.mjs","sources":["../../../src/lib/ux/error-recovery-ui.tsx"],"sourcesContent":["/**\n * @file Error Recovery UI\n * @description Graceful error recovery components with user-friendly messaging,\n * retry mechanisms, and progressive degradation.\n *\n * Features:\n * - User-friendly error messages\n * - Retry with exponential backoff\n * - Offline detection and recovery\n * - Progressive degradation\n * - Error context preservation\n * - Analytics integration\n * @refresh reset\n */\n\n/* eslint-disable react-refresh/only-export-components, @typescript-eslint/prefer-nullish-coalescing, @typescript-eslint/no-misused-promises, @typescript-eslint/strict-boolean-expressions, react-hooks/set-state-in-effect */\n\nimport React, { useState, useEffect, useCallback, useMemo, type ReactNode } from 'react';\nimport { isDev } from '@/lib/core/config/env-helper';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Error severity levels\n */\nexport type ErrorSeverity = 'info' | 'warning' | 'error' | 'fatal';\n\n/**\n * Error category\n */\nexport type ErrorCategory =\n  | 'network'\n  | 'auth'\n  | 'validation'\n  | 'permission'\n  | 'notFound'\n  | 'timeout'\n  | 'server'\n  | 'critical'\n  | 'unknown';\n\n/**\n * Error info with context\n */\nexport interface ErrorInfo {\n  error: Error;\n  category: ErrorCategory;\n  severity: ErrorSeverity;\n  isRetryable: boolean;\n  userMessage: string;\n  technicalMessage: string;\n  suggestions: string[];\n  timestamp: number;\n  context?: Record<string, unknown>;\n}\n\n/**\n * Recovery action\n */\nexport interface RecoveryAction {\n  id: string;\n  label: string;\n  description?: string;\n  action: () => void | Promise<void>;\n  primary?: boolean;\n  destructive?: boolean;\n}\n\n/**\n * Error recovery props\n */\nexport interface ErrorRecoveryProps {\n  /** The error that occurred */\n  error: Error | null;\n  /** Error category override */\n  category?: ErrorCategory;\n  /** Custom error message */\n  message?: string;\n  /** Retry callback */\n  onRetry?: () => void | Promise<void>;\n  /** Reset/dismiss callback */\n  onReset?: () => void;\n  /** Navigate away callback */\n  onNavigate?: (path: string) => void;\n  /** Custom recovery actions */\n  actions?: RecoveryAction[];\n  /** Enable automatic retry */\n  autoRetry?: boolean;\n  /** Auto retry delay in ms */\n  autoRetryDelay?: number;\n  /** Maximum auto retry attempts */\n  maxAutoRetries?: number;\n  /** Show technical details */\n  showTechnicalDetails?: boolean;\n  /** Custom fallback component */\n  fallback?: ReactNode;\n  /** Children to render when no error */\n  children?: ReactNode;\n  /** Full screen error */\n  fullScreen?: boolean;\n  /** Compact mode */\n  compact?: boolean;\n  /** Additional class name */\n  className?: string;\n}\n\n/**\n * Offline recovery props\n */\nexport interface OfflineRecoveryProps {\n  /** Pending actions to sync */\n  pendingActions?: number;\n  /** Last sync timestamp */\n  lastSync?: number;\n  /** Force retry callback */\n  onForceRetry?: () => void;\n  /** Children to render when online */\n  children?: ReactNode;\n  /** Custom offline message */\n  offlineMessage?: string;\n}\n\n/**\n * Degraded state props\n */\nexport interface DegradedStateProps {\n  /** Features that are unavailable */\n  unavailableFeatures: string[];\n  /** Reason for degradation */\n  reason: string;\n  /** Expected recovery time */\n  estimatedRecoveryTime?: string;\n  /** Children to render */\n  children?: ReactNode;\n  /** Dismiss callback */\n  onDismiss?: () => void;\n}\n\n// ============================================================================\n// Error Classification\n// ============================================================================\n\n/**\n * Classify an error into a category\n */\nexport function classifyError(error: Error): ErrorCategory {\n  const message = error.message.toLowerCase();\n  const name = error.name.toLowerCase();\n\n  // Network errors\n  if (\n    message.includes('network') ||\n    message.includes('fetch') ||\n    message.includes('connection') ||\n    name === 'networkerror' ||\n    name === 'typeerror' // Often from failed fetch\n  ) {\n    return 'network';\n  }\n\n  // Authentication errors\n  if (\n    message.includes('unauthorized') ||\n    message.includes('authentication') ||\n    message.includes('login') ||\n    message.includes('401')\n  ) {\n    return 'auth';\n  }\n\n  // Permission errors\n  if (message.includes('forbidden') || message.includes('permission') || message.includes('403')) {\n    return 'permission';\n  }\n\n  // Not found errors\n  if (message.includes('not found') || message.includes('404')) {\n    return 'notFound';\n  }\n\n  // Timeout errors\n  if (message.includes('timeout') || message.includes('timed out')) {\n    return 'timeout';\n  }\n\n  // Server errors\n  if (\n    message.includes('server') ||\n    message.includes('500') ||\n    message.includes('502') ||\n    message.includes('503') ||\n    message.includes('504')\n  ) {\n    return 'server';\n  }\n\n  // Validation errors\n  if (message.includes('validation') || message.includes('invalid') || message.includes('400')) {\n    return 'validation';\n  }\n\n  return 'unknown';\n}\n\n/**\n * Get error severity\n */\nfunction getSeverity(category: ErrorCategory): ErrorSeverity {\n  switch (category) {\n    case 'validation':\n      return 'warning';\n    case 'network':\n    case 'timeout':\n      return 'error';\n    case 'auth':\n    case 'permission':\n      return 'error';\n    case 'server':\n    case 'critical':\n      return 'fatal';\n    default:\n      return 'error';\n  }\n}\n\nfunction getErrorSeverity(category: ErrorCategory): ErrorSeverity {\n  return getSeverity(category);\n}\n\n/**\n * Check if error is retryable\n */\nexport function isRetryable(category: ErrorCategory): boolean {\n  return ['network', 'timeout', 'server'].includes(category);\n}\n\n/**\n * Get user-friendly error message\n */\nexport function getUserMessage(category: ErrorCategory, error: Error): string {\n  switch (category) {\n    case 'network':\n      return 'Unable to connect to the server. Please check your internet connection and try again.';\n    case 'auth':\n      return 'Your session has expired. Please sign in again to continue.';\n    case 'permission':\n      return \"You don't have permission to perform this action. Please contact your administrator.\";\n    case 'notFound':\n      return 'The requested resource could not be found. It may have been moved or deleted.';\n    case 'timeout':\n      return 'The request took too long to complete. Please try again.';\n    case 'server':\n      return \"We're experiencing technical difficulties. Our team has been notified and is working on it.\";\n    case 'validation':\n      return error.message || 'Please check your input and try again.';\n    default:\n      return 'An unexpected error occurred. Please try again later.';\n  }\n}\n\n/**\n * Get recovery suggestions\n */\nexport function getRecoverySuggestions(category: ErrorCategory): string[] {\n  switch (category) {\n    case 'network':\n      return [\n        'Check your internet connection',\n        'Try refreshing the page',\n        'Disable VPN or proxy if enabled',\n      ];\n    case 'auth':\n      return ['Sign in again', 'Clear your browser cookies', 'Try a different browser'];\n    case 'permission':\n      return [\n        'Contact your administrator',\n        'Verify your account permissions',\n        'Try signing out and back in',\n      ];\n    case 'timeout':\n      return [\n        'Wait a moment and try again',\n        'Check if the server is responding',\n        'Try with a smaller request',\n      ];\n    case 'server':\n      return [\n        'Wait a few minutes and try again',\n        'Check our status page',\n        'Contact support if the issue persists',\n      ];\n    default:\n      return [\n        'Refresh the page',\n        'Clear your browser cache',\n        'Contact support if the issue persists',\n      ];\n  }\n}\n\n/**\n * Create error info from an error\n */\nexport function createErrorInfo(error: Error, categoryOverride?: ErrorCategory): ErrorInfo {\n  const category = categoryOverride || classifyError(error);\n\n  return {\n    error,\n    category,\n    severity: getErrorSeverity(category),\n    isRetryable: isRetryable(category),\n    userMessage: getUserMessage(category, error),\n    technicalMessage: error.message,\n    suggestions: getRecoverySuggestions(category),\n    timestamp: Date.now(),\n  };\n}\n\n// ============================================================================\n// Error Recovery Component\n// ============================================================================\n\n/**\n * Error recovery component with retry and navigation\n */\nexport function ErrorRecovery({\n  error,\n  category: categoryOverride,\n  message,\n  onRetry,\n  onReset,\n  onNavigate,\n  actions,\n  autoRetry = false,\n  autoRetryDelay = 5000,\n  maxAutoRetries = 3,\n  showTechnicalDetails = isDev(),\n  fallback,\n  children,\n  fullScreen = false,\n  compact = false,\n  className = '',\n}: ErrorRecoveryProps): React.ReactElement {\n  const [retryCount, setRetryCount] = useState(0);\n  const [isRetrying, setIsRetrying] = useState(false);\n  const [showDetails, setShowDetails] = useState(false);\n\n  // Create error info\n  const errorInfo = useMemo(\n    () => (error ? createErrorInfo(error, categoryOverride) : null),\n    [error, categoryOverride]\n  );\n\n  // Auto retry effect\n  useEffect(() => {\n    if (!error || !autoRetry || !errorInfo?.isRetryable || !onRetry) {\n      return;\n    }\n\n    if (retryCount >= maxAutoRetries) {\n      return;\n    }\n\n    const timer = setTimeout(\n      async () => {\n        setIsRetrying(true);\n        setRetryCount((c) => c + 1);\n        try {\n          await onRetry();\n        } catch {\n          // Retry failed, will be caught by next cycle\n        } finally {\n          setIsRetrying(false);\n        }\n      },\n      autoRetryDelay * Math.pow(2, retryCount)\n    );\n\n    return () => clearTimeout(timer);\n  }, [error, autoRetry, autoRetryDelay, maxAutoRetries, retryCount, errorInfo, onRetry]);\n\n  // Reset retry count when error changes\n  useEffect(() => {\n    setRetryCount(0);\n  }, [error]);\n\n  // Handle manual retry\n  const handleRetry = useCallback(async () => {\n    if (!onRetry) return;\n\n    setIsRetrying(true);\n    try {\n      await onRetry();\n    } finally {\n      setIsRetrying(false);\n    }\n  }, [onRetry]);\n\n  // No error, render children\n  if (!error) {\n    return <>{children}</>;\n  }\n\n  // Use custom fallback if provided\n  if (fallback) {\n    return <>{fallback}</>;\n  }\n\n  // Build default recovery actions\n  const defaultActions: RecoveryAction[] = [];\n\n  if (errorInfo?.isRetryable && onRetry) {\n    defaultActions.push({\n      id: 'retry',\n      label: isRetrying ? 'Retrying...' : 'Try Again',\n      action: handleRetry,\n      primary: true,\n    });\n  }\n\n  if (errorInfo?.category === 'auth' && onNavigate) {\n    defaultActions.push({\n      id: 'login',\n      label: 'Sign In',\n      action: () => onNavigate('/login'),\n      primary: true,\n    });\n  }\n\n  if (onNavigate) {\n    defaultActions.push({\n      id: 'home',\n      label: 'Go Home',\n      action: () => onNavigate('/'),\n    });\n  }\n\n  if (onReset) {\n    defaultActions.push({\n      id: 'dismiss',\n      label: 'Dismiss',\n      action: onReset,\n    });\n  }\n\n  const allActions = [...defaultActions, ...(actions || [])];\n\n  // Container classes\n  const containerClasses = [\n    'error-recovery',\n    fullScreen && 'error-recovery--fullscreen',\n    compact && 'error-recovery--compact',\n    `error-recovery--${errorInfo?.severity}`,\n    className,\n  ]\n    .filter(Boolean)\n    .join(' ');\n\n  return (\n    <div className={containerClasses} role=\"alert\">\n      {/* Icon */}\n      <div className=\"error-recovery__icon\">\n        <ErrorIcon severity={errorInfo?.severity || 'error'} />\n      </div>\n\n      {/* Content */}\n      <div className=\"error-recovery__content\">\n        <h2 className=\"error-recovery__title\">{getErrorTitle(errorInfo?.category || 'unknown')}</h2>\n\n        <p className=\"error-recovery__message\">{message || errorInfo?.userMessage}</p>\n\n        {/* Auto retry status */}\n        {autoRetry && errorInfo?.isRetryable && retryCount > 0 && (\n          <p className=\"error-recovery__retry-status\">\n            {retryCount >= maxAutoRetries\n              ? 'Automatic retry failed. Please try manually.'\n              : `Retrying automatically... (${retryCount}/${maxAutoRetries})`}\n          </p>\n        )}\n\n        {/* Suggestions */}\n        {!compact && errorInfo && errorInfo.suggestions.length > 0 && (\n          <div className=\"error-recovery__suggestions\">\n            <h3>Things you can try:</h3>\n            <ul>\n              {errorInfo.suggestions.map((suggestion, index) => (\n                <li key={index}>{suggestion}</li>\n              ))}\n            </ul>\n          </div>\n        )}\n\n        {/* Technical details */}\n        {showTechnicalDetails && (\n          <div className=\"error-recovery__technical\">\n            <button\n              type=\"button\"\n              onClick={() => setShowDetails(!showDetails)}\n              className=\"error-recovery__details-toggle\"\n            >\n              {showDetails ? 'Hide' : 'Show'} Technical Details\n            </button>\n            {showDetails && (\n              <pre className=\"error-recovery__details\">\n                {errorInfo?.technicalMessage}\n                {'\\n\\n'}\n                {error.stack}\n              </pre>\n            )}\n          </div>\n        )}\n      </div>\n\n      {/* Actions */}\n      {allActions.length > 0 && (\n        <div className=\"error-recovery__actions\">\n          {allActions.map((action) => (\n            <button\n              key={action.id}\n              type=\"button\"\n              onClick={async () => action.action()}\n              disabled={isRetrying && action.id === 'retry'}\n              className={[\n                'error-recovery__action',\n                action.primary && 'error-recovery__action--primary',\n                action.destructive && 'error-recovery__action--destructive',\n              ]\n                .filter(Boolean)\n                .join(' ')}\n            >\n              {action.label}\n            </button>\n          ))}\n        </div>\n      )}\n    </div>\n  );\n}\n\n// ============================================================================\n// Offline Recovery Component\n// ============================================================================\n\n/**\n * Offline detection and recovery component\n */\nexport function OfflineRecovery({\n  pendingActions,\n  lastSync,\n  onForceRetry,\n  children,\n  offlineMessage,\n}: OfflineRecoveryProps): React.ReactElement {\n  const [isOnline, setIsOnline] = useState(\n    typeof navigator !== 'undefined' ? navigator.onLine : true\n  );\n  const [showBanner, setShowBanner] = useState(false);\n\n  useEffect(() => {\n    const handleOnline = (): void => {\n      setIsOnline(true);\n      // Auto-hide banner after a moment\n      setTimeout(() => setShowBanner(false), 3000);\n    };\n\n    const handleOffline = (): void => {\n      setIsOnline(false);\n      setShowBanner(true);\n    };\n\n    window.addEventListener('online', handleOnline);\n    window.addEventListener('offline', handleOffline);\n\n    // Initial check\n    setIsOnline(navigator.onLine);\n    setShowBanner(!navigator.onLine);\n\n    return () => {\n      window.removeEventListener('online', handleOnline);\n      window.removeEventListener('offline', handleOffline);\n    };\n  }, []);\n\n  // Format last sync time\n  const lastSyncText = lastSync ? `Last synced ${formatTimeAgo(lastSync)}` : 'Not synced';\n\n  if (!showBanner) {\n    return <>{children}</>;\n  }\n\n  return (\n    <>\n      <div\n        className={`offline-banner ${isOnline ? 'offline-banner--online' : 'offline-banner--offline'}`}\n        role=\"status\"\n      >\n        <div className=\"offline-banner__content\">\n          <span className=\"offline-banner__icon\">\n            {isOnline ? <OnlineIcon /> : <OfflineIcon />}\n          </span>\n\n          <span className=\"offline-banner__message\">\n            {isOnline\n              ? 'Back online! Syncing your changes...'\n              : offlineMessage || \"You're offline. Some features may be unavailable.\"}\n          </span>\n\n          {!isOnline && pendingActions !== undefined && pendingActions > 0 && (\n            <span className=\"offline-banner__pending\">\n              {pendingActions} pending change{pendingActions > 1 ? 's' : ''}\n            </span>\n          )}\n\n          {!isOnline && lastSync && <span className=\"offline-banner__sync\">{lastSyncText}</span>}\n\n          {!isOnline && onForceRetry && (\n            <button type=\"button\" onClick={onForceRetry} className=\"offline-banner__retry\">\n              Retry\n            </button>\n          )}\n\n          <button\n            type=\"button\"\n            onClick={() => setShowBanner(false)}\n            className=\"offline-banner__close\"\n            aria-label=\"Dismiss\"\n          >\n            &times;\n          </button>\n        </div>\n      </div>\n      {children}\n    </>\n  );\n}\n\n// ============================================================================\n// Degraded State Component\n// ============================================================================\n\n/**\n * Degraded state indicator\n */\nexport function DegradedState({\n  unavailableFeatures,\n  reason,\n  estimatedRecoveryTime,\n  children,\n  onDismiss,\n}: DegradedStateProps): React.ReactElement {\n  const [dismissed, setDismissed] = useState(false);\n\n  const handleDismiss = useCallback(() => {\n    setDismissed(true);\n    onDismiss?.();\n  }, [onDismiss]);\n\n  if (dismissed || unavailableFeatures.length === 0) {\n    return <>{children}</>;\n  }\n\n  return (\n    <>\n      <div className=\"degraded-state\" role=\"status\">\n        <div className=\"degraded-state__content\">\n          <span className=\"degraded-state__icon\">\n            <WarningIcon />\n          </span>\n\n          <div className=\"degraded-state__info\">\n            <p className=\"degraded-state__message\">\n              Some features are temporarily unavailable: {unavailableFeatures.join(', ')}\n            </p>\n            <p className=\"degraded-state__reason\">{reason}</p>\n            {estimatedRecoveryTime && (\n              <p className=\"degraded-state__recovery\">\n                Estimated recovery: {estimatedRecoveryTime}\n              </p>\n            )}\n          </div>\n\n          <button\n            type=\"button\"\n            onClick={handleDismiss}\n            className=\"degraded-state__close\"\n            aria-label=\"Dismiss\"\n          >\n            &times;\n          </button>\n        </div>\n      </div>\n      {children}\n    </>\n  );\n}\n\n// ============================================================================\n// Helper Components\n// ============================================================================\n\nfunction ErrorIcon({ severity }: { severity: ErrorSeverity }): React.ReactElement {\n  const color = {\n    info: '#3b82f6',\n    warning: '#f59e0b',\n    error: '#ef4444',\n    fatal: '#dc2626',\n  }[severity];\n\n  return (\n    <svg\n      width=\"48\"\n      height=\"48\"\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      aria-hidden=\"true\"\n    >\n      <circle cx=\"12\" cy=\"12\" r=\"10\" stroke={color} strokeWidth=\"2\" />\n      <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\" stroke={color} strokeWidth=\"2\" strokeLinecap=\"round\" />\n      <circle cx=\"12\" cy=\"16\" r=\"1\" fill={color} />\n    </svg>\n  );\n}\n\nfunction OfflineIcon(): React.ReactElement {\n  return (\n    <svg\n      width=\"20\"\n      height=\"20\"\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      aria-hidden=\"true\"\n    >\n      <path\n        d=\"M1 1L23 23M16.72 11.06C18.29 12.02 19.5 13.54 20 15.34M5 12.55C7.06 10.13 10.36 9 13.84 9.44M8.53 16.11C10.19 14.72 12.5 14.22 14.68 14.88M12 20H12.01\"\n        stroke=\"currentColor\"\n        strokeWidth=\"2\"\n        strokeLinecap=\"round\"\n        strokeLinejoin=\"round\"\n      />\n    </svg>\n  );\n}\n\nfunction OnlineIcon(): React.ReactElement {\n  return (\n    <svg\n      width=\"20\"\n      height=\"20\"\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      aria-hidden=\"true\"\n    >\n      <path\n        d=\"M5 12.55C7.56 9.65 11.47 8.68 15.11 9.42M1.42 9C4.85 4.58 10.63 2.49 16.1 3.75M8.53 16.11C10.85 14.09 14.34 13.92 16.83 15.73M12 20H12.01M20.41 5C22.18 7.2 23.14 10 23 13\"\n        stroke=\"currentColor\"\n        strokeWidth=\"2\"\n        strokeLinecap=\"round\"\n        strokeLinejoin=\"round\"\n      />\n    </svg>\n  );\n}\n\nfunction WarningIcon(): React.ReactElement {\n  return (\n    <svg\n      width=\"20\"\n      height=\"20\"\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      aria-hidden=\"true\"\n    >\n      <path\n        d=\"M12 9V13M12 17H12.01M10.29 3.86L1.82 18C1.64 18.3 1.55 18.64 1.55 19C1.55 19.36 1.64 19.7 1.82 20C2 20.3 2.25 20.56 2.57 20.73C2.88 20.91 3.24 21 3.62 21H20.38C20.76 21 21.12 20.91 21.43 20.73C21.75 20.56 22 20.3 22.18 20C22.36 19.7 22.45 19.36 22.45 19C22.45 18.64 22.36 18.3 22.18 18L13.71 3.86C13.53 3.56 13.28 3.32 12.97 3.15C12.66 2.98 12.33 2.89 12 2.89C11.67 2.89 11.34 2.98 11.03 3.15C10.72 3.32 10.47 3.56 10.29 3.86Z\"\n        stroke=\"currentColor\"\n        strokeWidth=\"2\"\n        strokeLinecap=\"round\"\n        strokeLinejoin=\"round\"\n      />\n    </svg>\n  );\n}\n\n// ============================================================================\n// Utilities\n// ============================================================================\n\nfunction getErrorTitle(category: ErrorCategory): string {\n  switch (category) {\n    case 'network':\n      return 'Connection Error';\n    case 'auth':\n      return 'Authentication Required';\n    case 'permission':\n      return 'Access Denied';\n    case 'notFound':\n      return 'Not Found';\n    case 'timeout':\n      return 'Request Timeout';\n    case 'server':\n      return 'Server Error';\n    case 'validation':\n      return 'Invalid Input';\n    default:\n      return 'Something Went Wrong';\n  }\n}\n\nfunction formatTimeAgo(timestamp: number): string {\n  const seconds = Math.floor((Date.now() - timestamp) / 1000);\n\n  if (seconds < 60) return 'just now';\n  if (seconds < 3600) return `${Math.floor(seconds / 60)} minutes ago`;\n  if (seconds < 86400) return `${Math.floor(seconds / 3600)} hours ago`;\n  return `${Math.floor(seconds / 86400)} days ago`;\n}\n\n// ============================================================================\n// CSS Export\n// ============================================================================\n\nexport const errorRecoveryStyles = `\n  .error-recovery {\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n    justify-content: center;\n    padding: 2rem;\n    text-align: center;\n    gap: 1.5rem;\n  }\n\n  .error-recovery--fullscreen {\n    min-height: 100vh;\n    background: #f9fafb;\n  }\n\n  .error-recovery--compact {\n    padding: 1rem;\n    gap: 1rem;\n  }\n\n  .error-recovery__title {\n    margin: 0;\n    font-size: 1.5rem;\n    font-weight: 600;\n    color: #111827;\n  }\n\n  .error-recovery__message {\n    margin: 0;\n    color: #6b7280;\n    max-width: 400px;\n  }\n\n  .error-recovery__suggestions {\n    text-align: left;\n    background: #f3f4f6;\n    padding: 1rem;\n    border-radius: 8px;\n    max-width: 400px;\n  }\n\n  .error-recovery__suggestions h3 {\n    margin: 0 0 0.5rem;\n    font-size: 0.875rem;\n    font-weight: 600;\n  }\n\n  .error-recovery__suggestions ul {\n    margin: 0;\n    padding-left: 1.25rem;\n    color: #6b7280;\n    font-size: 0.875rem;\n  }\n\n  .error-recovery__actions {\n    display: flex;\n    gap: 0.75rem;\n    flex-wrap: wrap;\n    justify-content: center;\n  }\n\n  .error-recovery__action {\n    padding: 0.5rem 1rem;\n    border-radius: 6px;\n    border: 1px solid #d1d5db;\n    background: white;\n    color: #374151;\n    cursor: pointer;\n    font-size: 0.875rem;\n    transition: all 0.2s;\n  }\n\n  .error-recovery__action:hover {\n    background: #f9fafb;\n  }\n\n  .error-recovery__action--primary {\n    background: #3b82f6;\n    border-color: #3b82f6;\n    color: white;\n  }\n\n  .error-recovery__action--primary:hover {\n    background: #2563eb;\n  }\n\n  .error-recovery__action--destructive {\n    color: #ef4444;\n    border-color: #fca5a5;\n  }\n\n  .offline-banner {\n    position: fixed;\n    top: 0;\n    left: 0;\n    right: 0;\n    z-index: 9999;\n    padding: 0.75rem 1rem;\n  }\n\n  .offline-banner--offline {\n    background: #fef3c7;\n    color: #92400e;\n  }\n\n  .offline-banner--online {\n    background: #d1fae5;\n    color: #065f46;\n  }\n\n  .offline-banner__content {\n    display: flex;\n    align-items: center;\n    gap: 0.75rem;\n    max-width: 1200px;\n    margin: 0 auto;\n  }\n\n  .degraded-state {\n    background: #fef3c7;\n    border-bottom: 1px solid #fcd34d;\n    padding: 0.75rem 1rem;\n  }\n\n  .degraded-state__content {\n    display: flex;\n    align-items: center;\n    gap: 0.75rem;\n    max-width: 1200px;\n    margin: 0 auto;\n  }\n`;\n"],"names":["classifyError","error","message","name","getSeverity","category","getErrorSeverity","isRetryable","getUserMessage","getRecoverySuggestions","createErrorInfo","categoryOverride","ErrorRecovery","onRetry","onReset","onNavigate","actions","autoRetry","autoRetryDelay","maxAutoRetries","showTechnicalDetails","isDev","fallback","children","fullScreen","compact","className","retryCount","setRetryCount","useState","isRetrying","setIsRetrying","showDetails","setShowDetails","errorInfo","useMemo","useEffect","timer","c","handleRetry","useCallback","defaultActions","allActions","containerClasses","jsxs","jsx","ErrorIcon","suggestion","index","action","OfflineRecovery","pendingActions","lastSync","onForceRetry","offlineMessage","isOnline","setIsOnline","showBanner","setShowBanner","handleOnline","handleOffline","lastSyncText","formatTimeAgo","Fragment","OnlineIcon","OfflineIcon","DegradedState","unavailableFeatures","reason","estimatedRecoveryTime","onDismiss","dismissed","setDismissed","handleDismiss","WarningIcon","severity","color","getErrorTitle","timestamp","seconds","errorRecoveryStyles"],"mappings":"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"}