{"version":3,"file":"index.cjs","sources":["../../core/dist/index.js","../src/plugin/BlarioPlugin.ts","../src/composables/useBlario.ts","../src/composables/useBlarioUpload.ts","../src/lib/cn.ts","../src/components/IssueReporterButton.vue","../src/components/translations.ts","../src/components/ui/Dialog.vue","../src/components/ui/DialogContent.vue","../src/components/ui/DialogHeader.vue","../src/components/ui/DialogTitle.vue","../src/components/ui/DialogDescription.vue","../src/components/IssueReporterModal.vue","../src/components/BlarioProvider.vue","../src/components/TourProvider.vue","../src/components/ChatWidget.vue","../src/components/DiagnosticBanner.vue","../src/lib/variants.ts"],"sourcesContent":["// src/schemas.ts\nimport { z } from \"zod\";\nvar UserSchema = z.object({\n  id: z.string().optional(),\n  email: z.string().email().optional(),\n  name: z.string().optional()\n});\nvar ViewportSchema = z.object({\n  w: z.number(),\n  h: z.number()\n});\nvar MetaSchema = z.object({\n  url: z.string(),\n  route: z.string(),\n  ts: z.number(),\n  locale: z.string().optional(),\n  viewport: ViewportSchema,\n  ua: z.string().optional(),\n  appVersion: z.string().optional(),\n  release: z.string().optional(),\n  featureFlags: z.record(z.string(), z.boolean()).optional()\n});\nvar ConsoleLogSchema = z.object({\n  level: z.enum([\"error\", \"warn\", \"info\", \"log\"]),\n  message: z.string(),\n  ts: z.number(),\n  stack: z.string().optional()\n});\nvar NetworkLogSchema = z.object({\n  url: z.string(),\n  method: z.string(),\n  status: z.number(),\n  durationMs: z.number(),\n  ts: z.number()\n});\nvar FormDataSchema = z.object({\n  summary: z.string().min(1, \"Summary is required\"),\n  steps: z.string().optional(),\n  expected: z.string().optional(),\n  actual: z.string().optional(),\n  severity: z.enum([\"low\", \"medium\", \"high\", \"critical\"]).optional(),\n  category: z.string().optional()\n});\nvar ChatHistoryMessageSchema = z.object({\n  role: z.string().min(1, \"Role is required\"),\n  content: z.string().min(1, \"Message content is required\"),\n  timestamp: z.number().optional()\n});\nvar TriageRequestSchema = z.object({\n  messages: z.array(ChatHistoryMessageSchema).min(1)\n});\nvar TriageFormDataSchema = z.object({\n  summary: z.string().min(1).optional(),\n  description: z.string().optional(),\n  steps: z.string().optional(),\n  expected: z.string().optional(),\n  actual: z.string().optional(),\n  severity: z.string().optional(),\n  category: z.string().optional()\n});\nvar TriageSuggestedMetaSchema = z.object({\n  message_count: z.number().optional(),\n  triage_source: z.string().optional(),\n  confidence: z.string().optional()\n});\nvar TriageResponseSchema = z.object({\n  form_data: TriageFormDataSchema,\n  suggested_meta: TriageSuggestedMetaSchema.optional()\n});\nvar AttachmentSchema = z.object({\n  name: z.string(),\n  mime: z.string(),\n  dataUrl: z.string()\n});\nvar IssueReportPayloadSchema = z.object({\n  publishableKey: z.string(),\n  user: UserSchema.optional(),\n  meta: MetaSchema,\n  console: z.array(ConsoleLogSchema).optional(),\n  network: z.array(NetworkLogSchema).optional(),\n  custom: z.record(z.string(), z.unknown()).optional(),\n  form: FormDataSchema\n  // Attachments are NOT sent in JSON - they use signed URL uploads\n});\nvar DiagnosticSchema = z.object({\n  headline: z.string(),\n  probableCause: z.string().optional(),\n  suggestedFix: z.string().optional(),\n  relatedIssues: z.array(z.object({\n    id: z.string(),\n    title: z.string()\n  })).optional(),\n  tags: z.array(z.string()).optional()\n});\nvar DiagnosticResponseSchema = z.object({\n  issueId: z.string(),\n  status: z.enum([\"pending\", \"ready\", \"error\"]),\n  diagnostic: DiagnosticSchema.optional(),\n  error: z.string().optional()\n});\nvar ChatAttachmentSchema = z.object({\n  url: z.string(),\n  name: z.string(),\n  mime: z.string()\n});\nvar SupportChatMessageSchema = z.object({\n  id: z.string(),\n  type: z.enum([\"user\", \"agent\", \"system\"]),\n  content: z.string(),\n  timestamp: z.number(),\n  attachments: z.array(ChatAttachmentSchema).optional(),\n  agentId: z.string().optional(),\n  agentName: z.string().optional()\n});\nvar ChatSessionSchema = z.object({\n  sessionId: z.string(),\n  messages: z.array(SupportChatMessageSchema),\n  createdAt: z.number(),\n  updatedAt: z.number()\n});\nvar BlarioConfigSchema = z.object({\n  publishableKey: z.string(),\n  apiBaseUrl: z.string().default(\"https://api.blar.io\"),\n  user: UserSchema.optional(),\n  locale: z.enum([\"en\", \"es\"]).default(\"en\"),\n  capture: z.object({\n    console: z.boolean().default(true),\n    networkSample: z.boolean().default(false),\n    maxConsoleLogs: z.number().default(50),\n    maxNetworkLogs: z.number().default(20)\n  }).optional(),\n  theme: z.object({\n    mode: z.enum([\"light\", \"dark\"]).default(\"light\"),\n    position: z.enum([\"bottom-right\", \"bottom-left\", \"top-right\", \"top-left\"]).default(\"bottom-right\"),\n    accent: z.string().optional(),\n    className: z.string().optional()\n  }).optional(),\n  redaction: z.object({\n    patterns: z.array(z.instanceof(RegExp)).optional(),\n    // Using z.custom for Zod v3/v4 compatibility\n    customRedactor: z.custom((val) => typeof val === \"function\").optional()\n  }).optional(),\n  rateLimit: z.object({\n    maxRequests: z.number().default(10),\n    windowMs: z.number().default(6e4)\n  }).optional(),\n  // Using z.custom for Zod v3/v4 compatibility\n  onAfterSubmit: z.custom((val) => typeof val === \"function\").optional(),\n  onError: z.custom((val) => typeof val === \"function\").optional()\n});\n\n// src/managers/api.ts\nvar ApiError = class extends Error {\n  constructor(message, status, data) {\n    super(message);\n    this.status = status;\n    this.data = data;\n    this.name = \"ApiError\";\n  }\n};\nvar ApiClient = class {\n  constructor(config) {\n    this.config = {\n      maxRetries: 3,\n      retryDelayMs: 1e3,\n      timeoutMs: 3e4,\n      headers: {},\n      ...config\n    };\n  }\n  getConfig() {\n    return this.config;\n  }\n  async fetchWithRetry(url, options, retries = 0) {\n    try {\n      this.abortController = new AbortController();\n      const timeoutId = setTimeout(() => {\n        this.abortController?.abort();\n      }, this.config.timeoutMs);\n      const response = await fetch(url, {\n        ...options,\n        signal: this.abortController.signal,\n        headers: {\n          \"Content-Type\": \"application/json\",\n          \"X-Publishable-Key\": this.config.publishableKey,\n          ...this.config.headers,\n          ...options.headers\n        }\n      });\n      clearTimeout(timeoutId);\n      if (!response.ok && retries < this.config.maxRetries) {\n        const shouldRetry = response.status >= 500 || response.status === 429;\n        if (shouldRetry) {\n          const delay = this.config.retryDelayMs * Math.pow(2, retries);\n          await new Promise((resolve) => setTimeout(resolve, delay));\n          return this.fetchWithRetry(url, options, retries + 1);\n        }\n      }\n      return response;\n    } catch (error) {\n      if (error instanceof Error) {\n        if (error.name === \"AbortError\") {\n          throw new ApiError(\"Request timeout\");\n        }\n        if (retries < this.config.maxRetries) {\n          const delay = this.config.retryDelayMs * Math.pow(2, retries);\n          await new Promise((resolve) => setTimeout(resolve, delay));\n          return this.fetchWithRetry(url, options, retries + 1);\n        }\n      }\n      throw error;\n    }\n  }\n  async submitIssue(payload) {\n    const validation = IssueReportPayloadSchema.safeParse(payload);\n    if (!validation.success) {\n      throw new ApiError(\"Invalid payload\", 400, validation.error.errors);\n    }\n    const url = `${this.config.apiBaseUrl}/api/support/issue`;\n    try {\n      const response = await this.fetchWithRetry(url, {\n        method: \"POST\",\n        body: JSON.stringify(validation.data)\n      });\n      if (!response.ok) {\n        const errorData = await response.json().catch(() => null);\n        throw new ApiError(\n          errorData?.message ?? `Failed to submit issue: ${response.statusText}`,\n          response.status,\n          errorData\n        );\n      }\n      const data = await response.json();\n      if (!data.issueId) {\n        throw new ApiError(\"Invalid response: missing issueId\");\n      }\n      return { issueId: data.issueId };\n    } catch (error) {\n      if (error instanceof ApiError) {\n        throw error;\n      }\n      throw new ApiError(\n        error instanceof Error ? error.message : \"Failed to submit issue\"\n      );\n    }\n  }\n  async generateIssuePrefill(messages) {\n    const validation = TriageRequestSchema.safeParse({ messages });\n    if (!validation.success) {\n      throw new ApiError(\"Invalid chat history payload\", 400, validation.error.errors);\n    }\n    const url = `${this.config.apiBaseUrl}/api/support/triage`;\n    try {\n      const response = await this.fetchWithRetry(url, {\n        method: \"POST\",\n        body: JSON.stringify(validation.data)\n      });\n      if (!response.ok) {\n        const errorData = await response.json().catch(() => null);\n        throw new ApiError(\n          errorData?.message ?? `Failed to generate issue prefill: ${response.statusText}`,\n          response.status,\n          errorData\n        );\n      }\n      const data = await response.json();\n      const parsed = TriageResponseSchema.safeParse(data);\n      if (!parsed.success) {\n        throw new ApiError(\"Invalid response from triage endpoint\", response.status, parsed.error.errors);\n      }\n      return parsed.data;\n    } catch (error) {\n      if (error instanceof ApiError) {\n        throw error;\n      }\n      throw new ApiError(\n        error instanceof Error ? error.message : \"Failed to generate issue prefill\"\n      );\n    }\n  }\n  abort() {\n    this.abortController?.abort();\n  }\n};\nvar apiClientInstance = null;\nfunction getApiClient(config) {\n  if (!apiClientInstance) {\n    apiClientInstance = new ApiClient(config);\n  }\n  return apiClientInstance;\n}\nfunction resetApiClient() {\n  if (apiClientInstance) {\n    apiClientInstance.abort();\n    apiClientInstance = null;\n  }\n}\n\n// src/managers/storage.ts\nvar STORAGE_PREFIX = \"blario_\";\nvar DIAGNOSTICS_KEY = `${STORAGE_PREFIX}diagnostics`;\nvar CHAT_SESSION_KEY = `${STORAGE_PREFIX}chat_session`;\nvar CHAT_MESSAGES_KEY = `${STORAGE_PREFIX}chat_messages`;\nvar MAX_STORED_DIAGNOSTICS = 10;\nvar MAX_STORED_CHAT_MESSAGES = 100;\nvar StorageManager = class {\n  constructor() {\n    this.isAvailable = false;\n    this.isAvailable = this.checkStorageAvailability();\n  }\n  checkStorageAvailability() {\n    if (typeof window === \"undefined\") return false;\n    try {\n      const testKey = `${STORAGE_PREFIX}test`;\n      localStorage.setItem(testKey, \"test\");\n      localStorage.removeItem(testKey);\n      return true;\n    } catch {\n      console.warn(\"localStorage is not available\");\n      return false;\n    }\n  }\n  saveDiagnostic(diagnostic) {\n    if (!this.isAvailable) return;\n    try {\n      const stored = {\n        ...diagnostic,\n        timestamp: Date.now(),\n        viewed: false\n      };\n      const diagnostics = this.getAllDiagnostics();\n      diagnostics.unshift(stored);\n      if (diagnostics.length > MAX_STORED_DIAGNOSTICS) {\n        diagnostics.splice(MAX_STORED_DIAGNOSTICS);\n      }\n      localStorage.setItem(DIAGNOSTICS_KEY, JSON.stringify(diagnostics));\n    } catch (error) {\n      console.error(\"Failed to save diagnostic:\", error);\n    }\n  }\n  getAllDiagnostics() {\n    if (!this.isAvailable) return [];\n    try {\n      const data = localStorage.getItem(DIAGNOSTICS_KEY);\n      if (!data) return [];\n      const diagnostics = JSON.parse(data);\n      return Array.isArray(diagnostics) ? diagnostics : [];\n    } catch (error) {\n      console.error(\"Failed to retrieve diagnostics:\", error);\n      return [];\n    }\n  }\n  getLatestDiagnostic() {\n    const diagnostics = this.getAllDiagnostics();\n    return diagnostics[0] ?? null;\n  }\n  getUnviewedDiagnostics() {\n    return this.getAllDiagnostics().filter((d) => !d.viewed);\n  }\n  markDiagnosticAsViewed(issueId) {\n    if (!this.isAvailable) return;\n    try {\n      const diagnostics = this.getAllDiagnostics();\n      const updated = diagnostics.map(\n        (d) => d.issueId === issueId ? { ...d, viewed: true } : d\n      );\n      localStorage.setItem(DIAGNOSTICS_KEY, JSON.stringify(updated));\n    } catch (error) {\n      console.error(\"Failed to mark diagnostic as viewed:\", error);\n    }\n  }\n  clearDiagnostics() {\n    if (!this.isAvailable) return;\n    try {\n      localStorage.removeItem(DIAGNOSTICS_KEY);\n    } catch (error) {\n      console.error(\"Failed to clear diagnostics:\", error);\n    }\n  }\n  saveItem(key, value) {\n    if (!this.isAvailable) return;\n    try {\n      const storageKey = `${STORAGE_PREFIX}${key}`;\n      const data = JSON.stringify(value);\n      localStorage.setItem(storageKey, data);\n    } catch (error) {\n      console.error(`Failed to save ${key}:`, error);\n    }\n  }\n  getItem(key) {\n    if (!this.isAvailable) return null;\n    try {\n      const storageKey = `${STORAGE_PREFIX}${key}`;\n      const data = localStorage.getItem(storageKey);\n      return data ? JSON.parse(data) : null;\n    } catch (error) {\n      console.error(`Failed to retrieve ${key}:`, error);\n      return null;\n    }\n  }\n  removeItem(key) {\n    if (!this.isAvailable) return;\n    try {\n      const storageKey = `${STORAGE_PREFIX}${key}`;\n      localStorage.removeItem(storageKey);\n    } catch (error) {\n      console.error(`Failed to remove ${key}:`, error);\n    }\n  }\n  clearAll() {\n    if (!this.isAvailable) return;\n    try {\n      const keys = Object.keys(localStorage);\n      keys.forEach((key) => {\n        if (key.startsWith(STORAGE_PREFIX)) {\n          localStorage.removeItem(key);\n        }\n      });\n    } catch (error) {\n      console.error(\"Failed to clear all storage:\", error);\n    }\n  }\n  // Chat-related storage methods\n  saveChatSession(session) {\n    if (!this.isAvailable) return;\n    try {\n      localStorage.setItem(CHAT_SESSION_KEY, JSON.stringify(session));\n    } catch (error) {\n      console.error(\"Failed to save chat session:\", error);\n    }\n  }\n  getChatSession() {\n    if (!this.isAvailable) return null;\n    try {\n      const data = localStorage.getItem(CHAT_SESSION_KEY);\n      if (!data) return null;\n      return JSON.parse(data);\n    } catch (error) {\n      console.error(\"Failed to retrieve chat session:\", error);\n      return null;\n    }\n  }\n  saveChatMessages(messages) {\n    if (!this.isAvailable) return;\n    try {\n      const messagesToStore = messages.slice(-MAX_STORED_CHAT_MESSAGES);\n      localStorage.setItem(CHAT_MESSAGES_KEY, JSON.stringify(messagesToStore));\n    } catch (error) {\n      console.error(\"Failed to save chat messages:\", error);\n    }\n  }\n  getChatMessages() {\n    if (!this.isAvailable) return [];\n    try {\n      const data = localStorage.getItem(CHAT_MESSAGES_KEY);\n      if (!data) return [];\n      const messages = JSON.parse(data);\n      return Array.isArray(messages) ? messages : [];\n    } catch (error) {\n      console.error(\"Failed to retrieve chat messages:\", error);\n      return [];\n    }\n  }\n  addChatMessage(message) {\n    if (!this.isAvailable) return;\n    try {\n      const messages = this.getChatMessages();\n      messages.push(message);\n      const messagesToStore = messages.slice(-MAX_STORED_CHAT_MESSAGES);\n      localStorage.setItem(CHAT_MESSAGES_KEY, JSON.stringify(messagesToStore));\n    } catch (error) {\n      console.error(\"Failed to add chat message:\", error);\n    }\n  }\n  clearChatHistory() {\n    if (!this.isAvailable) return;\n    try {\n      localStorage.removeItem(CHAT_SESSION_KEY);\n      localStorage.removeItem(CHAT_MESSAGES_KEY);\n    } catch (error) {\n      console.error(\"Failed to clear chat history:\", error);\n    }\n  }\n};\nvar storageManagerInstance = null;\nfunction getStorageManager() {\n  if (!storageManagerInstance) {\n    storageManagerInstance = new StorageManager();\n  }\n  return storageManagerInstance;\n}\nfunction resetStorageManager() {\n  if (storageManagerInstance) {\n    storageManagerInstance.clearAll();\n    storageManagerInstance = null;\n  }\n}\n\n// src/managers/capture.ts\nvar RingBuffer = class {\n  constructor(maxSize) {\n    this.buffer = [];\n    this.maxSize = maxSize;\n  }\n  push(item) {\n    this.buffer.push(item);\n    if (this.buffer.length > this.maxSize) {\n      this.buffer.shift();\n    }\n  }\n  getAll() {\n    return [...this.buffer];\n  }\n  clear() {\n    this.buffer = [];\n  }\n};\nvar CaptureManager = class {\n  constructor(config = {}, metaProvider) {\n    this.originalConsole = {};\n    this.routeHistory = [];\n    this.isCapturing = false;\n    this.config = {\n      maxConsoleLogs: config.maxConsoleLogs ?? 50,\n      maxNetworkLogs: config.maxNetworkLogs ?? 20,\n      captureConsole: config.captureConsole ?? true,\n      captureNetwork: config.captureNetwork ?? false\n    };\n    this.consoleLogs = new RingBuffer(this.config.maxConsoleLogs);\n    this.networkLogs = new RingBuffer(this.config.maxNetworkLogs);\n    this.metaProvider = metaProvider;\n  }\n  startCapture() {\n    if (this.isCapturing) return;\n    this.isCapturing = true;\n    if (this.config.captureConsole) {\n      this.captureConsole();\n    }\n    if (this.config.captureNetwork) {\n      this.captureNetworkRequests();\n    }\n  }\n  stopCapture() {\n    if (!this.isCapturing) return;\n    this.isCapturing = false;\n    this.restoreConsole();\n  }\n  captureConsole() {\n    if (typeof window === \"undefined\") return;\n    const levels = [\"error\", \"warn\", \"info\", \"log\"];\n    levels.forEach((level) => {\n      this.originalConsole[level] = console[level];\n      console[level] = (...args) => {\n        const message = args.map((arg) => {\n          if (typeof arg === \"object\") {\n            try {\n              return JSON.stringify(arg, null, 2);\n            } catch {\n              return String(arg);\n            }\n          }\n          return String(arg);\n        }).join(\" \");\n        const log = {\n          level,\n          message: this.redactSensitiveData(message),\n          ts: Date.now()\n        };\n        if (level === \"error\" && args[0] instanceof Error) {\n          log.stack = args[0].stack;\n        }\n        this.consoleLogs.push(log);\n        this.originalConsole[level](...args);\n      };\n    });\n  }\n  restoreConsole() {\n    Object.keys(this.originalConsole).forEach((level) => {\n      console[level] = this.originalConsole[level];\n    });\n  }\n  captureNetworkRequests() {\n    if (typeof window === \"undefined\" || !window.fetch) return;\n    const originalFetch = window.fetch;\n    window.fetch = async (...args) => {\n      const startTime = Date.now();\n      const [input, init] = args;\n      const url = typeof input === \"string\" ? input : input instanceof URL ? input.href : input.url;\n      const method = init?.method ?? \"GET\";\n      try {\n        const response = await originalFetch(...args);\n        const log = {\n          url: this.redactSensitiveData(url),\n          method,\n          status: response.status,\n          durationMs: Date.now() - startTime,\n          ts: startTime\n        };\n        this.networkLogs.push(log);\n        return response;\n      } catch (error) {\n        const log = {\n          url: this.redactSensitiveData(url),\n          method,\n          status: 0,\n          durationMs: Date.now() - startTime,\n          ts: startTime\n        };\n        this.networkLogs.push(log);\n        throw error;\n      }\n    };\n  }\n  redactSensitiveData(text) {\n    const patterns = [\n      /\\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Z|a-z]{2,}\\b/g,\n      /\\b(?:\\d{4}[-\\s]?){3}\\d{4}\\b/g,\n      /\\b\\d{3}-\\d{2}-\\d{4}\\b/g,\n      /Bearer\\s+[A-Za-z0-9\\-._~+\\/]+=*/g,\n      /api[_-]?key[\"']?\\s*[:=]\\s*[\"']?[A-Za-z0-9\\-._~+\\/]+/gi,\n      /password[\"']?\\s*[:=]\\s*[\"']?[^\\s\"']+/gi,\n      /secret[\"']?\\s*[:=]\\s*[\"']?[^\\s\"']+/gi,\n      /token[\"']?\\s*[:=]\\s*[\"']?[A-Za-z0-9\\-._~+\\/]+/gi\n    ];\n    let redacted = text;\n    patterns.forEach((pattern) => {\n      redacted = redacted.replace(pattern, \"[REDACTED]\");\n    });\n    return redacted;\n  }\n  trackRoute(route) {\n    this.routeHistory.push(route);\n    if (this.routeHistory.length > 10) {\n      this.routeHistory.shift();\n    }\n  }\n  getCaptureMeta() {\n    if (typeof window === \"undefined\") {\n      return {\n        url: \"\",\n        route: \"\",\n        ts: Date.now(),\n        viewport: { w: 0, h: 0 }\n      };\n    }\n    const viewport = {\n      w: window.innerWidth ?? 0,\n      h: window.innerHeight ?? 0\n    };\n    return {\n      url: window.location.href,\n      route: this.routeHistory[this.routeHistory.length - 1] ?? window.location.pathname,\n      ts: Date.now(),\n      locale: navigator.language,\n      viewport,\n      ua: navigator.userAgent,\n      appVersion: this.metaProvider?.getAppVersion?.(),\n      release: this.metaProvider?.getRelease?.()\n    };\n  }\n  getConsoleLogs() {\n    return this.consoleLogs.getAll();\n  }\n  getNetworkLogs() {\n    return this.networkLogs.getAll();\n  }\n  getRouteHistory() {\n    return [...this.routeHistory];\n  }\n  clearAll() {\n    this.consoleLogs.clear();\n    this.networkLogs.clear();\n    this.routeHistory = [];\n  }\n};\nvar captureManagerInstance = null;\nfunction getCaptureManager(config, metaProvider) {\n  if (!captureManagerInstance) {\n    captureManagerInstance = new CaptureManager(config, metaProvider);\n  }\n  return captureManagerInstance;\n}\nfunction resetCaptureManager() {\n  if (captureManagerInstance) {\n    captureManagerInstance.stopCapture();\n    captureManagerInstance = null;\n  }\n}\n\n// src/managers/upload.ts\nvar UploadManager = class {\n  constructor(apiClient) {\n    this.MAX_FILES = 5;\n    this.MAX_IMAGE_SIZE = 5 * 1024 * 1024;\n    this.MAX_VIDEO_SIZE = 50 * 1024 * 1024;\n    this.ALLOWED_IMAGE_TYPES = [\n      \"image/png\",\n      \"image/jpeg\",\n      \"image/jpg\",\n      \"image/gif\",\n      \"image/webp\"\n    ];\n    this.ALLOWED_VIDEO_TYPES = [\n      \"video/mp4\",\n      \"video/webm\",\n      \"video/quicktime\",\n      \"video/x-msvideo\",\n      \"video/x-ms-wmv\"\n    ];\n    this.apiClient = apiClient;\n  }\n  async uploadFilesForIssue(files, issueId, onProgress) {\n    if (!files || files.length === 0) {\n      return [];\n    }\n    this.validateFiles(files);\n    onProgress?.(\"preparing\");\n    const uploadConfigs = await this.prepareUploads(files, issueId);\n    onProgress?.(\"uploading\", 0);\n    const uploadTokens = await this.performUploads(files, uploadConfigs);\n    onProgress?.(\"uploading\", 100);\n    onProgress?.(\"verifying\");\n    const verificationResult = await this.verifyAttachments(issueId, uploadTokens);\n    if (!verificationResult.success) {\n      throw new Error(\"Failed to verify attachments. Files may not be properly linked to the issue.\");\n    }\n    onProgress?.(\"complete\");\n    return uploadTokens;\n  }\n  async uploadFiles(files, onProgress) {\n    if (!files || files.length === 0) {\n      return [];\n    }\n    this.validateFiles(files);\n    onProgress?.(\"preparing\");\n    const uploadConfigs = await this.prepareUploads(files);\n    onProgress?.(\"uploading\", 0);\n    const uploadTokens = await this.performUploads(files, uploadConfigs);\n    onProgress?.(\"uploading\", 100);\n    onProgress?.(\"complete\");\n    return uploadTokens;\n  }\n  async prepareUploads(files, issueId) {\n    const fileMetadata = files.map((file) => ({\n      name: file.name,\n      type: file.type,\n      size: file.size\n    }));\n    const config = this.apiClient.getConfig();\n    const body = { files: fileMetadata };\n    if (issueId) {\n      body.issueId = issueId;\n    }\n    const response = await fetch(\n      `${config.apiBaseUrl}/api/support/attachments/prepare`,\n      {\n        method: \"POST\",\n        headers: {\n          \"Content-Type\": \"application/json\",\n          \"X-Publishable-Key\": config.publishableKey\n        },\n        body: JSON.stringify(body)\n      }\n    );\n    if (!response.ok) {\n      const error = await response.json().catch(() => ({ message: \"Failed to prepare uploads\" }));\n      throw new Error(error?.message || `Failed to prepare uploads: ${response.status}`);\n    }\n    const data = await response.json();\n    return data.uploads;\n  }\n  async performUploads(files, uploadConfigs) {\n    const uploadPromises = uploadConfigs.map(async (config, index) => {\n      const file = files[index];\n      if (!file) {\n        throw new Error(`File at index ${index} is missing`);\n      }\n      try {\n        const additionalHeaders = {};\n        if (config.max_size) {\n          additionalHeaders[\"x-goog-content-length-range\"] = `0,${config.max_size}`;\n        }\n        if (config.headers) {\n          Object.assign(additionalHeaders, config.headers);\n        }\n        const response = await this.uploadToGCS(config.upload_url, file, additionalHeaders);\n        if (!response.ok) {\n          throw new Error(`Upload failed with status ${response.status}`);\n        }\n        return config.upload_token;\n      } catch (error) {\n        throw new Error(`Failed to upload ${file.name}: ${error instanceof Error ? error.message : \"Unknown error\"}`);\n      }\n    });\n    return Promise.all(uploadPromises);\n  }\n  async uploadToGCS(uploadUrl, file, additionalHeaders) {\n    const headers = {\n      \"Content-Type\": file.type || \"application/octet-stream\"\n    };\n    if (additionalHeaders) {\n      Object.assign(headers, additionalHeaders);\n    }\n    return fetch(uploadUrl, {\n      method: \"PUT\",\n      headers,\n      body: file\n    });\n  }\n  async uploadWithProgress(uploadUrl, file, onProgress) {\n    return new Promise((resolve, reject) => {\n      const xhr = new XMLHttpRequest();\n      if (onProgress) {\n        xhr.upload.addEventListener(\"progress\", (event) => {\n          if (event.lengthComputable) {\n            const percentComplete = event.loaded / event.total * 100;\n            onProgress(percentComplete);\n          }\n        });\n      }\n      xhr.addEventListener(\"load\", () => {\n        if (xhr.status === 200 || xhr.status === 201) {\n          resolve();\n        } else {\n          reject(new Error(`Upload failed with status ${xhr.status}`));\n        }\n      });\n      xhr.addEventListener(\"error\", () => {\n        reject(new Error(\"Upload failed due to network error\"));\n      });\n      xhr.addEventListener(\"abort\", () => {\n        reject(new Error(\"Upload was cancelled\"));\n      });\n      xhr.open(\"PUT\", uploadUrl);\n      xhr.setRequestHeader(\"Content-Type\", file.type);\n      xhr.send(file);\n    });\n  }\n  async verifyAttachments(issueId, uploadTokens) {\n    const config = this.apiClient.getConfig();\n    const response = await fetch(\n      `${config.apiBaseUrl}/api/support/attachments/verify`,\n      {\n        method: \"POST\",\n        headers: {\n          \"Content-Type\": \"application/json\",\n          \"X-Publishable-Key\": config.publishableKey\n        },\n        body: JSON.stringify({\n          issue_id: issueId,\n          upload_tokens: uploadTokens\n        })\n      }\n    );\n    if (!response.ok) {\n      console.warn(\"Failed to verify some attachments\");\n      return { success: false, attachments: [] };\n    }\n    return response.json();\n  }\n  validateFiles(files) {\n    if (files.length > this.MAX_FILES) {\n      throw new Error(`Maximum ${this.MAX_FILES} files allowed`);\n    }\n    for (const file of files) {\n      const isImage = this.ALLOWED_IMAGE_TYPES.includes(file.type);\n      const isVideo = this.ALLOWED_VIDEO_TYPES.includes(file.type);\n      if (!isImage && !isVideo) {\n        throw new Error(\n          `File type ${file.type} is not allowed. Supported types: images (PNG, JPEG, GIF, WebP) and videos (MP4, WebM, MOV, AVI, WMV)`\n        );\n      }\n      const maxSize = isVideo ? this.MAX_VIDEO_SIZE : this.MAX_IMAGE_SIZE;\n      const maxSizeLabel = isVideo ? \"50MB\" : \"5MB\";\n      if (file.size > maxSize) {\n        throw new Error(`File \"${file.name}\" exceeds the ${maxSizeLabel} limit`);\n      }\n    }\n  }\n  async uploadWithRetry(uploadUrl, file, maxRetries = 3, additionalHeaders) {\n    let lastError = null;\n    for (let attempt = 0; attempt < maxRetries; attempt++) {\n      try {\n        const response = await this.uploadToGCS(uploadUrl, file, additionalHeaders);\n        if (response.ok) {\n          return response;\n        }\n        if (response.status === 401 || response.status === 403) {\n          throw new Error(`Upload authorization failed: ${response.status}`);\n        }\n        lastError = new Error(`Upload failed with status ${response.status}`);\n      } catch (error) {\n        lastError = error instanceof Error ? error : new Error(\"Upload failed\");\n        if (lastError.message.includes(\"authorization\")) {\n          throw lastError;\n        }\n      }\n      if (attempt < maxRetries - 1) {\n        const delay = Math.min(1e3 * Math.pow(2, attempt), 1e4);\n        await new Promise((resolve) => setTimeout(resolve, delay));\n      }\n    }\n    throw lastError || new Error(\"Upload failed after retries\");\n  }\n};\nvar uploadManagerInstance = null;\nfunction getUploadManager(apiClient) {\n  if (!uploadManagerInstance) {\n    uploadManagerInstance = new UploadManager(apiClient);\n  }\n  return uploadManagerInstance;\n}\nfunction resetUploadManager() {\n  uploadManagerInstance = null;\n}\n\n// src/managers/websocket.ts\nvar WebSocketManager = class {\n  constructor(config) {\n    this.ws = null;\n    this.reconnectAttempts = 0;\n    this.reconnectTimeout = null;\n    this.eventHandlers = /* @__PURE__ */ new Map();\n    this.messageQueue = [];\n    this.connectionState = \"disconnected\";\n    const chatRoomId = config.chatRoomId || this.generateUUID();\n    this.config = {\n      maxReconnectAttempts: 5,\n      reconnectDelayMs: 1e3,\n      heartbeatIntervalMs: 3e4,\n      baseUrl: config.baseUrl,\n      publishableKey: config.publishableKey,\n      chatRoomId,\n      userId: config.userId\n    };\n    this.eventHandlers.set(\"open\", /* @__PURE__ */ new Set());\n    this.eventHandlers.set(\"close\", /* @__PURE__ */ new Set());\n    this.eventHandlers.set(\"error\", /* @__PURE__ */ new Set());\n    this.eventHandlers.set(\"message\", /* @__PURE__ */ new Set());\n  }\n  generateUUID() {\n    return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (c) => {\n      const r = Math.random() * 16 | 0;\n      const v = c === \"x\" ? r : r & 3 | 8;\n      return v.toString(16);\n    });\n  }\n  /**\n   * Connect to WebSocket server\n   */\n  connect() {\n    if (this.ws && this.ws.readyState === WebSocket.OPEN) {\n      console.warn(\"WebSocket is already connected\");\n      return;\n    }\n    this.connectionState = this.reconnectAttempts > 0 ? \"reconnecting\" : \"connecting\";\n    this.notifyStateChange();\n    const baseUrl = this.config.baseUrl.replace(/^http/, \"ws\");\n    const wsUrl = `${baseUrl}/ws/support/chat/${this.config.chatRoomId}/?publishable_key=${this.config.publishableKey}`;\n    try {\n      this.ws = new WebSocket(wsUrl);\n      this.ws.onopen = this.handleOpen.bind(this);\n      this.ws.onclose = this.handleClose.bind(this);\n      this.ws.onerror = this.handleError.bind(this);\n      this.ws.onmessage = this.handleMessage.bind(this);\n    } catch (error) {\n      console.error(\"Failed to create WebSocket connection:\", error);\n      this.scheduleReconnect();\n    }\n  }\n  /**\n   * Disconnect from WebSocket server\n   */\n  disconnect() {\n    this.clearReconnectTimeout();\n    if (this.ws) {\n      this.ws.onclose = null;\n      this.ws.close();\n      this.ws = null;\n    }\n    this.connectionState = \"disconnected\";\n    this.notifyStateChange();\n  }\n  /**\n   * Send a message through WebSocket\n   */\n  sendMessage(message) {\n    if (this.ws && this.ws.readyState === WebSocket.OPEN) {\n      this.ws.send(JSON.stringify(message));\n    } else {\n      this.messageQueue.push(message);\n      console.warn(\"WebSocket not connected, message queued\");\n    }\n  }\n  /**\n   * Send text message\n   */\n  sendTextMessage(content) {\n    const message = {\n      type: \"chat_message\",\n      message: content\n    };\n    if (this.config.userId) {\n      message.user_id = this.config.userId;\n    }\n    this.sendMessage(message);\n  }\n  /**\n   * Subscribe to WebSocket events\n   */\n  on(event, handler) {\n    const handlers = this.eventHandlers.get(event);\n    if (handlers) {\n      handlers.add(handler);\n    }\n    return () => {\n      const handlers2 = this.eventHandlers.get(event);\n      if (handlers2) {\n        handlers2.delete(handler);\n      }\n    };\n  }\n  /**\n   * Get current connection state\n   */\n  getConnectionState() {\n    return this.connectionState;\n  }\n  /**\n   * Get chat room ID\n   */\n  getChatRoomId() {\n    return this.config.chatRoomId;\n  }\n  handleOpen(event) {\n    console.log(\"WebSocket connected\");\n    this.connectionState = \"connected\";\n    this.reconnectAttempts = 0;\n    this.notifyStateChange();\n    this.flushMessageQueue();\n    const handlers = this.eventHandlers.get(\"open\");\n    if (handlers) {\n      handlers.forEach((handler) => handler(event));\n    }\n  }\n  handleClose(event) {\n    console.log(\"WebSocket closed:\", event.code, event.reason);\n    const handlers = this.eventHandlers.get(\"close\");\n    if (handlers) {\n      handlers.forEach((handler) => handler(event));\n    }\n    if (!event.wasClean) {\n      this.scheduleReconnect();\n    } else {\n      this.connectionState = \"disconnected\";\n      this.notifyStateChange();\n    }\n  }\n  handleError(event) {\n    console.error(\"WebSocket error:\", event);\n    const handlers = this.eventHandlers.get(\"error\");\n    if (handlers) {\n      handlers.forEach((handler) => handler(event));\n    }\n  }\n  handleMessage(event) {\n    try {\n      const message = JSON.parse(event.data);\n      const handlers = this.eventHandlers.get(\"message\");\n      if (handlers) {\n        handlers.forEach((handler) => handler(message));\n      }\n    } catch (error) {\n      console.error(\"Failed to parse WebSocket message:\", error);\n    }\n  }\n  scheduleReconnect() {\n    if (this.reconnectAttempts >= this.config.maxReconnectAttempts) {\n      console.error(\"Max reconnect attempts reached\");\n      this.connectionState = \"failed\";\n      this.notifyStateChange();\n      return;\n    }\n    this.clearReconnectTimeout();\n    const delay = this.config.reconnectDelayMs * Math.pow(2, this.reconnectAttempts);\n    console.log(`Reconnecting in ${delay}ms (attempt ${this.reconnectAttempts + 1}/${this.config.maxReconnectAttempts})`);\n    this.reconnectTimeout = setTimeout(() => {\n      this.reconnectAttempts++;\n      this.connect();\n    }, delay);\n  }\n  clearReconnectTimeout() {\n    if (this.reconnectTimeout) {\n      clearTimeout(this.reconnectTimeout);\n      this.reconnectTimeout = null;\n    }\n  }\n  flushMessageQueue() {\n    while (this.messageQueue.length > 0) {\n      const message = this.messageQueue.shift();\n      if (message) {\n        this.sendMessage(message);\n      }\n    }\n  }\n  notifyStateChange() {\n  }\n};\nvar wsManagerInstance = null;\nfunction getWebSocketManager(config) {\n  if (!wsManagerInstance) {\n    wsManagerInstance = new WebSocketManager(config);\n  }\n  return wsManagerInstance;\n}\nfunction resetWebSocketManager() {\n  if (wsManagerInstance) {\n    wsManagerInstance.disconnect();\n    wsManagerInstance = null;\n  }\n}\nexport {\n  ApiClient,\n  ApiError,\n  AttachmentSchema,\n  BlarioConfigSchema,\n  CaptureManager,\n  ChatAttachmentSchema,\n  ChatHistoryMessageSchema,\n  ChatSessionSchema,\n  ConsoleLogSchema,\n  DiagnosticResponseSchema,\n  DiagnosticSchema,\n  FormDataSchema,\n  IssueReportPayloadSchema,\n  MetaSchema,\n  NetworkLogSchema,\n  SupportChatMessageSchema,\n  TriageFormDataSchema,\n  TriageRequestSchema,\n  TriageResponseSchema,\n  TriageSuggestedMetaSchema,\n  UploadManager,\n  UserSchema,\n  ViewportSchema,\n  WebSocketManager,\n  getApiClient,\n  getCaptureManager,\n  getStorageManager,\n  getUploadManager,\n  getWebSocketManager,\n  resetApiClient,\n  resetCaptureManager,\n  resetStorageManager,\n  resetUploadManager,\n  resetWebSocketManager\n};\n//# sourceMappingURL=index.js.map","import type { App, Plugin, InjectionKey } from 'vue';\nimport type { Router } from 'vue-router';\nimport { reactive, readonly } from 'vue';\nimport type { BlarioConfig, DiagnosticResponse, User } from '@blario/core';\nimport {\n  getCaptureManager,\n  resetCaptureManager,\n  getStorageManager,\n  resetStorageManager,\n  getApiClient,\n  resetApiClient,\n} from '@blario/core';\n\nexport interface BlarioPluginOptions {\n  publishableKey: string;\n  apiBaseUrl?: string;\n  user?: User;\n  locale?: 'en' | 'es';\n  capture?: {\n    console?: boolean;\n    networkSample?: boolean;\n    maxConsoleLogs?: number;\n    maxNetworkLogs?: number;\n  };\n  theme?: {\n    mode?: 'light' | 'dark';\n    position?: 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left';\n    accent?: string;\n    className?: string;\n  };\n  redaction?: {\n    patterns?: RegExp[];\n    customRedactor?: (text: string) => string;\n  };\n  rateLimit?: {\n    maxRequests?: number;\n    windowMs?: number;\n  };\n  onAfterSubmit?: (issueId: string) => void;\n  onError?: (error: Error) => void;\n}\n\nexport interface BlarioState {\n  config: BlarioConfig;\n  isModalOpen: boolean;\n  reporterOptions: { category?: string; prefill?: Record<string, any> };\n  lastDiagnostic: DiagnosticResponse | null;\n  isSubmitting: boolean;\n  user?: User;\n  locale: 'en' | 'es';\n}\n\nexport interface BlarioActions {\n  openReporter: (options?: { category?: string; prefill?: Record<string, any> }) => void;\n  closeReporter: () => void;\n  submitIssue: (formData: any) => Promise<DiagnosticResponse | null>;\n  clearDiagnostic: () => void;\n}\n\nexport type BlarioContext = {\n  state: Readonly<BlarioState>;\n  actions: BlarioActions;\n};\n\nexport const BlarioKey: InjectionKey<BlarioContext> = Symbol('blario');\n\nexport const BlarioPlugin: Plugin<BlarioPluginOptions> = {\n  install(app: App, options: BlarioPluginOptions) {\n    const {\n      publishableKey,\n      apiBaseUrl = 'https://api.blar.io',\n      user,\n      locale = 'en',\n      capture = {},\n      theme = {},\n      redaction = {},\n      rateLimit = {},\n      onAfterSubmit,\n      onError,\n    } = options;\n\n    // Initialize managers\n    const captureManager = getCaptureManager(\n      {\n        maxConsoleLogs: capture.maxConsoleLogs ?? 50,\n        maxNetworkLogs: capture.maxNetworkLogs ?? 20,\n        captureConsole: capture.console ?? true,\n        captureNetwork: capture.networkSample ?? false,\n      },\n      {\n        getAppVersion: () => import.meta.env.VITE_APP_VERSION,\n        getRelease: () => import.meta.env.VITE_RELEASE,\n      }\n    );\n\n    const storageManager = getStorageManager();\n    const apiClient = getApiClient({\n      apiBaseUrl,\n      publishableKey,\n    });\n\n    const rateLimitState = {\n      requests: [] as number[],\n      maxRequests: rateLimit.maxRequests ?? 10,\n      windowMs: rateLimit.windowMs ?? 60000,\n    };\n\n    // Reactive state\n    const state = reactive<BlarioState>({\n      config: {\n        publishableKey,\n        apiBaseUrl,\n        user,\n        locale,\n        capture: {\n          console: capture.console ?? true,\n          networkSample: capture.networkSample ?? false,\n          maxConsoleLogs: capture.maxConsoleLogs ?? 50,\n          maxNetworkLogs: capture.maxNetworkLogs ?? 20,\n        },\n        theme: {\n          mode: theme.mode ?? 'light',\n          position: theme.position ?? 'bottom-right',\n          accent: theme.accent,\n          className: theme.className,\n        },\n        redaction,\n        rateLimit: {\n          maxRequests: rateLimit.maxRequests ?? 10,\n          windowMs: rateLimit.windowMs ?? 60000,\n        },\n        onAfterSubmit,\n        onError,\n      },\n      isModalOpen: false,\n      reporterOptions: {},\n      lastDiagnostic: null,\n      isSubmitting: false,\n      user,\n      locale,\n    });\n\n    // Start capture\n    captureManager.startCapture();\n\n    // Load latest diagnostic from storage\n    const latestDiagnostic = storageManager.getLatestDiagnostic();\n    if (latestDiagnostic && !latestDiagnostic.viewed) {\n      state.lastDiagnostic = latestDiagnostic;\n    }\n\n    // Apply dark mode\n    if (typeof window !== 'undefined') {\n      const root = document.documentElement;\n      if (theme.mode === 'dark') {\n        root.classList.add('dark');\n      } else {\n        root.classList.remove('dark');\n      }\n    }\n\n    const checkRateLimit = (): boolean => {\n      const now = Date.now();\n      const { requests, maxRequests, windowMs } = rateLimitState;\n\n      const validRequests = requests.filter(time => now - time < windowMs);\n      rateLimitState.requests = validRequests;\n\n      if (validRequests.length >= maxRequests) {\n        return false;\n      }\n\n      rateLimitState.requests.push(now);\n      return true;\n    };\n\n    // Actions\n    const actions: BlarioActions = {\n      openReporter(opts = {}) {\n        state.reporterOptions = opts;\n        state.isModalOpen = true;\n      },\n\n      closeReporter() {\n        state.isModalOpen = false;\n        state.reporterOptions = {};\n      },\n\n      async submitIssue(formData: any): Promise<DiagnosticResponse | null> {\n        if (!checkRateLimit()) {\n          const error = new Error('Rate limit exceeded. Please try again later.');\n          onError?.(error);\n          throw error;\n        }\n\n        state.isSubmitting = true;\n\n        try {\n          const { attachments, ...formFields } = formData;\n\n          const payload = {\n            publishableKey,\n            user,\n            meta: captureManager.getCaptureMeta(),\n            console: capture.console !== false ? captureManager.getConsoleLogs() : undefined,\n            network: capture.networkSample ? captureManager.getNetworkLogs() : undefined,\n            form: formFields,\n          };\n\n          const { issueId } = await apiClient.submitIssue(payload);\n\n          onAfterSubmit?.(issueId);\n\n          return { issueId, status: 'pending' as const, diagnostic: undefined };\n        } catch (error) {\n          const err = error instanceof Error ? error : new Error('Failed to submit issue');\n          onError?.(err);\n          throw err;\n        } finally {\n          state.isSubmitting = false;\n        }\n      },\n\n      clearDiagnostic() {\n        if (state.lastDiagnostic?.issueId) {\n          storageManager.markDiagnosticAsViewed(state.lastDiagnostic.issueId);\n        }\n        state.lastDiagnostic = null;\n      },\n    };\n\n    // Provide context\n    const context: BlarioContext = {\n      state: readonly(state) as Readonly<BlarioState>,\n      actions,\n    };\n\n    app.provide(BlarioKey, context);\n\n    // Cleanup on unmount\n    app.config.globalProperties.$blario = context;\n\n    // Optional: Integrate with Vue Router for route tracking\n    const router = app.config.globalProperties.$router as Router | undefined;\n    if (router) {\n      router.afterEach((to) => {\n        captureManager.trackRoute(to.fullPath);\n      });\n    }\n\n    // Cleanup function (called when app is unmounted)\n    const cleanup = () => {\n      captureManager.stopCapture();\n      resetCaptureManager();\n      resetStorageManager();\n      resetApiClient();\n    };\n\n    // Store cleanup for potential use\n    (app.config.globalProperties as any).__blarioCleanup = cleanup;\n  },\n};\n\ndeclare module '@vue/runtime-core' {\n  interface ComponentCustomProperties {\n    $blario: BlarioContext;\n  }\n}\n","import { inject } from 'vue';\nimport { BlarioKey } from '../plugin/BlarioPlugin';\nimport type { DiagnosticResponse, FormData } from '@blario/core';\n\nexport interface UseBlarioReturn {\n  openReporter: (options?: { category?: string; prefill?: Record<string, any> }) => void;\n  closeReporter: () => void;\n  reportIssue: (formData: FormData, attachments?: File[]) => Promise<DiagnosticResponse | null>;\n  lastDiagnostic: DiagnosticResponse | null;\n  clearDiagnostic: () => void;\n  isModalOpen: boolean;\n  isSubmitting: boolean;\n}\n\nexport function useBlario(): UseBlarioReturn {\n  const blario = inject(BlarioKey);\n\n  if (!blario) {\n    throw new Error('useBlario must be used within a Vue app that has installed BlarioPlugin');\n  }\n\n  const { state, actions } = blario;\n\n  const reportIssue = async (\n    formData: FormData,\n    attachments?: File[]\n  ): Promise<DiagnosticResponse | null> => {\n    // Note: This composable maintains backward compatibility with base64 uploads\n    // For signed URL uploads, use useBlarioUpload composable instead\n\n    // For now, just submit without attachments in the JSON\n    // Attachments should be uploaded separately via signed URLs\n    if (attachments && attachments.length > 0) {\n      console.warn(\n        'Attachments detected but not uploaded. Use useBlarioUpload() composable for file uploads via signed URLs.'\n      );\n    }\n\n    return actions.submitIssue(formData);\n  };\n\n  return {\n    openReporter: actions.openReporter,\n    closeReporter: actions.closeReporter,\n    reportIssue,\n    get lastDiagnostic() {\n      return state.lastDiagnostic;\n    },\n    clearDiagnostic: actions.clearDiagnostic,\n    get isModalOpen() {\n      return state.isModalOpen;\n    },\n    get isSubmitting() {\n      return state.isSubmitting;\n    },\n  };\n}\n","import { ref, inject } from 'vue';\nimport { BlarioKey } from '../plugin/BlarioPlugin';\nimport { getUploadManager, getApiClient } from '@blario/core';\nimport type { DiagnosticResponse, FormData } from '@blario/core';\n\nexport interface UploadProgress {\n  fileName: string;\n  percent: number;\n  status: 'pending' | 'uploading' | 'verifying' | 'completed' | 'error';\n}\n\nexport interface UseBlarioUploadReturn {\n  uploadFiles: (files: File[]) => Promise<string[]>;\n  submitIssueWithUploads: (formData: FormData, files: File[]) => Promise<DiagnosticResponse | null>;\n  uploadProgress: UploadProgress[];\n  isUploading: boolean;\n  uploadError: string | null;\n  clearUploadError: () => void;\n}\n\n/**\n * Composable for advanced file upload functionality using signed URLs\n */\nexport function useBlarioUpload(): UseBlarioUploadReturn {\n  const blario = inject(BlarioKey);\n\n  if (!blario) {\n    throw new Error('useBlarioUpload must be used within a Vue app that has installed BlarioPlugin');\n  }\n\n  const { state, actions } = blario;\n\n  const uploadProgress = ref<UploadProgress[]>([]);\n  const isUploading = ref(false);\n  const uploadError = ref<string | null>(null);\n\n  // This method is kept for standalone uploads but is not used in the normal flow\n  const uploadFiles = async (files: File[]): Promise<string[]> => {\n    isUploading.value = true;\n    uploadError.value = null;\n    uploadProgress.value = files.map(f => ({\n      fileName: f.name,\n      percent: 0,\n      status: 'pending' as const,\n    }));\n\n    try {\n      // Validate files first\n      const MAX_FILES = 5;\n      const MAX_IMAGE_SIZE = 5 * 1024 * 1024;\n      const MAX_VIDEO_SIZE = 50 * 1024 * 1024;\n\n      if (files.length > MAX_FILES) {\n        throw new Error(`Maximum ${MAX_FILES} files allowed`);\n      }\n\n      for (const file of files) {\n        const isVideo = file.type.startsWith('video/');\n        const maxSize = isVideo ? MAX_VIDEO_SIZE : MAX_IMAGE_SIZE;\n        const sizeLabel = isVideo ? '50MB' : '5MB';\n\n        if (file.size > maxSize) {\n          throw new Error(`File \"${file.name}\" exceeds the ${sizeLabel} limit`);\n        }\n      }\n\n      // Note: This uses the deprecated method without issue ID\n      // For proper upload with verification, use submitIssueWithUploads\n      throw new Error('Direct upload without issue ID is not supported. Please use submitIssueWithUploads.');\n\n    } catch (error) {\n      const errorMessage = error instanceof Error ? error.message : 'Upload failed';\n      uploadError.value = errorMessage;\n\n      // Update progress to error\n      uploadProgress.value = uploadProgress.value.map(p => ({\n        ...p,\n        status: 'error' as const,\n      }));\n\n      throw error;\n    } finally {\n      isUploading.value = false;\n    }\n  };\n\n  const submitIssueWithUploads = async (\n    formData: FormData,\n    files: File[]\n  ): Promise<DiagnosticResponse | null> => {\n    let result: DiagnosticResponse | null = null;\n\n    try {\n      // Step 1: Create the issue first\n      result = await actions.submitIssue(formData);\n      console.log('Issue created:', result);\n\n      // Steps 2-4: Upload and verify attachments if we have files and issue ID\n      if (result?.issueId && files && files.length > 0) {\n        console.log('Starting file upload for issue:', result.issueId, 'Files:', files.length);\n        isUploading.value = true;\n        uploadError.value = null;\n        uploadProgress.value = files.map(f => ({\n          fileName: f.name,\n          percent: 0,\n          status: 'pending' as const,\n        }));\n\n        try {\n          const apiClient = getApiClient(state.config);\n          const uploadManager = getUploadManager(apiClient);\n\n          // Upload files with complete 3-step process (prepare, upload, verify)\n          // This will wait for the entire upload process to complete\n          await uploadManager.uploadFilesForIssue(files, result.issueId, (step, percent) => {\n            let status: UploadProgress['status'] = 'pending';\n            let progressPercent = 0;\n\n            switch (step) {\n              case 'preparing':\n                status = 'uploading';\n                progressPercent = 10;\n                break;\n              case 'uploading':\n                status = 'uploading';\n                progressPercent = percent ? 10 + (percent * 0.7) : 10; // 10-80%\n                break;\n              case 'verifying':\n                status = 'verifying';\n                progressPercent = 90;\n                break;\n              case 'complete':\n                status = 'completed';\n                progressPercent = 100;\n                break;\n            }\n\n            uploadProgress.value = uploadProgress.value.map(p => ({\n              ...p,\n              status,\n              percent: progressPercent,\n            }));\n          });\n\n          // Upload completed successfully\n        } catch (uploadErr) {\n          // Issue was created but uploads failed\n          console.error('Failed to upload attachments:', uploadErr);\n          uploadError.value = uploadErr instanceof Error ? uploadErr.message : 'Failed to upload files';\n          // Still return the result since issue was created\n        } finally {\n          isUploading.value = false;\n        }\n      }\n\n      return result;\n    } catch (error) {\n      // Issue creation failed\n      const errorMessage = error instanceof Error ? error.message : 'Failed to submit issue';\n      uploadError.value = errorMessage;\n      isUploading.value = false;\n      throw error;\n    }\n  };\n\n  const clearUploadError = () => {\n    uploadError.value = null;\n  };\n\n  return {\n    uploadFiles,\n    submitIssueWithUploads,\n    get uploadProgress() {\n      return uploadProgress.value;\n    },\n    get isUploading() {\n      return isUploading.value;\n    },\n    get uploadError() {\n      return uploadError.value;\n    },\n    clearUploadError,\n  };\n}\n","import { clsx, type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n  return twMerge(clsx(inputs));\n}","<template>\n  <button\n    v-if=\"unstyled\"\n    :class=\"unstyledClasses\"\n    :aria-label=\"ariaLabel\"\n    data-tour-id=\"issue-reporter-button\"\n    @click=\"handleClick\"\n  >\n    <slot>\n      <Bug v-if=\"!hideIcon\" :class=\"iconClass\" />\n      <span v-if=\"!hideText\" :class=\"textClassName\">{{ children || DEFAULT_TEXT }}</span>\n    </slot>\n  </button>\n\n  <button\n    v-else-if=\"variant === 'inline'\"\n    :class=\"inlineClasses\"\n    :aria-label=\"ariaLabel\"\n    data-tour-id=\"issue-reporter-button\"\n    @click=\"handleClick\"\n  >\n    <slot>\n      <Bug v-if=\"!hideIcon\" :class=\"iconClass\" />\n      <span v-if=\"!hideText\" :class=\"textClassName\">{{ children || DEFAULT_TEXT }}</span>\n    </slot>\n  </button>\n\n  <button\n    v-else\n    :class=\"floatingClasses\"\n    :aria-label=\"ariaLabel\"\n    data-tour-id=\"issue-reporter-button\"\n    @click=\"handleClick\"\n  >\n    <slot>\n      <Bug v-if=\"!hideIcon\" :class=\"iconClass\" />\n      <span v-if=\"!hideText && !defaultHideText\" :class=\"textClassName\">{{ children || DEFAULT_TEXT }}</span>\n    </slot>\n  </button>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, inject } from 'vue';\nimport { Bug } from 'lucide-vue-next';\nimport { useBlario } from '../composables/useBlario';\nimport { BlarioKey } from '../plugin/BlarioPlugin';\nimport { cn } from '../lib/cn';\n\n// Types\nexport type ButtonVariant = 'default' | 'destructive' | 'outline' | 'secondary' | 'ghost' | 'link';\nexport type ButtonSize = 'default' | 'sm' | 'lg' | 'icon';\nexport type ButtonPosition = 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left';\nexport type ButtonDisplayVariant = 'floating' | 'inline';\n\nexport interface IssueReporterButtonProps {\n  variant?: ButtonDisplayVariant;\n  position?: ButtonPosition;\n  unstyled?: boolean;\n  className?: string;\n  buttonVariant?: ButtonVariant;\n  buttonSize?: ButtonSize;\n  children?: string;\n  icon?: any;\n  iconClassName?: string;\n  textClassName?: string;\n  hideIcon?: boolean;\n  hideText?: boolean;\n  category?: string;\n  prefill?: Record<string, any>;\n  ariaLabel?: string;\n}\n\nconst props = withDefaults(defineProps<IssueReporterButtonProps>(), {\n  variant: 'floating',\n  unstyled: false,\n  hideIcon: false,\n  hideText: false,\n  ariaLabel: 'Report an issue',\n});\n\n// Constants\nconst POSITION_CLASSES: Record<ButtonPosition, string> = {\n  'bottom-right': 'bottom-4 right-4',\n  'bottom-left': 'bottom-4 left-4',\n  'top-right': 'top-4 right-4',\n  'top-left': 'top-4 left-4',\n};\n\nconst DEFAULT_FLOATING_CLASSES = 'fixed z-50 h-14 w-14 rounded-full shadow-lg hover:shadow-xl transition-all';\nconst DEFAULT_ICON_SIZE = 'h-6 w-6';\nconst DEFAULT_TEXT = 'Report Issue';\n\nconst { openReporter } = useBlario();\nconst blario = inject(BlarioKey);\n\nconst finalPosition = computed(() =>\n  props.position ?? blario?.state.config.theme?.position ?? 'bottom-right'\n);\n\nconst defaultHideText = computed(() =>\n  props.variant === 'floating' && props.hideText === undefined\n);\n\nconst iconClass = computed(() =>\n  props.iconClassName || DEFAULT_ICON_SIZE\n);\n\nconst unstyledClasses = computed(() =>\n  cn(\n    props.variant === 'floating' ? `fixed z-50 ${POSITION_CLASSES[finalPosition.value]}` : undefined,\n    props.className\n  )\n);\n\nconst inlineClasses = computed(() =>\n  cn('blario-button-inline', props.className)\n);\n\nconst floatingClasses = computed(() =>\n  cn(\n    DEFAULT_FLOATING_CLASSES,\n    POSITION_CLASSES[finalPosition.value],\n    blario?.state.config.theme?.accent && `bg-[${blario.state.config.theme.accent}]`,\n    props.className\n  )\n);\n\nconst handleClick = () => {\n  openReporter({\n    category: props.category,\n    prefill: props.prefill\n  });\n};\n</script>\n","// Translations for the Issue Reporter Modal\n\n// Define the translation structure without 'as const' to allow flexibility\nexport interface Translation {\n  title: string;\n  description: string;\n  summary: string;\n  summaryPlaceholder: string;\n  steps: string;\n  stepsPlaceholder: string;\n  expected: string;\n  expectedPlaceholder: string;\n  actual: string;\n  actualPlaceholder: string;\n  severity: string;\n  severityPlaceholder: string;\n  severityLow: string;\n  severityMedium: string;\n  severityHigh: string;\n  severityCritical: string;\n  category: string;\n  categoryPlaceholder: string;\n  attachments: string;\n  dragDrop: string;\n  fileSupport: string;\n  chooseFiles: string;\n  uploadedFiles: string;\n  verifying: string;\n  verified: string;\n  cancel: string;\n  submit: string;\n  creatingIssue: string;\n  verifyingAttachments: string;\n  uploadingFiles: string;\n  preparingUpload: string;\n  required: string;\n}\n\nconst en: Translation = {\n  title: 'Report an Issue',\n  description: 'Help us improve by reporting any issues you encounter',\n  summary: 'Summary',\n  summaryPlaceholder: 'Brief description of the issue',\n  steps: 'Steps to Reproduce',\n  stepsPlaceholder: '1. Go to...\\n2. Click on...\\n3. See error',\n  expected: 'Expected Behavior',\n  expectedPlaceholder: 'What should happen?',\n  actual: 'Actual Behavior',\n  actualPlaceholder: 'What actually happened?',\n  severity: 'Severity',\n  severityPlaceholder: 'Select severity',\n  severityLow: 'Low',\n  severityMedium: 'Medium',\n  severityHigh: 'High',\n  severityCritical: 'Critical',\n  category: 'Category',\n  categoryPlaceholder: 'e.g., UI, Performance, API',\n  attachments: 'Attachments',\n  dragDrop: 'Drag and drop files here, or click to browse',\n  fileSupport: 'Supports images and videos up to 5MB/50MB • Max 3 files',\n  chooseFiles: 'Choose Files',\n  uploadedFiles: 'Uploaded files',\n  verifying: 'Verifying...',\n  verified: '✓ Verified',\n  cancel: 'Cancel',\n  submit: 'Submit Issue',\n  creatingIssue: 'Creating Issue...',\n  verifyingAttachments: 'Verifying Attachments...',\n  uploadingFiles: 'Uploading Files...',\n  preparingUpload: 'Preparing Upload...',\n  required: '*',\n};\n\nconst es: Translation = {\n  title: 'Reportar un Problema',\n  description: 'Ayúdanos a mejorar reportando cualquier problema que encuentres',\n  summary: 'Resumen',\n  summaryPlaceholder: 'Descripción breve del problema',\n  steps: 'Pasos para Reproducir',\n  stepsPlaceholder: '1. Ir a...\\n2. Hacer clic en...\\n3. Ver error',\n  expected: 'Comportamiento Esperado',\n  expectedPlaceholder: '¿Qué debería suceder?',\n  actual: 'Comportamiento Real',\n  actualPlaceholder: '¿Qué sucedió realmente?',\n  severity: 'Severidad',\n  severityPlaceholder: 'Seleccionar severidad',\n  severityLow: 'Baja',\n  severityMedium: 'Media',\n  severityHigh: 'Alta',\n  severityCritical: 'Crítica',\n  category: 'Categoría',\n  categoryPlaceholder: 'ej., UI, Rendimiento, API',\n  attachments: 'Archivos Adjuntos',\n  dragDrop: 'Arrastra y suelta archivos aquí, o haz clic para explorar',\n  fileSupport: 'Soporta imágenes y videos hasta 5MB/50MB • Máximo 3 archivos',\n  chooseFiles: 'Elegir Archivos',\n  uploadedFiles: 'Archivos subidos',\n  verifying: 'Verificando...',\n  verified: '✓ Verificado',\n  cancel: 'Cancelar',\n  submit: 'Enviar Reporte',\n  creatingIssue: 'Creando Reporte...',\n  verifyingAttachments: 'Verificando Archivos Adjuntos...',\n  uploadingFiles: 'Subiendo Archivos...',\n  preparingUpload: 'Preparando Subida...',\n  required: '*',\n};\n\nexport const translations = { en, es } as const;\n\nexport type Locale = keyof typeof translations;\n","<script setup lang=\"ts\">\nimport { DialogRoot } from 'radix-vue';\n\nexport interface DialogProps {\n  open?: boolean;\n  defaultOpen?: boolean;\n  modal?: boolean;\n}\n\nwithDefaults(defineProps<DialogProps>(), {\n  modal: true,\n});\n\nconst emit = defineEmits<{\n  'update:open': [value: boolean];\n}>();\n</script>\n\n<template>\n  <DialogRoot :open=\"open\" :default-open=\"defaultOpen\" :modal=\"modal\" @update:open=\"emit('update:open', $event)\">\n    <slot />\n  </DialogRoot>\n</template>\n","<script setup lang=\"ts\">\nimport { DialogClose, DialogContent, DialogOverlay, DialogPortal } from 'radix-vue';\nimport { X } from 'lucide-vue-next';\nimport { cn } from '../../lib/cn';\n\nexport interface DialogContentProps {\n  class?: string;\n  showCloseButton?: boolean;\n}\n\nconst props = withDefaults(defineProps<DialogContentProps>(), {\n  showCloseButton: true,\n});\n</script>\n\n<template>\n  <DialogPortal>\n    <DialogOverlay\n      :class=\"cn(\n        'fixed inset-0 z-50 bg-black/80',\n        'data-[state=open]:animate-in data-[state=closed]:animate-out',\n        'data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0'\n      )\"\n      :style=\"{\n        position: 'fixed',\n        inset: '0',\n        zIndex: '10000',\n        backgroundColor: 'rgba(0, 0, 0, 0.8)',\n      }\"\n    />\n    <DialogContent\n      :class=\"cn(\n        'blario-wrapper fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg gap-4',\n        'border bg-background p-6 shadow-lg duration-200',\n        'translate-x-[-50%] translate-y-[-50%]',\n        'data-[state=open]:animate-in data-[state=closed]:animate-out',\n        'data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',\n        'data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95',\n        'sm:rounded-lg',\n        props.class\n      )\"\n      :style=\"{\n        position: 'fixed',\n        left: '50%',\n        top: '50%',\n        transform: 'translate(-50%, -50%)',\n        zIndex: 10001,\n        backgroundColor: 'hsl(var(--blario-background))',\n        padding: '1.5rem',\n        borderRadius: '0.5rem',\n        boxShadow: '0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)',\n        maxWidth: '42rem',\n        width: 'calc(100% - 2rem)',\n        maxHeight: '90vh',\n        overflowY: 'auto',\n      }\"\n    >\n      <slot />\n      <DialogClose\n        v-if=\"showCloseButton\"\n        :class=\"cn(\n          'absolute top-4 right-4 rounded-sm opacity-70',\n          'ring-offset-background transition-opacity hover:opacity-100',\n          'focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2',\n          'disabled:pointer-events-none',\n          'data-[state=open]:bg-accent data-[state=open]:text-muted-foreground'\n        )\"\n      >\n        <X class=\"h-4 w-4\" />\n        <span class=\"sr-only\">Close</span>\n      </DialogClose>\n    </DialogContent>\n  </DialogPortal>\n</template>\n","<script setup lang=\"ts\">\nimport { cn } from '../../lib/cn';\n\nexport interface DialogHeaderProps {\n  class?: string;\n}\n\nconst props = defineProps<DialogHeaderProps>();\n</script>\n\n<template>\n  <div :class=\"cn('flex flex-col gap-2 text-center sm:text-left', props.class)\">\n    <slot />\n  </div>\n</template>\n","<script setup lang=\"ts\">\nimport { DialogTitle } from 'radix-vue';\nimport { cn } from '../../lib/cn';\n\nexport interface DialogTitleProps {\n  class?: string;\n}\n\nconst props = defineProps<DialogTitleProps>();\n</script>\n\n<template>\n  <DialogTitle :class=\"cn('text-lg leading-none font-semibold text-foreground', props.class)\">\n    <slot />\n  </DialogTitle>\n</template>\n","<script setup lang=\"ts\">\nimport { DialogDescription } from 'radix-vue';\nimport { cn } from '../../lib/cn';\n\nexport interface DialogDescriptionProps {\n  class?: string;\n}\n\nconst props = defineProps<DialogDescriptionProps>();\n</script>\n\n<template>\n  <DialogDescription :class=\"cn('text-muted-foreground text-sm', props.class)\">\n    <slot />\n  </DialogDescription>\n</template>\n","<template>\n  <div class=\"blario-wrapper\">\n    <Dialog :open=\"isModalOpen\" @update:open=\"(open) => !open && handleCloseModal()\">\n      <DialogContent class=\"blario-wrapper max-w-2xl\">\n        <DialogHeader class=\"gap-1\">\n          <DialogTitle>{{ t.title }}</DialogTitle>\n          <DialogDescription class=\"block text-muted-foreground text-sm leading-relaxed\">\n            {{ t.description }}\n          </DialogDescription>\n        </DialogHeader>\n\n        <form @submit.prevent=\"handleSubmit\" :class=\"className\">\n            <div>\n              <!-- Summary -->\n              <div class=\"space-y-3 mb-4\">\n                <label for=\"summary\" class=\"flex items-center gap-2 text-sm leading-none font-medium text-foreground select-none\">\n                  {{ t.summary }} <span class=\"text-destructive\">{{ t.required }}</span>\n                </label>\n                <input\n                  id=\"summary\"\n                  v-model=\"formData.summary\"\n                  type=\"text\"\n                  :placeholder=\"t.summaryPlaceholder\"\n                  required\n                  :disabled=\"isSubmitting || isUploading\"\n                  class=\"text-foreground file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground dark:bg-input/30 border-input flex h-9 w-full min-w-0 rounded-md border bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\"\n                />\n              </div>\n\n              <!-- Steps -->\n              <div class=\"space-y-3 mb-4\">\n                <label for=\"steps\" class=\"flex items-center gap-2 text-sm leading-none font-medium text-foreground select-none\">{{ t.steps }}</label>\n                <textarea\n                  id=\"steps\"\n                  v-model=\"formData.steps\"\n                  :placeholder=\"t.stepsPlaceholder\"\n                  rows=\"4\"\n                  :disabled=\"isSubmitting || isUploading\"\n                  data-tour-id=\"issue-description-input\"\n                  class=\"text-foreground border-input placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 flex field-sizing-content min-h-16 w-full rounded-md border bg-transparent px-3 py-2 text-base shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\"\n                />\n              </div>\n\n              <!-- Expected and Actual -->\n              <div class=\"grid grid-cols-2 gap-6 mb-4\">\n                <div class=\"space-y-3\">\n                  <label for=\"expected\" class=\"flex items-center gap-2 text-sm leading-none font-medium text-foreground select-none\">{{ t.expected }}</label>\n                  <textarea\n                    id=\"expected\"\n                    v-model=\"formData.expected\"\n                    :placeholder=\"t.expectedPlaceholder\"\n                    rows=\"3\"\n                    :disabled=\"isSubmitting || isUploading\"\n                    class=\"text-foreground border-input placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 flex field-sizing-content min-h-16 w-full rounded-md border bg-transparent px-3 py-2 text-base shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\"\n                  />\n                </div>\n\n                <div class=\"space-y-3\">\n                  <label for=\"actual\" class=\"flex items-center gap-2 text-sm leading-none font-medium text-foreground select-none\">{{ t.actual }}</label>\n                  <textarea\n                    id=\"actual\"\n                    v-model=\"formData.actual\"\n                    :placeholder=\"t.actualPlaceholder\"\n                    rows=\"3\"\n                    :disabled=\"isSubmitting || isUploading\"\n                    class=\"text-foreground border-input placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 flex field-sizing-content min-h-16 w-full rounded-md border bg-transparent px-3 py-2 text-base shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\"\n                  />\n                </div>\n              </div>\n\n              <!-- Severity and Category -->\n              <div class=\"grid grid-cols-2 gap-6 mb-4\">\n                <div class=\"space-y-3\">\n                  <label for=\"severity\" class=\"flex items-center gap-2 text-sm leading-none font-medium text-foreground select-none\">{{ t.severity }}</label>\n                  <select\n                    id=\"severity\"\n                    v-model=\"formData.severity\"\n                    :disabled=\"isSubmitting || isUploading\"\n                    class=\"text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground dark:bg-input/30 border-input flex h-9 w-full min-w-0 rounded-md border bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\"\n                  >\n                    <option value=\"\">{{ t.severityPlaceholder }}</option>\n                    <option value=\"low\">{{ t.severityLow }}</option>\n                    <option value=\"medium\">{{ t.severityMedium }}</option>\n                    <option value=\"high\">{{ t.severityHigh }}</option>\n                    <option value=\"critical\">{{ t.severityCritical }}</option>\n                  </select>\n                </div>\n\n                <div class=\"space-y-3\">\n                  <label for=\"category\" class=\"flex items-center gap-2 text-sm leading-none font-medium text-foreground select-none\">{{ t.category }}</label>\n                  <input\n                    id=\"category\"\n                    v-model=\"formData.category\"\n                    type=\"text\"\n                    :placeholder=\"t.categoryPlaceholder\"\n                    :disabled=\"isSubmitting || isUploading\"\n                    class=\"text-foreground file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground dark:bg-input/30 border-input flex h-9 w-full min-w-0 rounded-md border bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\"\n                  />\n                </div>\n              </div>\n\n              <!-- File Upload -->\n              <div class=\"space-y-4\">\n                <label class=\"flex items-center gap-2 text-sm leading-none font-medium text-foreground select-none\">{{ t.attachments }}</label>\n                <div\n                  class=\"rounded-lg border-2 border-dashed border-muted/40 bg-muted/5 p-8 text-center transition-colors hover:border-muted/60\"\n                  :class=\"{ 'border-primary bg-accent/20': isDragOver }\"\n                  @dragover.prevent=\"handleDragOver\"\n                  @dragenter.prevent=\"handleDragOver\"\n                  @dragleave=\"handleDragLeave\"\n                  @drop.prevent=\"handleDrop\"\n                >\n                  <Upload class=\"mx-auto mb-3 h-10 w-10 text-muted-foreground\" />\n                  <p class=\"mb-1 text-sm font-medium text-muted-foreground\">{{ t.dragDrop }}</p>\n                  <p class=\"mb-4 text-xs text-muted-foreground\">{{ t.fileSupport }}</p>\n                  <input\n                    ref=\"fileInput\"\n                    type=\"file\"\n                    multiple\n                    accept=\"image/*,video/*\"\n                    class=\"hidden\"\n                    @change=\"handleFileChange\"\n                  />\n                  <button\n                    type=\"button\"\n                    class=\"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] border border-input bg-background text-foreground shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50 h-8 px-3\"\n                    @click=\"fileInput?.click()\"\n                  >\n                    {{ t.chooseFiles }}\n                  </button>\n                </div>\n\n                <!-- File list -->\n                <div v-if=\"files.length > 0\" class=\"space-y-3 mt-4\">\n                  <p class=\"text-sm font-medium text-foreground\">{{ t.uploadedFiles }} ({{ files.length }})</p>\n                  <div class=\"space-y-2 rounded-lg bg-muted/10 p-3\">\n                    <div\n                      v-for=\"(file, index) in files\"\n                      :key=\"`${file.name}-${index}`\"\n                      class=\"flex items-center justify-between rounded-lg bg-muted/30 p-3\"\n                    >\n                      <div class=\"flex min-w-0 flex-1 items-center gap-3\">\n                        <File class=\"h-5 w-5 text-muted-foreground\" />\n                        <div class=\"min-w-0\">\n                          <p class=\"truncate text-sm font-medium text-foreground\">{{ file.name }}</p>\n                          <p class=\"text-xs text-muted-foreground\">{{ formatFileSize(file.size) }}</p>\n                        </div>\n                      </div>\n                      <button\n                        type=\"button\"\n                        class=\"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 shrink-0 outline-none hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50 size-9 text-muted-foreground hover:text-destructive\"\n                        @click=\"removeFile(index)\"\n                      >\n                        <Trash2 class=\"h-4 w-4\" />\n                      </button>\n                    </div>\n                  </div>\n                </div>\n              </div>\n\n              <!-- Error -->\n              <div v-if=\"uploadError\" class=\"p-3 bg-red-50 border border-red-200 rounded text-sm text-red-600\">\n                {{ uploadError }}\n              </div>\n            </div>\n\n            <!-- Actions -->\n            <div class=\"flex flex-row gap-3 sm:gap-4 pt-6 mt-8 border-muted/30 justify-end\" >\n              <button\n                type=\"button\"\n                class=\"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] border border-input bg-background text-foreground shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50 h-9 px-4 py-2\"\n                :disabled=\"isSubmitting || isUploading\"\n                @click=\"handleCloseModal\"\n              >\n                {{ t.cancel }}\n              </button>\n              <button\n                type=\"submit\"\n                class=\"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] bg-primary text-primary-foreground shadow-xs hover:bg-primary/90 h-9 px-4 py-2\"\n                :disabled=\"isSubmitting || isUploading\"\n                data-tour-id=\"issue-submit-button\"\n              >\n                {{ submitButtonText }}\n              </button>\n            </div>\n          </form>\n      </DialogContent>\n    </Dialog>\n  </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, inject, watch } from 'vue';\nimport { Upload, File, Trash2 } from 'lucide-vue-next';\nimport { useBlarioUpload } from '../composables/useBlarioUpload';\nimport { BlarioKey } from '../plugin/BlarioPlugin';\nimport type { FormData } from '@blario/core';\nimport { translations } from './translations';\nimport type { Translation } from './translations';\n\nconst resolveTranslation = (locale?: string): Translation => {\n  if (!locale || !(locale in translations)) {\n    return translations.en;\n  }\n  return translations[locale as keyof typeof translations];\n};\nimport Dialog from './ui/Dialog.vue';\nimport DialogContent from './ui/DialogContent.vue';\nimport DialogHeader from './ui/DialogHeader.vue';\nimport DialogTitle from './ui/DialogTitle.vue';\nimport DialogDescription from './ui/DialogDescription.vue';\n\nexport interface IssueReporterModalProps {\n  onSuccess?: (issueId: string) => void;\n  onError?: (error: Error) => void;\n  className?: string;\n}\n\nconst props = defineProps<IssueReporterModalProps>();\n\nconst blario = inject(BlarioKey);\nconst { submitIssueWithUploads, isUploading, uploadError, clearUploadError, uploadProgress } = useBlarioUpload();\n\nconst t = computed<Translation>(() => resolveTranslation(blario?.state.locale));\nconst isModalOpen = computed(() => blario?.state.isModalOpen || false);\nconst reporterOptions = computed(() => blario?.state.reporterOptions || {});\n\nconst files = ref<File[]>([]);\nconst isSubmitting = ref(false);\nconst fileInput = ref<HTMLInputElement>();\nconst isDragOver = ref(false);\n\nconst formData = ref<{\n  summary: string;\n  steps?: string;\n  expected?: string;\n  actual?: string;\n  severity?: 'low' | 'medium' | 'high' | 'critical';\n  category?: string;\n}>({\n  summary: '',\n  steps: '',\n  expected: '',\n  actual: '',\n  severity: undefined,\n  category: '',\n});\n\n// Watch for prefill data\nwatch(() => reporterOptions.value, (options) => {\n  if (options.prefill) {\n    formData.value = {\n      summary: options.prefill.summary || '',\n      steps: options.prefill.steps || '',\n      expected: options.prefill.expected || '',\n      actual: options.prefill.actual || '',\n      severity: options.prefill.severity,\n      category: options.category || options.prefill.category || '',\n    };\n  }\n  if (options.category) {\n    formData.value.category = options.category;\n  }\n}, { immediate: true });\n\nconst submitButtonText = computed(() => {\n  const translations = t.value;\n  if (isSubmitting.value && !isUploading) return translations.creatingIssue || 'Creating...';\n  if (isUploading) {\n    const anyVerifying = uploadProgress.some((p: any) => p.status === 'verifying');\n    const anyUploading = uploadProgress.some((p: any) => p.status === 'uploading');\n    if (anyVerifying) return translations.verifyingAttachments || 'Verifying...';\n    if (anyUploading) return translations.uploadingFiles || 'Uploading...';\n    return translations.preparingUpload || 'Preparing...';\n  }\n  return translations.submit || 'Submit';\n});\n\nconst handleFileChange = (event: Event) => {\n  const target = event.target as HTMLInputElement;\n  const selectedFiles = Array.from(target.files || []);\n  const MAX_FILES = 3;\n  const MAX_IMAGE_SIZE = 5 * 1024 * 1024;\n  const MAX_VIDEO_SIZE = 50 * 1024 * 1024;\n\n  const validFiles = selectedFiles.filter((file) => {\n    const isImage = file.type.startsWith('image/');\n    const isVideo = file.type.startsWith('video/');\n    if (!isImage && !isVideo) return false;\n\n    const maxSize = isVideo ? MAX_VIDEO_SIZE : MAX_IMAGE_SIZE;\n    return file.size <= maxSize;\n  });\n\n  files.value = [...files.value, ...validFiles].slice(0, MAX_FILES);\n  clearUploadError();\n  if (target) target.value = '';\n};\n\nconst validateAndAddFiles = (incomingFiles: File[]) => {\n  const MAX_FILES = 3;\n  const MAX_IMAGE_SIZE = 5 * 1024 * 1024;\n  const MAX_VIDEO_SIZE = 50 * 1024 * 1024;\n\n  const validFiles = incomingFiles.filter((file) => {\n    const isImage = file.type.startsWith('image/');\n    const isVideo = file.type.startsWith('video/');\n    if (!isImage && !isVideo) return false;\n\n    const maxSize = isVideo ? MAX_VIDEO_SIZE : MAX_IMAGE_SIZE;\n    return file.size <= maxSize;\n  });\n\n  files.value = [...files.value, ...validFiles].slice(0, MAX_FILES);\n  clearUploadError();\n};\n\nconst handleDragOver = () => {\n  isDragOver.value = true;\n};\n\nconst handleDragLeave = () => {\n  isDragOver.value = false;\n};\n\nconst handleDrop = (event: DragEvent) => {\n  isDragOver.value = false;\n  const dropped = Array.from(event.dataTransfer?.files || []);\n  if (dropped.length === 0) return;\n  validateAndAddFiles(dropped);\n};\n\nconst removeFile = (index: number) => {\n  files.value = files.value.filter((_, i) => i !== index);\n};\n\nconst formatFileSize = (bytes: number): string => {\n  if (bytes === 0) return '0 Bytes';\n  const KILOBYTE = 1024;\n  const sizeUnits = ['Bytes', 'KB', 'MB'];\n  const unitIndex = Math.min(Math.floor(Math.log(bytes) / Math.log(KILOBYTE)), sizeUnits.length - 1);\n  const value = bytes / Math.pow(KILOBYTE, unitIndex);\n  return `${value.toFixed(unitIndex === 0 ? 0 : 2)} ${sizeUnits[unitIndex]}`;\n};\n\nconst handleSubmit = async () => {\n  isSubmitting.value = true;\n\n  const issueData: FormData = {\n    summary: formData.value.summary,\n    steps: formData.value.steps || undefined,\n    expected: formData.value.expected || undefined,\n    actual: formData.value.actual || undefined,\n    severity: formData.value.severity || undefined,\n    category: formData.value.category || undefined,\n  };\n\n  try {\n    const result = await submitIssueWithUploads(issueData, files.value);\n\n    if (result?.issueId) {\n      props.onSuccess?.(result.issueId);\n      // Reset form\n      formData.value = {\n        summary: '',\n        steps: '',\n        expected: '',\n        actual: '',\n        severity: undefined,\n        category: '',\n      };\n      files.value = [];\n      blario?.actions.closeReporter();\n    }\n  } catch (error) {\n    const err = error instanceof Error ? error : new Error('Failed to submit issue');\n    props.onError?.(err);\n    console.error('Failed to submit issue:', error);\n  } finally {\n    isSubmitting.value = false;\n  }\n};\n\nconst handleCloseModal = () => {\n  clearUploadError();\n  blario?.actions.closeReporter();\n};\n</script>\n","<template>\n  <div class=\"blario-provider\">\n    <slot />\n    <IssueReporterModal />\n  </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { provide, reactive, readonly, watch, onUnmounted } from 'vue';\nimport type { DiagnosticResponse, User } from '@blario/core';\nimport {\n  getCaptureManager,\n  resetCaptureManager,\n  getStorageManager,\n  resetStorageManager,\n  getApiClient,\n  resetApiClient,\n} from '@blario/core';\nimport IssueReporterModal from './IssueReporterModal.vue';\nimport type { BlarioState, BlarioActions, BlarioContext } from '../plugin/BlarioPlugin';\nimport { BlarioKey } from '../plugin/BlarioPlugin';\n\nexport interface BlarioProviderProps {\n  publishableKey: string;\n  apiBaseUrl?: string;\n  user?: User;\n  locale?: 'en' | 'es';\n  capture?: {\n    console?: boolean;\n    networkSample?: boolean;\n    maxConsoleLogs?: number;\n    maxNetworkLogs?: number;\n  };\n  theme?: {\n    mode?: 'light' | 'dark';\n    position?: 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left';\n    accent?: string;\n    className?: string;\n  };\n  redaction?: {\n    patterns?: RegExp[];\n    customRedactor?: (text: string) => string;\n  };\n  rateLimit?: {\n    maxRequests?: number;\n    windowMs?: number;\n  };\n}\n\nconst props = withDefaults(defineProps<BlarioProviderProps>(), {\n  apiBaseUrl: 'https://api.blar.io',\n  locale: 'en',\n  capture: () => ({}),\n  theme: () => ({}),\n  redaction: () => ({}),\n  rateLimit: () => ({}),\n});\n\nconst emit = defineEmits<{\n  afterSubmit: [issueId: string];\n  error: [error: Error];\n}>();\n\n// Initialize managers\nconst captureManager = getCaptureManager(\n  {\n    maxConsoleLogs: props.capture?.maxConsoleLogs ?? 50,\n    maxNetworkLogs: props.capture?.maxNetworkLogs ?? 20,\n    captureConsole: props.capture?.console ?? true,\n    captureNetwork: props.capture?.networkSample ?? false,\n  },\n  {\n    getAppVersion: () => import.meta.env.VITE_APP_VERSION,\n    getRelease: () => import.meta.env.VITE_RELEASE,\n  }\n);\n\nconst storageManager = getStorageManager();\nconst apiClient = getApiClient({\n  apiBaseUrl: props.apiBaseUrl,\n  publishableKey: props.publishableKey,\n});\n\nconst rateLimitState = {\n  requests: [] as number[],\n  maxRequests: props.rateLimit?.maxRequests ?? 10,\n  windowMs: props.rateLimit?.windowMs ?? 60000,\n};\n\n// Reactive state\nconst state = reactive<BlarioState>({\n  config: {\n    publishableKey: props.publishableKey,\n    apiBaseUrl: props.apiBaseUrl,\n    user: props.user,\n    locale: props.locale,\n    capture: {\n      console: props.capture?.console ?? true,\n      networkSample: props.capture?.networkSample ?? false,\n      maxConsoleLogs: props.capture?.maxConsoleLogs ?? 50,\n      maxNetworkLogs: props.capture?.maxNetworkLogs ?? 20,\n    },\n    theme: {\n      mode: props.theme?.mode ?? 'light',\n      position: props.theme?.position ?? 'bottom-right',\n      accent: props.theme?.accent,\n      className: props.theme?.className,\n    },\n    redaction: props.redaction,\n    rateLimit: {\n      maxRequests: props.rateLimit?.maxRequests ?? 10,\n      windowMs: props.rateLimit?.windowMs ?? 60000,\n    },\n    onAfterSubmit: (issueId: string) => emit('afterSubmit', issueId),\n    onError: (error: Error) => emit('error', error),\n  },\n  isModalOpen: false,\n  reporterOptions: {},\n  lastDiagnostic: null,\n  isSubmitting: false,\n  user: props.user,\n  locale: props.locale,\n});\n\n// Start capture\ncaptureManager.startCapture();\n\n// Load latest diagnostic from storage\nconst latestDiagnostic = storageManager.getLatestDiagnostic();\nif (latestDiagnostic && !latestDiagnostic.viewed) {\n  state.lastDiagnostic = latestDiagnostic;\n}\n\n// Watch for theme changes\nwatch(() => props.theme?.mode, (mode) => {\n  if (typeof window !== 'undefined') {\n    const root = document.documentElement;\n    if (mode === 'dark') {\n      root.classList.add('dark');\n    } else {\n      root.classList.remove('dark');\n    }\n  }\n}, { immediate: true });\n\nconst checkRateLimit = (): boolean => {\n  const now = Date.now();\n  const { requests, maxRequests, windowMs } = rateLimitState;\n\n  const validRequests = requests.filter(time => now - time < windowMs);\n  rateLimitState.requests = validRequests;\n\n  if (validRequests.length >= maxRequests) {\n    return false;\n  }\n\n  rateLimitState.requests.push(now);\n  return true;\n};\n\n// Actions\nconst actions: BlarioActions = {\n  openReporter(opts = {}) {\n    state.reporterOptions = opts;\n    state.isModalOpen = true;\n  },\n\n  closeReporter() {\n    state.isModalOpen = false;\n    state.reporterOptions = {};\n  },\n\n  async submitIssue(formData: any): Promise<DiagnosticResponse | null> {\n    if (!checkRateLimit()) {\n      const error = new Error('Rate limit exceeded. Please try again later.');\n      emit('error', error);\n      throw error;\n    }\n\n    state.isSubmitting = true;\n\n    try {\n      const { attachments, ...formFields } = formData;\n\n      const payload = {\n        publishableKey: props.publishableKey,\n        user: props.user,\n        meta: captureManager.getCaptureMeta(),\n        console: props.capture?.console !== false ? captureManager.getConsoleLogs() : undefined,\n        network: props.capture?.networkSample ? captureManager.getNetworkLogs() : undefined,\n        form: formFields,\n      };\n\n      const { issueId } = await apiClient.submitIssue(payload);\n\n      emit('afterSubmit', issueId);\n\n      return { issueId, status: 'pending' as const, diagnostic: undefined };\n    } catch (error) {\n      const err = error instanceof Error ? error : new Error('Failed to submit issue');\n      emit('error', err);\n      throw err;\n    } finally {\n      state.isSubmitting = false;\n    }\n  },\n\n  clearDiagnostic() {\n    if (state.lastDiagnostic?.issueId) {\n      storageManager.markDiagnosticAsViewed(state.lastDiagnostic.issueId);\n    }\n    state.lastDiagnostic = null;\n  },\n};\n\n// Provide context\nconst context: BlarioContext = {\n  state: readonly(state) as Readonly<BlarioState>,\n  actions,\n};\n\nprovide(BlarioKey, context);\n\n// Cleanup on unmount\nonUnmounted(() => {\n  captureManager.stopCapture();\n  resetCaptureManager();\n  resetStorageManager();\n  resetApiClient();\n});\n</script>\n","<template>\n  <div class=\"tour-provider\">\n    <slot />\n  </div>\n</template>\n\n<script setup lang=\"ts\">\n// Placeholder for tour provider\n// This will be implemented when tour functionality is added\n</script>\n","<template>\n  <div class=\"chat-widget\">\n    <!-- Placeholder for chat widget -->\n    <!-- This will be implemented when chat functionality is added -->\n  </div>\n</template>\n\n<script setup lang=\"ts\">\n// Placeholder for chat widget\n// This will be implemented when chat functionality is added\n</script>\n","<template>\n  <div\n    v-if=\"lastDiagnostic && !dismissed\"\n    class=\"blario-diagnostic-banner fixed top-0 left-0 right-0 z-50 bg-blue-600 text-white py-3 px-4 shadow-lg\"\n  >\n    <div class=\"max-w-7xl mx-auto flex items-center justify-between\">\n      <div class=\"flex items-center gap-3\">\n        <div class=\"flex-shrink-0\">\n          <CheckCircle class=\"h-5 w-5\" />\n        </div>\n        <div>\n          <p class=\"font-medium\">Issue reported successfully!</p>\n          <p class=\"text-sm opacity-90\">\n            Issue ID: {{ lastDiagnostic.issueId }}\n          </p>\n        </div>\n      </div>\n      <button\n        @click=\"handleDismiss\"\n        class=\"ml-4 p-1 hover:bg-blue-700 rounded transition-colors\"\n        aria-label=\"Dismiss\"\n      >\n        <X class=\"h-5 w-5\" />\n      </button>\n    </div>\n  </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref } from 'vue';\nimport { CheckCircle, X } from 'lucide-vue-next';\nimport { useBlario } from '../composables/useBlario';\n\nconst { lastDiagnostic, clearDiagnostic } = useBlario();\nconst dismissed = ref(false);\n\nconst handleDismiss = () => {\n  dismissed.value = true;\n  clearDiagnostic();\n};\n</script>\n\n<style scoped>\n.blario-diagnostic-banner {\n  animation: slideDown 0.3s ease-out;\n}\n\n@keyframes slideDown {\n  from {\n    transform: translateY(-100%);\n  }\n  to {\n    transform: translateY(0);\n  }\n}\n</style>\n","import { cva } from 'class-variance-authority';\n\nexport const buttonVariants = cva(\n  'inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50',\n  {\n    variants: {\n      variant: {\n        default: 'bg-primary text-primary-foreground hover:bg-primary/90',\n        destructive: 'bg-destructive text-destructive-foreground hover:bg-destructive/90',\n        outline: 'border border-input bg-background hover:bg-accent hover:text-accent-foreground',\n        secondary: 'bg-secondary text-secondary-foreground hover:bg-secondary/80',\n        ghost: 'hover:bg-accent hover:text-accent-foreground',\n        link: 'text-primary underline-offset-4 hover:underline',\n      },\n      size: {\n        default: 'h-10 px-4 py-2',\n        sm: 'h-9 rounded-md px-3',\n        lg: 'h-11 rounded-md px-8',\n        icon: 'h-10 w-10',\n      },\n    },\n    defaultVariants: {\n      variant: 'default',\n      size: 'default',\n    },\n  }\n);\n\nexport const inputVariants = cva(\n  'flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50',\n  {\n    variants: {\n      variant: {\n        default: '',\n        error: 'border-destructive focus-visible:ring-destructive',\n      },\n    },\n    defaultVariants: {\n      variant: 'default',\n    },\n  }\n);\n\nexport const labelVariants = cva(\n  'text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70'\n);\n\nexport const cardVariants = cva(\n  'rounded-lg border bg-card text-card-foreground shadow-sm',\n  {\n    variants: {\n      padding: {\n        none: '',\n        sm: 'p-4',\n        md: 'p-6',\n        lg: 'p-8',\n      },\n    },\n    defaultVariants: {\n      padding: 'md',\n    },\n  }\n);\n\nexport const alertVariants = cva(\n  'relative w-full rounded-lg border p-4 [&>svg~*]:pl-7 [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:text-foreground',\n  {\n    variants: {\n      variant: {\n        default: 'bg-background text-foreground',\n        destructive: 'border-destructive/50 text-destructive dark:border-destructive [&>svg]:text-destructive',\n      },\n    },\n    defaultVariants: {\n      variant: 'default',\n    },\n  }\n);\n\nexport const badgeVariants = cva(\n  'inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2',\n  {\n    variants: {\n      variant: {\n        default: 'border-transparent bg-primary text-primary-foreground hover:bg-primary/80',\n        secondary: 'border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80',\n        destructive: 'border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80',\n        outline: 'text-foreground',\n      },\n    },\n    defaultVariants: {\n      variant: 'default',\n    },\n  }\n);"],"names":["z","reactive","readonly","inject","ref","twMerge","clsx","computed","_createElementBlock","_renderSlot","_createBlock","_unref","Bug","_toDisplayString","DialogRoot","DialogPortal","_createVNode","DialogOverlay","DialogContent","DialogClose","X","_createElementVNode","_normalizeClass","DialogTitle","DialogDescription","watch","translations","_openBlock","_hoisted_1","Dialog","DialogHeader","_createTextVNode","_hoisted_2","_hoisted_3","_hoisted_4","_vModelText","_vModelSelect","Upload","_Fragment","_renderList","File","Trash2","_a","_b","provide","onUnmounted","IssueReporterModal","CheckCircle","cva"],"mappings":"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"}