{"version":3,"sources":["../src/components/usage-banner.tsx"],"sourcesContent":["import {\n  Severity,\n  AiSDKError,\n  ErrorVisibility,\n  AiSDKErrorCode,\n} from \"@vn-sdk/shared\";\nimport React from \"react\";\n\ninterface UsageBannerProps {\n  severity?: Severity;\n  message?: string | React.ReactNode;\n  onClose?: () => void;\n  actions?: {\n    primary?: {\n      label: string;\n      onClick: () => void;\n    };\n    secondary?: {\n      label: string;\n      onClick: () => void;\n    };\n  };\n}\n\nexport function UsageBanner({\n  severity = Severity.CRITICAL,\n  message = \"\",\n  onClose,\n  actions,\n}: UsageBannerProps) {\n  if (!message || !severity) {\n    return null;\n  }\n\n  const themes = {\n    [Severity.INFO]: {\n      bg: \"#f8fafc\",\n      border: \"#e2e8f0\",\n      text: \"#475569\",\n      accent: \"#3b82f6\",\n    },\n    [Severity.WARNING]: {\n      bg: \"#fffbeb\",\n      border: \"#fbbf24\",\n      text: \"#92400e\",\n      accent: \"#f59e0b\",\n    },\n    [Severity.CRITICAL]: {\n      bg: \"#fef2f2\",\n      border: \"#fecaca\",\n      text: \"#dc2626\",\n      accent: \"#ef4444\",\n    },\n  };\n\n  const theme = themes[severity];\n\n  return (\n    <>\n      <style>\n        {`\n          @keyframes slideUp {\n            from { opacity: 0; transform: translateX(-50%) translateY(8px); }\n            to { opacity: 1; transform: translateX(-50%) translateY(0); }\n          }\n          \n          .usage-banner {\n            position: fixed;\n            bottom: 24px;\n            left: 50%;\n            transform: translateX(-50%);\n            width: min(600px, calc(100vw - 32px));\n            z-index: 10000;\n            animation: slideUp 0.2s cubic-bezier(0.16, 1, 0.3, 1);\n          }\n          \n          .banner-content {\n            background: linear-gradient(135deg, ${theme.bg} 0%, ${theme.bg}f5 100%);\n            border: 1px solid ${theme.border};\n            border-radius: 12px;\n            padding: 18px 20px;\n            box-shadow: \n              0 4px 24px rgba(0, 0, 0, 0.08),\n              0 2px 8px rgba(0, 0, 0, 0.04),\n              inset 0 1px 0 rgba(255, 255, 255, 0.7);\n            display: flex;\n            align-items: center;\n            gap: 16px;\n            font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif;\n            backdrop-filter: blur(12px);\n            position: relative;\n            overflow: hidden;\n          }\n          \n          .banner-content::before {\n            content: '';\n            position: absolute;\n            top: 0;\n            left: 0;\n            right: 0;\n            height: 1px;\n            background: linear-gradient(90deg, transparent, ${theme.accent}40, transparent);\n          }\n          \n          .banner-message {\n            color: ${theme.text};\n            font-size: 14px;\n            line-height: 1.5;\n            font-weight: 500;\n            flex: 1;\n            letter-spacing: -0.01em;\n          }\n          \n          .close-btn {\n            background: rgba(0, 0, 0, 0.05);\n            border: none;\n            color: ${theme.text};\n            cursor: pointer;\n            padding: 0;\n            border-radius: 6px;\n            opacity: 0.6;\n            transition: all 0.15s cubic-bezier(0.16, 1, 0.3, 1);\n            font-size: 14px;\n            line-height: 1;\n            flex-shrink: 0;\n            width: 24px;\n            height: 24px;\n            display: flex;\n            align-items: center;\n            justify-content: center;\n          }\n          \n          .close-btn:hover {\n            opacity: 1;\n            background: rgba(0, 0, 0, 0.08);\n            transform: scale(1.05);\n          }\n          \n          .btn-primary {\n            background: linear-gradient(135deg, ${theme.accent} 0%, ${theme.accent}e6 100%);\n            color: white;\n            border: none;\n            border-radius: 8px;\n            padding: 10px 18px;\n            font-size: 13px;\n            font-weight: 600;\n            cursor: pointer;\n            transition: all 0.15s cubic-bezier(0.16, 1, 0.3, 1);\n            font-family: inherit;\n            flex-shrink: 0;\n            box-shadow: \n              0 2px 8px ${theme.accent}30,\n              inset 0 1px 0 rgba(255, 255, 255, 0.2);\n            letter-spacing: -0.01em;\n          }\n          \n          .btn-primary:hover {\n            transform: translateY(-1px) scale(1.02);\n            box-shadow: \n              0 4px 12px ${theme.accent}40,\n              inset 0 1px 0 rgba(255, 255, 255, 0.25);\n          }\n          \n          .btn-primary:active {\n            transform: translateY(0) scale(0.98);\n            transition: all 0.08s cubic-bezier(0.16, 1, 0.3, 1);\n          }\n          \n          @media (max-width: 640px) {\n            .usage-banner {\n              width: calc(100vw - 24px);\n            }\n            \n            .banner-content {\n              padding: 16px;\n              gap: 12px;\n            }\n            \n            .banner-message {\n              font-size: 13px;\n              line-height: 1.45;\n            }\n            \n            .btn-primary {\n              padding: 8px 14px;\n              font-size: 12px;\n            }\n            \n            .close-btn {\n              width: 22px;\n              height: 22px;\n              font-size: 12px;\n            }\n          }\n        `}\n      </style>\n\n      <div className=\"usage-banner\">\n        <div className=\"banner-content\">\n          <div className=\"banner-message\">{message}</div>\n          {actions?.primary && (\n            <button className=\"btn-primary\" onClick={actions.primary.onClick}>\n              {actions.primary.label}\n            </button>\n          )}\n          {onClose && (\n            <button className=\"close-btn\" onClick={onClose} title=\"Close\">\n              ×\n            </button>\n          )}\n        </div>\n      </div>\n    </>\n  );\n}\n\n// Get action button based on error type\nexport const getErrorActions = (error: AiSDKError) => {\n  switch (error.code) {\n    case AiSDKErrorCode.MISSING_PUBLIC_API_KEY_ERROR:\n      return {\n        primary: {\n          label: \"Show me how\",\n          onClick: () =>\n            window.open(\n              \"https://docs.vn.ai/premium#how-do-i-get-access-to-premium-features\",\n              \"_blank\",\n              \"noopener,noreferrer\",\n            ),\n        },\n      };\n    case AiSDKErrorCode.UPGRADE_REQUIRED_ERROR:\n      return {\n        primary: {\n          label: \"Upgrade\",\n          onClick: () =>\n            window.open(\"https://cloud.vn.ai\", \"_blank\", \"noopener,noreferrer\"),\n        },\n      };\n    default:\n      return undefined;\n  }\n};\n\nexport function renderVnSDKUsage(error: AiSDKError, onClose?: () => void) {\n  // Route based on error visibility level\n  if (error.visibility !== ErrorVisibility.BANNER) {\n    return null;\n  }\n\n  return (\n    <UsageBanner\n      severity={error.severity || Severity.CRITICAL}\n      message={error.message}\n      onClose={onClose}\n      actions={getErrorActions(error)}\n    />\n  );\n}\n"],"mappings":"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","names":[]}