{"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","RESERVED_SEARCH_PARAM_KEYS","IframeManager","options","view","path","url","themeParams","key","value","rawValue","values","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","DEFAULT_BASE_URL_WARNING","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\nconst RESERVED_SEARCH_PARAM_KEYS = new Set([\"api_key\", \"entity_id\", \"locale\", \"prefill\"]);\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/branding\":\n        return \"/embed/settings/branding\";\n      case \"settings/defaults\":\n        return \"/embed/settings/defaults\";\n      case \"settings/email\":\n        return \"/embed/settings/email\";\n      case \"settings/numbering\":\n        return \"/embed/settings/numbering\";\n      case \"settings/tax\":\n        return \"/embed/settings/tax\";\n      case \"settings/eslog\":\n        return \"/embed/settings/eslog\";\n      case \"settings/pt-atcud\":\n        return \"/embed/settings/pt-atcud\";\n      case \"settings/furs\":\n        return \"/embed/settings/furs\";\n      case \"settings/fina\":\n        return \"/embed/settings/fina\";\n      case \"settings/e-invoicing\":\n        return \"/embed/settings/e-invoicing\";\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    if (options?.searchParams) {\n      for (const [key, rawValue] of Object.entries(options.searchParams)) {\n        if (rawValue === undefined || rawValue === null) continue;\n        if (RESERVED_SEARCH_PARAM_KEYS.has(key) || key.startsWith(\"theme_\")) continue;\n\n        const values = Array.isArray(rawValue) ? rawValue : [rawValue];\n        for (const value of values) {\n          url.searchParams.append(key, String(value));\n        }\n      }\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\";\nconst DEFAULT_BASE_URL_WARNING =\n  \"[SpaceInvoices] Using default Space Invoices host. White-label branding requires a white-label `baseUrl`.\";\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    if (!config.baseUrl) {\n      console.warn(DEFAULT_BASE_URL_WARNING);\n    }\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"]}