{"version":3,"sources":["../src/theme.ts","../src/iframe-manager.ts","../src/message-handler.ts","../src/embed-client.ts"],"names":["hexToOklch","hex","cleanHex","r","g","b","toLinear","c","lr","lg","lb","x","y","z","l","m","s","lp","mp","sp","L","A","B","C","H","lightness","chroma","hue","themeToUrlParams","theme","params","DEFAULT_THEME","IframeManager","options","view","path","url","themeParams","key","value","container","containerEl","iframe","id","iframeId","MessageHandler","targetOrigin","event","message","pending","callbacks","callback","error","target","type","payload","messageId","timeoutMs","resolve","reject","timeout","reason","DEFAULT_BASE_URL","SpaceInvoices","config","action","newView","newOptions","locale"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { ThemeConfig } from \"./types\";\n\n/**\n * Convert hex color to OKLCH color string\n * Based on CSS Color Level 4 specification\n */\nexport function hexToOklch(hex: string): string {\n  // Remove # if present\n  const cleanHex = hex.replace(/^#/, \"\");\n\n  // Parse hex to RGB\n  let r: number;\n  let g: number;\n  let b: number;\n\n  if (cleanHex.length === 3) {\n    r = Number.parseInt(cleanHex[0] + cleanHex[0], 16) / 255;\n    g = Number.parseInt(cleanHex[1] + cleanHex[1], 16) / 255;\n    b = Number.parseInt(cleanHex[2] + cleanHex[2], 16) / 255;\n  } else if (cleanHex.length === 6) {\n    r = Number.parseInt(cleanHex.slice(0, 2), 16) / 255;\n    g = Number.parseInt(cleanHex.slice(2, 4), 16) / 255;\n    b = Number.parseInt(cleanHex.slice(4, 6), 16) / 255;\n  } else {\n    throw new Error(`Invalid hex color: ${hex}`);\n  }\n\n  // Convert sRGB to linear RGB\n  const toLinear = (c: number): number => {\n    return c <= 0.04045 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4;\n  };\n\n  const lr = toLinear(r);\n  const lg = toLinear(g);\n  const lb = toLinear(b);\n\n  // Convert linear RGB to XYZ (D65)\n  const x = 0.4124564 * lr + 0.3575761 * lg + 0.1804375 * lb;\n  const y = 0.2126729 * lr + 0.7151522 * lg + 0.072175 * lb;\n  const z = 0.0193339 * lr + 0.119192 * lg + 0.9503041 * lb;\n\n  // Convert XYZ to LMS\n  const l = 0.8189330101 * x + 0.3618667424 * y - 0.1288597137 * z;\n  const m = 0.0329845436 * x + 0.9293118715 * y + 0.0361456387 * z;\n  const s = 0.0482003018 * x + 0.2643662691 * y + 0.6338517028 * z;\n\n  // Convert to L'M'S' (cube root)\n  const lp = Math.cbrt(l);\n  const mp = Math.cbrt(m);\n  const sp = Math.cbrt(s);\n\n  // Convert to OKLAB\n  const L = 0.2104542553 * lp + 0.793617785 * mp - 0.0040720468 * sp;\n  const A = 1.9779984951 * lp - 2.428592205 * mp + 0.4505937099 * sp;\n  const B = 0.0259040371 * lp + 0.7827717662 * mp - 0.808675766 * sp;\n\n  // Convert OKLAB to OKLCH\n  const C = Math.sqrt(A * A + B * B);\n  let H = (Math.atan2(B, A) * 180) / Math.PI;\n  if (H < 0) H += 360;\n\n  // Format with appropriate precision\n  const lightness = L.toFixed(3);\n  const chroma = C.toFixed(3);\n  const hue = H.toFixed(3);\n\n  return `oklch(${lightness} ${chroma} ${hue})`;\n}\n\n/**\n * Adjust lightness of an OKLCH color for foreground text\n * Returns a contrasting foreground color\n */\nexport function getContrastingForeground(hex: string, darkMode: boolean): string {\n  const cleanHex = hex.replace(/^#/, \"\");\n  const r = Number.parseInt(cleanHex.slice(0, 2), 16);\n  const g = Number.parseInt(cleanHex.slice(2, 4), 16);\n  const b = Number.parseInt(cleanHex.slice(4, 6), 16);\n\n  // Calculate relative luminance\n  const luminance = (0.299 * r + 0.587 * g + 0.114 * b) / 255;\n\n  // Return appropriate foreground based on background luminance\n  if (luminance > 0.5) {\n    return darkMode ? \"oklch(0.15 0 0)\" : \"oklch(0.15 0 0)\";\n  }\n  return darkMode ? \"oklch(0.98 0 0)\" : \"oklch(0.98 0 0)\";\n}\n\n/**\n * Build URL query parameters from theme config\n */\nexport function themeToUrlParams(theme: ThemeConfig): URLSearchParams {\n  const params = new URLSearchParams();\n\n  if (theme.primary) {\n    params.set(\"theme_primary\", encodeURIComponent(hexToOklch(theme.primary)));\n  }\n  if (theme.accent) {\n    params.set(\"theme_accent\", encodeURIComponent(hexToOklch(theme.accent)));\n  }\n  if (theme.background) {\n    params.set(\"theme_background\", encodeURIComponent(hexToOklch(theme.background)));\n  }\n  if (theme.foreground) {\n    params.set(\"theme_foreground\", encodeURIComponent(hexToOklch(theme.foreground)));\n  }\n  if (theme.card) {\n    params.set(\"theme_card\", encodeURIComponent(hexToOklch(theme.card)));\n  }\n  if (theme.border) {\n    params.set(\"theme_border\", encodeURIComponent(hexToOklch(theme.border)));\n  }\n  if (theme.radius !== undefined) {\n    params.set(\"theme_radius\", theme.radius.toString());\n  }\n  if (theme.darkMode !== undefined) {\n    params.set(\"theme_dark\", theme.darkMode ? \"1\" : \"0\");\n  }\n\n  return params;\n}\n\n/**\n * CSS variable names that can be customized\n */\nexport const THEME_CSS_VARIABLES = {\n  primary: \"--primary\",\n  accent: \"--accent\",\n  background: \"--background\",\n  foreground: \"--foreground\",\n  card: \"--card\",\n  border: \"--border\",\n  radius: \"--radius\",\n} as const;\n\n/**\n * Default Space Invoices theme (light mode)\n */\nexport const DEFAULT_THEME: Required<ThemeConfig> = {\n  primary: \"#6366f1\", // Indigo\n  accent: \"#6366f1\",\n  background: \"#ffffff\",\n  foreground: \"#1a1a1a\",\n  card: \"#ffffff\",\n  border: \"#e5e5e5\",\n  radius: 0,\n  darkMode: false,\n};\n","import { themeToUrlParams } from \"./theme\";\nimport type { EmbedLocale, EmbedView, OpenOptions, ThemeConfig } from \"./types\";\n\nexport interface IframeOptions {\n  baseUrl: string;\n  apiKey: string;\n  entityId: string;\n  theme?: ThemeConfig;\n  locale?: EmbedLocale;\n}\n\n/**\n * Manages iframe creation, lifecycle, and URL generation\n */\nexport class IframeManager {\n  private readonly baseUrl: string;\n  private readonly apiKey: string;\n  private readonly entityId: string;\n  private theme: ThemeConfig;\n  private locale: EmbedLocale | undefined;\n  private iframes: Map<string, HTMLIFrameElement> = new Map();\n  private idCounter = 0;\n\n  constructor(options: IframeOptions) {\n    this.baseUrl = options.baseUrl.replace(/\\/$/, \"\"); // Remove trailing slash\n    this.apiKey = options.apiKey;\n    this.entityId = options.entityId;\n    this.theme = options.theme || {};\n    this.locale = options.locale;\n  }\n\n  /**\n   * Generate a unique iframe ID\n   */\n  private generateId(): string {\n    return `si-embed-${++this.idCounter}`;\n  }\n\n  /**\n   * Convert view name to URL path\n   */\n  private viewToPath(view: EmbedView, options?: OpenOptions): string {\n    switch (view) {\n      case \"invoices\":\n        return \"/embed/documents/invoice\";\n      case \"invoice/new\":\n        return \"/embed/documents/add/invoice\";\n      case \"invoice\":\n        if (!options?.id) throw new Error(\"Invoice ID required for 'invoice' view\");\n        return `/embed/documents/view/${options.id}`;\n\n      case \"estimates\":\n        return \"/embed/documents/estimate\";\n      case \"estimate/new\":\n        return \"/embed/documents/add/estimate\";\n      case \"estimate\":\n        if (!options?.id) throw new Error(\"Estimate ID required for 'estimate' view\");\n        return `/embed/documents/view/${options.id}`;\n\n      case \"credit-notes\":\n        return \"/embed/documents/credit_note\";\n      case \"credit-note/new\":\n        return \"/embed/documents/add/credit_note\";\n      case \"credit-note\":\n        if (!options?.id) throw new Error(\"Credit note ID required for 'credit-note' view\");\n        return `/embed/documents/view/${options.id}`;\n\n      case \"advance-invoices\":\n        return \"/embed/documents/advance_invoice\";\n      case \"advance-invoice/new\":\n        return \"/embed/documents/add/advance_invoice\";\n      case \"advance-invoice\":\n        if (!options?.id) throw new Error(\"Advance invoice ID required for 'advance-invoice' view\");\n        return `/embed/documents/view/${options.id}`;\n\n      case \"delivery-notes\":\n        return \"/embed/documents/delivery_note\";\n      case \"delivery-note/new\":\n        return \"/embed/documents/add/delivery_note\";\n      case \"delivery-note\":\n        if (!options?.id) throw new Error(\"Delivery note ID required for 'delivery-note' view\");\n        return `/embed/documents/view/${options.id}`;\n\n      case \"customers\":\n        return \"/embed/customers\";\n      case \"customer/new\":\n        return \"/embed/customers/add\";\n      case \"customer\":\n        if (!options?.id) throw new Error(\"Customer ID required for 'customer' view\");\n        return `/embed/customers/${options.id}`;\n\n      case \"settings/company\":\n        return \"/embed/settings/company\";\n      case \"settings/defaults\":\n        return \"/embed/settings/defaults\";\n      case \"settings/numbering\":\n        return \"/embed/settings/numbering\";\n      case \"settings/tax\":\n        return \"/embed/settings/tax\";\n      case \"settings/furs\":\n        return \"/embed/settings/furs\";\n      case \"settings/fina\":\n        return \"/embed/settings/fina\";\n      case \"settings/templates\":\n        return \"/embed/settings/templates\";\n\n      case \"export\":\n        return \"/embed/export\";\n\n      default:\n        throw new Error(`Unknown view: ${view}`);\n    }\n  }\n\n  /**\n   * Build full URL for an embed view\n   */\n  buildUrl(view: EmbedView, options?: OpenOptions): string {\n    const path = this.viewToPath(view, options);\n    const url = new URL(path, this.baseUrl);\n\n    // Add auth params\n    url.searchParams.set(\"api_key\", this.apiKey);\n    url.searchParams.set(\"entity_id\", this.entityId);\n\n    // Add locale param\n    if (this.locale) {\n      url.searchParams.set(\"locale\", this.locale);\n    }\n\n    // Add theme params\n    const themeParams = themeToUrlParams(this.theme);\n    for (const [key, value] of themeParams) {\n      url.searchParams.set(key, value);\n    }\n\n    // Add prefill data if provided\n    if (options?.prefill) {\n      url.searchParams.set(\"prefill\", btoa(JSON.stringify(options.prefill)));\n    }\n\n    return url.toString();\n  }\n\n  /**\n   * Create an iframe element\n   */\n  create(container: HTMLElement | string, view: EmbedView, options?: OpenOptions): HTMLIFrameElement {\n    // Resolve container\n    const containerEl = typeof container === \"string\" ? document.querySelector<HTMLElement>(container) : container;\n\n    if (!containerEl) {\n      throw new Error(`Container not found: ${container}`);\n    }\n\n    // Create iframe\n    const iframe = document.createElement(\"iframe\");\n    const id = this.generateId();\n\n    iframe.id = id;\n    iframe.src = this.buildUrl(view, options);\n    iframe.style.cssText = `\n      width: 100%;\n      height: 100%;\n      border: none;\n      display: block;\n    `;\n    iframe.setAttribute(\"allowfullscreen\", \"true\");\n    iframe.setAttribute(\"allow\", \"clipboard-write\");\n\n    // Store reference\n    this.iframes.set(id, iframe);\n\n    // Append to container\n    containerEl.innerHTML = \"\"; // Clear container\n    containerEl.appendChild(iframe);\n\n    return iframe;\n  }\n\n  /**\n   * Update theme for an iframe\n   */\n  updateTheme(iframeId: string, theme: ThemeConfig): void {\n    this.theme = { ...this.theme, ...theme };\n\n    const iframe = this.iframes.get(iframeId);\n    if (iframe?.contentWindow) {\n      // Theme will be updated via postMessage by the embed client\n      // This just stores the updated theme for future URL generation\n    }\n  }\n\n  /**\n   * Navigate an iframe to a different view\n   */\n  navigate(iframeId: string, view: EmbedView, options?: OpenOptions): void {\n    const iframe = this.iframes.get(iframeId);\n    if (iframe) {\n      iframe.src = this.buildUrl(view, options);\n    }\n  }\n\n  /**\n   * Get an iframe by ID\n   */\n  get(iframeId: string): HTMLIFrameElement | undefined {\n    return this.iframes.get(iframeId);\n  }\n\n  /**\n   * Get content window for an iframe\n   */\n  getWindow(iframeId: string): Window | null {\n    const iframe = this.iframes.get(iframeId);\n    return iframe?.contentWindow || null;\n  }\n\n  /**\n   * Destroy an iframe\n   */\n  destroy(iframeId: string): void {\n    const iframe = this.iframes.get(iframeId);\n    if (iframe) {\n      iframe.remove();\n      this.iframes.delete(iframeId);\n    }\n  }\n\n  /**\n   * Destroy all iframes\n   */\n  destroyAll(): void {\n    for (const [id] of this.iframes) {\n      this.destroy(id);\n    }\n  }\n\n  /**\n   * Get the base URL\n   */\n  getBaseUrl(): string {\n    return this.baseUrl;\n  }\n}\n","import type {\n  AuthPayload,\n  EmbedAction,\n  EmbedError,\n  EmbedMessage,\n  LocalePayload,\n  MessageType,\n  NavigatePayload,\n  ThemePayload,\n} from \"./types\";\n\ntype MessageCallback = (message: EmbedMessage) => void;\n\n/**\n * Handles postMessage communication between parent window and embed iframe\n */\nexport class MessageHandler {\n  private readonly targetOrigin: string;\n  private readonly callbacks: Map<MessageType, Set<MessageCallback>> = new Map();\n  private readonly pendingRequests: Map<\n    string,\n    { resolve: (value: unknown) => void; reject: (reason: unknown) => void }\n  > = new Map();\n  private messageCounter = 0;\n  private readonly boundMessageHandler: (event: MessageEvent) => void;\n\n  constructor(targetOrigin: string) {\n    this.targetOrigin = targetOrigin;\n    this.boundMessageHandler = this.handleMessage.bind(this);\n    window.addEventListener(\"message\", this.boundMessageHandler);\n  }\n\n  /**\n   * Generate a unique message ID\n   */\n  private generateMessageId(): string {\n    return `msg_${Date.now()}_${++this.messageCounter}`;\n  }\n\n  /**\n   * Handle incoming postMessage events\n   */\n  private handleMessage(event: MessageEvent): void {\n    // Validate origin\n    if (event.origin !== this.targetOrigin) {\n      return;\n    }\n\n    const message = event.data as EmbedMessage;\n    if (!message || !message.type) {\n      return;\n    }\n\n    // Handle pending request responses\n    if (message.messageId && this.pendingRequests.has(message.messageId)) {\n      const pending = this.pendingRequests.get(message.messageId)!;\n      this.pendingRequests.delete(message.messageId);\n\n      if (message.type === \"EMBED_ERROR\") {\n        pending.reject(message.payload);\n      } else {\n        pending.resolve(message.payload);\n      }\n      return;\n    }\n\n    // Dispatch to registered callbacks\n    const callbacks = this.callbacks.get(message.type);\n    if (callbacks) {\n      for (const callback of callbacks) {\n        try {\n          callback(message);\n        } catch (error) {\n          console.error(\"[SpaceInvoices] Error in message callback:\", error);\n        }\n      }\n    }\n  }\n\n  /**\n   * Send a message to the iframe\n   */\n  send(target: Window | null, type: MessageType, payload?: unknown, messageId?: string): void {\n    if (!target) {\n      console.warn(\"[SpaceInvoices] Cannot send message: target window is null\");\n      return;\n    }\n\n    const message: EmbedMessage = {\n      type,\n      payload,\n      messageId,\n    };\n\n    target.postMessage(message, this.targetOrigin);\n  }\n\n  /**\n   * Send a message and wait for a response\n   */\n  sendAndWait<T = unknown>(target: Window | null, type: MessageType, payload?: unknown, timeoutMs = 30000): Promise<T> {\n    return new Promise((resolve, reject) => {\n      if (!target) {\n        reject(new Error(\"Target window is null\"));\n        return;\n      }\n\n      const messageId = this.generateMessageId();\n\n      // Set up timeout\n      const timeout = setTimeout(() => {\n        this.pendingRequests.delete(messageId);\n        reject(new Error(`Message timeout: ${type}`));\n      }, timeoutMs);\n\n      // Store pending request\n      this.pendingRequests.set(messageId, {\n        resolve: (value) => {\n          clearTimeout(timeout);\n          resolve(value as T);\n        },\n        reject: (reason) => {\n          clearTimeout(timeout);\n          reject(reason);\n        },\n      });\n\n      // Send message\n      this.send(target, type, payload, messageId);\n    });\n  }\n\n  /**\n   * Subscribe to a message type\n   */\n  on(type: MessageType, callback: MessageCallback): () => void {\n    if (!this.callbacks.has(type)) {\n      this.callbacks.set(type, new Set());\n    }\n    this.callbacks.get(type)!.add(callback);\n\n    // Return unsubscribe function\n    return () => {\n      const callbacks = this.callbacks.get(type);\n      if (callbacks) {\n        callbacks.delete(callback);\n      }\n    };\n  }\n\n  /**\n   * Unsubscribe from a message type\n   */\n  off(type: MessageType, callback?: MessageCallback): void {\n    if (callback) {\n      const callbacks = this.callbacks.get(type);\n      if (callbacks) {\n        callbacks.delete(callback);\n      }\n    } else {\n      this.callbacks.delete(type);\n    }\n  }\n\n  /**\n   * Clean up event listeners\n   */\n  destroy(): void {\n    window.removeEventListener(\"message\", this.boundMessageHandler);\n    this.callbacks.clear();\n    this.pendingRequests.clear();\n  }\n\n  // Convenience methods for specific message types\n\n  /**\n   * Send authentication credentials\n   */\n  sendAuth(target: Window | null, payload: AuthPayload): Promise<void> {\n    return this.sendAndWait(target, \"EMBED_AUTH\", payload);\n  }\n\n  /**\n   * Send theme update\n   */\n  sendThemeUpdate(target: Window | null, payload: ThemePayload): void {\n    this.send(target, \"EMBED_THEME_UPDATE\", payload);\n  }\n\n  /**\n   * Send locale update\n   */\n  sendLocaleUpdate(target: Window | null, payload: LocalePayload): void {\n    this.send(target, \"EMBED_LOCALE_UPDATE\", payload);\n  }\n\n  /**\n   * Send navigation request\n   */\n  sendNavigate(target: Window | null, payload: NavigatePayload): void {\n    this.send(target, \"EMBED_NAVIGATE\", payload);\n  }\n\n  /**\n   * Request close\n   */\n  sendClose(target: Window | null): void {\n    this.send(target, \"EMBED_CLOSE\");\n  }\n\n  /**\n   * Subscribe to ready events\n   */\n  onReady(callback: () => void): () => void {\n    return this.on(\"EMBED_READY\", () => callback());\n  }\n\n  /**\n   * Subscribe to action events\n   */\n  onAction(callback: (action: EmbedAction) => void): () => void {\n    return this.on(\"EMBED_ACTION\", (message) => {\n      callback(message.payload as EmbedAction);\n    });\n  }\n\n  /**\n   * Subscribe to error events\n   */\n  onError(callback: (error: EmbedError) => void): () => void {\n    return this.on(\"EMBED_ERROR\", (message) => {\n      callback(message.payload as EmbedError);\n    });\n  }\n}\n","import { IframeManager } from \"./iframe-manager\";\nimport { MessageHandler } from \"./message-handler\";\nimport type { EmbedInstance, EmbedLocale, EmbedView, OpenOptions, SpaceInvoicesConfig, ThemeConfig } from \"./types\";\n\nconst DEFAULT_BASE_URL = \"https://app.spaceinvoices.com\";\n\n/**\n * Main SpaceInvoices embed SDK class\n *\n * @example\n * ```ts\n * const si = new SpaceInvoices({\n *   apiKey: 'ek_live_...',\n *   entityId: 'ent_123',\n *   theme: {\n *     primary: '#6366f1',\n *     radius: 8,\n *   },\n *   onAction: (action) => console.log('Action:', action),\n * });\n *\n * // Open invoice list\n * si.open('invoices');\n *\n * // Create new invoice\n * si.open('invoice/new');\n *\n * // View specific invoice\n * si.open('invoice', { id: 'inv_123' });\n * ```\n */\nexport class SpaceInvoices {\n  private readonly config: SpaceInvoicesConfig;\n  private readonly iframeManager: IframeManager;\n  private readonly messageHandler: MessageHandler;\n  private currentInstance: EmbedInstance | null = null;\n  private isReady = false;\n  private readyPromise: Promise<void> | null = null;\n  private readyResolve: (() => void) | null = null;\n\n  constructor(config: SpaceInvoicesConfig) {\n    this.validateConfig(config);\n\n    this.config = {\n      ...config,\n      baseUrl: config.baseUrl || DEFAULT_BASE_URL,\n    };\n\n    // Initialize managers\n    this.iframeManager = new IframeManager({\n      baseUrl: this.config.baseUrl!,\n      apiKey: this.config.apiKey,\n      entityId: this.config.entityId,\n      theme: this.config.theme,\n      locale: this.config.locale,\n    });\n\n    this.messageHandler = new MessageHandler(new URL(this.config.baseUrl!).origin);\n\n    // Set up message handlers\n    this.setupMessageHandlers();\n  }\n\n  /**\n   * Validate configuration\n   */\n  private validateConfig(config: SpaceInvoicesConfig): void {\n    if (!config.apiKey) {\n      throw new Error(\"[SpaceInvoices] apiKey is required\");\n    }\n\n    // Only allow entity API keys (ek_*) for security - they're scoped to a single entity\n    if (!config.apiKey.startsWith(\"ek_\")) {\n      throw new Error(\n        \"[SpaceInvoices] Invalid apiKey format. Expected entity API key (ek_live_* or ek_test_*). Create one at Settings > API Keys.\",\n      );\n    }\n\n    if (!config.entityId) {\n      throw new Error(\"[SpaceInvoices] entityId is required\");\n    }\n  }\n\n  /**\n   * Set up message event handlers\n   */\n  private setupMessageHandlers(): void {\n    // Handle ready event\n    this.messageHandler.onReady(() => {\n      this.isReady = true;\n      this.readyResolve?.();\n      this.config.onReady?.();\n    });\n\n    // Handle action events\n    this.messageHandler.onAction((action) => {\n      this.config.onAction?.(action);\n\n      // Handle close request\n      if (action.type === \"close_requested\") {\n        this.close();\n      }\n    });\n\n    // Handle error events\n    this.messageHandler.onError((error) => {\n      this.config.onError?.(error);\n    });\n  }\n\n  /**\n   * Wait for the embed to be ready\n   */\n  private waitForReady(): Promise<void> {\n    if (this.isReady) {\n      return Promise.resolve();\n    }\n\n    if (!this.readyPromise) {\n      this.readyPromise = new Promise((resolve) => {\n        this.readyResolve = resolve;\n      });\n    }\n\n    return this.readyPromise;\n  }\n\n  /**\n   * Open a view in a container\n   *\n   * @param view - The view to open (e.g., 'invoices', 'invoice/new', 'invoice')\n   * @param options - Options including container selector and view-specific options\n   * @returns The embed instance\n   */\n  open(view: EmbedView, options?: OpenOptions & { container?: string | HTMLElement }): EmbedInstance {\n    // Close existing instance if any\n    if (this.currentInstance) {\n      this.close();\n    }\n\n    // Default container\n    const container = options?.container || \"#space-invoices-embed\";\n    const containerEl = typeof container === \"string\" ? document.querySelector<HTMLElement>(container) : container;\n\n    if (!containerEl) {\n      throw new Error(`[SpaceInvoices] Container not found: ${container}`);\n    }\n\n    // Reset ready state\n    this.isReady = false;\n    this.readyPromise = null;\n    this.readyResolve = null;\n\n    // Create iframe\n    const iframe = this.iframeManager.create(containerEl, view, options);\n    const iframeId = iframe.id;\n\n    // Create instance\n    this.currentInstance = {\n      id: iframeId,\n      container: containerEl,\n      iframe,\n      view,\n      unmount: () => this.close(),\n      navigate: (newView, newOptions) => this.navigate(newView, newOptions),\n      updateTheme: (theme) => this.updateTheme(theme),\n    };\n\n    return this.currentInstance;\n  }\n\n  /**\n   * Navigate to a different view within the current embed\n   */\n  navigate(view: EmbedView, options?: OpenOptions): void {\n    if (!this.currentInstance) {\n      console.warn(\"[SpaceInvoices] No active embed to navigate\");\n      return;\n    }\n\n    // Update via postMessage if ready, otherwise reload iframe\n    if (this.isReady) {\n      this.messageHandler.sendNavigate(this.iframeManager.getWindow(this.currentInstance.id), { view, options });\n    } else {\n      this.iframeManager.navigate(this.currentInstance.id, view, options);\n    }\n\n    this.currentInstance.view = view;\n  }\n\n  /**\n   * Update theme colors dynamically\n   */\n  updateTheme(theme: ThemeConfig): void {\n    if (!this.currentInstance) {\n      console.warn(\"[SpaceInvoices] No active embed to update theme\");\n      return;\n    }\n\n    // Update stored theme\n    this.iframeManager.updateTheme(this.currentInstance.id, theme);\n\n    // Send theme update via postMessage\n    if (this.isReady) {\n      this.messageHandler.sendThemeUpdate(this.iframeManager.getWindow(this.currentInstance.id), { theme });\n    }\n  }\n\n  /**\n   * Set locale dynamically\n   */\n  setLocale(locale: EmbedLocale): void {\n    if (!this.currentInstance) {\n      console.warn(\"[SpaceInvoices] No active embed to update locale\");\n      return;\n    }\n\n    // Send locale update via postMessage\n    if (this.isReady) {\n      this.messageHandler.sendLocaleUpdate(this.iframeManager.getWindow(this.currentInstance.id), { locale });\n    }\n  }\n\n  /**\n   * Close and unmount the current embed\n   */\n  close(): void {\n    if (this.currentInstance) {\n      this.iframeManager.destroy(this.currentInstance.id);\n      this.currentInstance = null;\n      this.isReady = false;\n      this.readyPromise = null;\n      this.readyResolve = null;\n      this.config.onClose?.();\n    }\n  }\n\n  /**\n   * Get the current embed instance\n   */\n  getInstance(): EmbedInstance | null {\n    return this.currentInstance;\n  }\n\n  /**\n   * Check if embed is ready\n   */\n  ready(): Promise<void> {\n    return this.waitForReady();\n  }\n\n  /**\n   * Destroy the SDK instance and clean up resources\n   */\n  destroy(): void {\n    this.close();\n    this.messageHandler.destroy();\n    this.iframeManager.destroyAll();\n  }\n}\n"]}