{"version":3,"file":"index.mjs","sources":["../src/utils/utils.ts","../src/utils/sanitize-html.ts","../src/components/courier-inbox-list-item-menu.ts","../src/datastore/inbox-dataset.ts","../src/datastore/inbox-datastore.ts","../src/components/courier-inbox-list-item.ts","../src/components/courier-inbox-skeleton-list-item.ts","../src/components/courier-inbox-skeleton-list.ts","../src/components/courier-inbox-pagination-list-item.ts","../src/utils/extensions.ts","../src/types/inbox-defaults.ts","../src/components/courier-inbox-list.ts","../src/components/courier-unread-count-badge.ts","../src/components/courier-inbox-feed-button.ts","../src/components/courier-inbox-tabs.ts","../src/components/courier-inbox-option-menu-item.ts","../src/components/courier-inbox-option-menu.ts","../src/components/courier-inbox-header.ts","../src/datastore/datastore-listener.ts","../src/types/courier-inbox-theme.ts","../src/types/courier-inbox-theme-manager.ts","../src/components/courier-inbox.ts","../src/components/courier-inbox-menu-button.ts","../src/components/courier-inbox-popup-menu.ts","../src/datastore/datatore-events.ts","../src/index.ts"],"sourcesContent":["import { InboxMessage, InboxAction } from \"@trycourier/courier-js\";\nimport { InboxDataSet } from \"../types/inbox-data-set\";\n\n/**\n * Copy a message\n * @param message - The message to copy\n * @returns A copy of the message\n */\nexport function copyMessage(message: InboxMessage): InboxMessage {\n  const copy = {\n    ...message,\n  };\n\n  if (message.actions) {\n    copy.actions = message.actions.map(action => copyInboxAction(action));\n  }\n\n  if (message.data) {\n    copy.data = JSON.parse(JSON.stringify(message.data));\n  }\n\n  if (message.tags) {\n    copy.tags = [...message.tags];\n  }\n\n  if (message.trackingIds) {\n    copy.trackingIds = { ...message.trackingIds };\n  }\n\n  return copy;\n}\n\n/**\n * Copy an inbox action\n * @param action - The inbox action to copy\n * @returns A copy of the inbox action\n */\nexport function copyInboxAction(action: InboxAction): InboxAction {\n  const copy = {\n    ...action,\n  };\n\n  if (action.data) {\n    copy.data = JSON.parse(JSON.stringify(action.data));\n  }\n\n  return copy;\n}\n\n/**\n * Copy an inbox data set\n * @param dataSet - The inbox data set to copy\n * @returns A copy of the inbox data set\n */\nexport function copyInboxDataSet(dataSet?: InboxDataSet): InboxDataSet | undefined {\n\n  if (!dataSet) {\n    return undefined;\n  }\n\n  return {\n    ...dataSet,\n    messages: dataSet.messages.map(message => copyMessage(message)),\n  };\n\n}\n\n/**\n * Compare the mutable fields of two InboxMessages.\n * @param message1 - The first inbox message to compare\n * @param message2 - The second inbox message to compare\n * @returns True if the mutable fields are equal, false otherwise\n */\nexport function mutableInboxMessageFieldsEqual(message1: InboxMessage, message2: InboxMessage): boolean {\n  // Compare only mutable state fields\n  if (message1.archived !== message2.archived) {\n    return false;\n  }\n  if (message1.read !== message2.read) {\n    return false;\n  }\n  if (message1.opened !== message2.opened) {\n    return false;\n  }\n\n  return true;\n}\n\nexport function getMessageTime(message: InboxMessage): string {\n  if (!message.created) {\n    return 'Now';\n  }\n\n  const now = new Date();\n  const messageDate = new Date(message.created);\n  const diffInSeconds = Math.floor((now.getTime() - messageDate.getTime()) / 1000);\n\n  if (diffInSeconds < 5) {\n    return 'Now';\n  }\n  if (diffInSeconds < 60) {\n    return `${diffInSeconds}s`;\n  }\n  if (diffInSeconds < 3600) {\n    return `${Math.floor(diffInSeconds / 60)}m`;\n  }\n  if (diffInSeconds < 86400) {\n    return `${Math.floor(diffInSeconds / 3600)}h`;\n  }\n  if (diffInSeconds < 604800) {\n    return `${Math.floor(diffInSeconds / 86400)}d`;\n  }\n  if (diffInSeconds < 31536000) {\n    return `${Math.floor(diffInSeconds / 604800)}w`;\n  }\n  return `${Math.floor(diffInSeconds / 31536000)}y`;\n}\n","/**\n * Escapes HTML special characters for safe text content.\n */\nfunction escapeHtml(text: string): string {\n  const map: Record<string, string> = {\n    '&': '&amp;',\n    '<': '&lt;',\n    '>': '&gt;',\n    '\"': '&quot;',\n    \"'\": '&#039;',\n  };\n  return String(text).replace(/[&<>\"']/g, (c) => map[c] ?? c);\n}\n\n/**\n * Escapes a string for safe use in an HTML attribute (e.g. href).\n */\nfunction escapeAttr(value: string): string {\n  return escapeHtml(value).replace(/\\n/g, ' ');\n}\n\n/**\n * Returns true if the string looks like it contains HTML (e.g. from markdown link conversion).\n */\nexport function looksLikeHtml(str: string): boolean {\n  if (!str || typeof str !== 'string') return false;\n  return /<[a-z][\\s\\S]*>/i.test(str);\n}\n\n/** Class and cursor for subtitle/title links; full styling from theme via list item CSS (inbox.list.item.subtitleLink). */\nconst LINK_ATTRS = ' class=\"courier-inbox-subtitle-link\" style=\"cursor: pointer;\"';\n\n/**\n * Converts plain text into HTML by making links clickable:\n * - Markdown links [link text](https://url) become <a> tags\n * - Bare http(s) URLs become <a> tags\n * Non-link text is escaped. Use with sanitizeHtmlForInbox for safe display.\n */\nexport function linkifyPlainText(text: string): string {\n  if (typeof text !== 'string' || !text) return '';\n\n  // Match either markdown link or bare URL (markdown first so we don't double-wrap)\n  const combinedRegex = /\\[([^\\]]*)\\]\\((https?:\\/\\/[^\\s)]+)\\)|(https?:\\/\\/[^\\s<>\"']+)/gi;\n  const parts: string[] = [];\n  let lastIndex = 0;\n  let match: RegExpExecArray | null;\n  combinedRegex.lastIndex = 0;\n  while ((match = combinedRegex.exec(text)) !== null) {\n    parts.push(escapeHtml(text.slice(lastIndex, match.index)));\n    const mdText = match[1];\n    const mdUrl = match[2];\n    const bareUrl = match[3];\n    if (mdUrl !== undefined) {\n      // Markdown link [text](url)\n      const safeUrl = escapeAttr(mdUrl);\n      const safeText = escapeHtml(mdText ?? mdUrl);\n      parts.push(`<a href=\"${safeUrl}\" target=\"_blank\" rel=\"noopener noreferrer\"${LINK_ATTRS}>${safeText}</a>`);\n    } else if (bareUrl !== undefined) {\n      // Bare URL\n      const safeUrl = escapeAttr(bareUrl);\n      parts.push(`<a href=\"${safeUrl}\" target=\"_blank\" rel=\"noopener noreferrer\"${LINK_ATTRS}>${escapeHtml(bareUrl)}</a>`);\n    }\n    lastIndex = match.index + match[0].length;\n  }\n  parts.push(escapeHtml(text.slice(lastIndex)));\n  return parts.join('');\n}\n\n/**\n * Normalizes malformed preview HTML (markdown in href, broken target/rel) before parsing.\n */\nfunction normalizePreviewHtml(html: string): string {\n  let out = html;\n  out = out.replace(\n    /href\\s*=\\s*[\"']?\\[[^\\]]*\\]\\s*\\(\\s*(https?:\\/\\/[^\\s)]+)\\s*\\)/gi,\n    (_: string, url: string) => `href=\"${url}\"`\n  );\n  out = out.replace(/target\\s*=\\s*[\"']?\\+?blank[\"']?/gi, 'target=\"_blank\"');\n  out = out.replace(/rel\\s*=\\s*[\"']?noopener\\s+no\\s*referrer[\"']?/gi, 'rel=\"noopener noreferrer\"');\n  out = out.replace(/rel\\s*=\\s*[\"']?noopener\\s*noreferrer[\"']?/gi, 'rel=\"noopener noreferrer\"');\n  out = out.replace(/rel\\s*=\\s*[\"']?noopener[\"']?/gi, 'rel=\"noopener noreferrer\"');\n  return out;\n}\n\n/**\n * Sanitizes HTML for safe display in the inbox. Only allows <a> tags with http(s) href.\n * Normalizes malformed preview HTML first (e.g. markdown in href, target=\"+blank\").\n * All other tags are stripped; their content is preserved as escaped text.\n */\nexport function sanitizeHtmlForInbox(html: string): string {\n  if (typeof html !== 'string') return '';\n  if (!html.trim()) return '';\n\n  const normalized = normalizePreviewHtml(html);\n\n  try {\n    const parser = typeof DOMParser !== 'undefined' ? new DOMParser() : null;\n    if (!parser) return escapeHtml(html);\n\n    const doc = parser.parseFromString(normalized, 'text/html');\n\n    function walk(node: Node): string {\n      if (node.nodeType === Node.TEXT_NODE) {\n        return escapeHtml(node.textContent ?? '');\n      }\n      if (node.nodeType !== Node.ELEMENT_NODE) return '';\n\n      const el = node as Element;\n      const tagName = el.tagName.toUpperCase();\n\n      if (tagName === 'A') {\n        const href = el.getAttribute('href') ?? '';\n        if (/^https?:\\/\\//i.test(href)) {\n          const safeHref = escapeAttr(href);\n          const inner = Array.from(el.childNodes).map(walk).join('');\n          return `<a href=\"${safeHref}\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"courier-inbox-subtitle-link\" style=\"cursor: pointer;\">${inner}</a>`;\n        }\n      }\n\n      return Array.from(el.childNodes).map(walk).join('');\n    }\n\n    return Array.from(doc.body.childNodes).map(walk).join('');\n  } catch {\n    return escapeHtml(normalized);\n  }\n}\n","import { CourierBaseElement, CourierIconButton, registerElement } from '@trycourier/courier-ui-core';\nimport { CourierInboxIconTheme, CourierInboxTheme } from '../types/courier-inbox-theme';\n\nexport type CourierInboxListItemActionMenuOption = {\n  id: string;\n  icon: CourierInboxIconTheme;\n  onClick: () => void;\n};\n\nexport class CourierInboxListItemMenu extends CourierBaseElement {\n\n  static get id(): string {\n    return 'courier-inbox-list-item-menu';\n  }\n\n  // State\n  private _theme: CourierInboxTheme;\n  private _options: CourierInboxListItemActionMenuOption[] = [];\n\n  constructor(theme: CourierInboxTheme) {\n    super();\n    this._theme = theme;\n  }\n\n  onComponentMounted() {\n    const menu = document.createElement('ul');\n    menu.className = 'menu';\n    this.appendChild(menu);\n  }\n\n  static getStyles(theme: CourierInboxTheme): string {\n\n    const menu = theme.inbox?.list?.item?.menu;\n    const transition = menu?.animation;\n    const initialTransform = transition?.initialTransform ?? 'translate3d(0, 0, 0)';\n    const visibleTransform = transition?.visibleTransform ?? 'translate3d(0, 0, 0)';\n\n    return `\n      ${CourierInboxListItemMenu.id} {\n        display: none;\n        position: absolute;\n        background: ${menu?.backgroundColor ?? 'red'};\n        border: ${menu?.border ?? '1px solid red'};\n        border-radius: ${menu?.borderRadius ?? '0px'};\n        box-shadow: ${menu?.shadow ?? '0 2px 8px red'};\n        user-select: none;\n        opacity: 0;\n        pointer-events: none;\n        transition: ${transition?.transition ?? 'all 0.2s ease'};\n        overflow: hidden;\n        transform: ${initialTransform};\n        will-change: transform, opacity;\n      }\n\n      ${CourierInboxListItemMenu.id}.visible {\n        opacity: 1;\n        pointer-events: auto;\n        transform: ${visibleTransform};\n      }\n\n      ${CourierInboxListItemMenu.id} ul.menu {\n        list-style: none;\n        margin: 0;\n        padding: 0;\n        display: flex;\n        flex-direction: row;\n      }\n\n      ${CourierInboxListItemMenu.id} li.menu-item {\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        cursor: pointer;\n        border-bottom: none;\n        background: transparent;\n        touch-action: none;\n      }\n    `;\n  }\n\n  setOptions(options: CourierInboxListItemActionMenuOption[]) {\n    this._options = options;\n    this.renderMenu();\n  }\n\n  private renderMenu() {\n    // Clear existing menu items\n    const menu = this.querySelector('ul.menu');\n    if (!menu) return;\n    menu.innerHTML = '';\n    const menuTheme = this._theme.inbox?.list?.item?.menu;\n\n    // Prevent click events from propagating outside of this menu\n    const cancelEvent = (e: Event) => {\n      e.stopPropagation();\n      // Only preventDefault on touchstart to prevent context menu and other default behaviors\n      // touchmove doesn't need preventDefault since CSS touch-action handles scrolling\n      if (e.type === 'touchstart' || e.type === 'mousedown') {\n        e.preventDefault();\n      }\n    };\n\n    // Create new menu items\n    this._options.forEach((opt) => {\n      const icon = new CourierIconButton(opt.icon.svg, opt.icon.color, menuTheme?.backgroundColor, menuTheme?.item?.hoverBackgroundColor, menuTheme?.item?.activeBackgroundColor, menuTheme?.item?.borderRadius);\n\n      // Handle both click and touch events\n      const handleInteraction = (e: Event) => {\n        e.stopPropagation();\n        opt.onClick();\n      };\n\n      // Add click handler for desktop\n      icon.addEventListener('click', handleInteraction);\n\n      // Add touch handlers for mobile\n      // touchstart needs preventDefault for context menu prevention, so use passive: false\n      icon.addEventListener('touchstart', cancelEvent, { passive: false });\n      icon.addEventListener('touchend', handleInteraction, { passive: true });\n\n      // touchmove can be passive since CSS touch-action: none prevents scrolling\n      icon.addEventListener('touchmove', (e: Event) => {\n        e.stopPropagation();\n      }, { passive: true });\n\n      // Prevent mouse events from interfering\n      icon.addEventListener('mousedown', cancelEvent);\n      icon.addEventListener('mouseup', cancelEvent);\n\n      menu.appendChild(icon);\n    });\n  }\n\n  show() {\n    // Set display first\n    this.style.display = 'block';\n    this.classList.remove('visible');\n\n    // Trigger transition on next frame\n    requestAnimationFrame(() => {\n      requestAnimationFrame(() => {\n        this.classList.add('visible');\n      });\n    });\n  }\n\n  hide() {\n    // Remove visible class to trigger transition\n    this.classList.remove('visible');\n\n    // Wait for transition to complete, then set display none\n    const handleTransitionEnd = (e: TransitionEvent) => {\n      if (e.target !== this) return;\n      if (!this.classList.contains('visible')) {\n        this.style.display = 'none';\n        this.removeEventListener('transitionend', handleTransitionEnd);\n      }\n    };\n\n    this.addEventListener('transitionend', handleTransitionEnd);\n  }\n}\n\nregisterElement(CourierInboxListItemMenu);","import { Courier, InboxMessage } from \"@trycourier/courier-js\";\nimport { copyMessage, mutableInboxMessageFieldsEqual } from \"../utils/utils\";\nimport { CourierInboxDatasetFilter, InboxDataSet } from \"../types/inbox-data-set\";\nimport { CourierGetInboxMessagesQueryFilter } from \"@trycourier/courier-js/dist/types/inbox\";\nimport { CourierInboxDataStoreListener } from \"./datastore-listener\";\nimport { CourierInboxDatastore } from \"./inbox-datastore\";\n\nexport class CourierInboxDataset {\n  /** The unique ID for this dataset, provided by the consumer to later identify this set of messages. */\n  private _id: string;\n\n  /** The set of messages in this dataset. */\n  private _messages: InboxMessage[] = [];\n\n  /**\n   * True if the first fetch of messages has completed successfully.\n   *\n   * This marker is used to distinguish if _messages can be returned when cached messages\n   * are acceptable, since an empty array of messages could indicate they weren't\n   * ever fetched or that they were fetched but there are currently none in the dataset.\n   */\n  private _firstFetchComplete: boolean = false;\n\n  /** True if the fetched dataset sets hasNextPage to true. */\n  private _hasNextPage: boolean = false;\n\n  /**\n   * The pagination cursor to pass to subsequent fetch requests\n   * or null if this is the first request or a response has indicated\n   * there is no next page.\n   */\n  private _lastPaginationCursor?: string;\n\n  private readonly _filter: CourierInboxDatasetFilter;\n  private readonly _datastoreListeners: CourierInboxDataStoreListener[] = [];\n\n  /**\n   * The total unread count loaded before messages are fetched.\n   * Used to show unread badge counts on tabs before the user clicks into them.\n   *\n   * Total unread count is maintained manually (rather than derived from _messages) because:\n   *\n   * 1. We load unread counts for all tabs in view before their messages are loaded.\n   * 2. The set of loaded messages may not fully reflect the unread count for a tab.\n   *    Messages are paginated, so unread messages may be present on the server but\n   *    but not on the client.\n   */\n  private _totalUnreadCount: number = 0;\n\n  public constructor(\n    id: string,\n    filter: CourierInboxDatasetFilter,\n  ) {\n    this._id = id;\n\n    // Make a copy of the input filters so this dataset's filters are immutable.\n    this._filter = {\n      tags: filter.tags ? [...(filter.tags)] : undefined,\n      archived: filter.archived || false,\n      status: filter.status\n    };\n  }\n\n  /** Get the current total unread count. */\n  get totalUnreadCount(): number {\n    return this._totalUnreadCount;\n  }\n\n  /** Private setter for unread count. */\n  private set totalUnreadCount(count: number) {\n    this._totalUnreadCount = count > 0 ? count : 0;\n  }\n\n  /**\n   * Set the unread count explicitly.\n   * Used for batch loading unread counts for all datasets before messages are fetched.\n   */\n  public setUnreadCount(count: number): void {\n    this.totalUnreadCount = count;\n    this._datastoreListeners.forEach(listener => {\n      listener.events.onUnreadCountChange?.(count, this._id);\n      listener.events.onTotalUnreadCountChange?.(CourierInboxDatastore.shared.totalUnreadCount);\n    });\n  }\n\n  /**\n   * Get the filter configuration for this dataset.\n   * Used for batch loading unread counts.\n   */\n  public getFilter(): CourierGetInboxMessagesQueryFilter {\n    return {\n      tags: this._filter.tags,\n      archived: this._filter.archived,\n      status: this._filter.status,\n    };\n  }\n\n  /**\n   * Add a message to the dataset if it qualifies based on the dataset's filters.\n   *\n   * @param message the message to add\n   * @returns true if the message was added, otherwise false\n   */\n  addMessage(message: InboxMessage, insertIndex: number = 0): boolean {\n    const messageCopy = copyMessage(message);\n    if (this.messageQualifiesForDataset(messageCopy)) {\n      this._messages.splice(insertIndex, 0, messageCopy);\n\n      if (!messageCopy.read) {\n        this.totalUnreadCount += 1;\n      }\n\n      this._datastoreListeners.forEach(listener => {\n        listener.events.onMessageAdd?.(messageCopy, insertIndex, this._id);\n        listener.events.onUnreadCountChange?.(this.totalUnreadCount, this._id);\n        listener.events.onTotalUnreadCountChange?.(CourierInboxDatastore.shared.totalUnreadCount);\n      });\n\n      return true;\n    }\n\n    return false;\n  }\n\n  /**\n   * Update the messages and unread count for the dataset based on a change in a message.\n   *\n   * Based on a message's change (unread -> read, archived -> unarchived, etc) this method\n   * inserts, updates, removes, or excludes it from the dataset. Given the before/existing\n   * and after states, it updates the unread count.\n   *\n   * The before state identifies messages that would qualify for the dataset\n   * before the dataset (or a particular message in the dataset) has been loaded.\n   * These messages may not be explicitly removed from the dataset since they aren't\n   * yet present, but may have an effect on the unread count.\n   *\n   * @param beforeMessage the message before the change\n   * @param afterMessage the message after the change\n   * @returns true if afterMessage qualifies for the dataset and was inserted or updated, false if the message was removed\n   */\n  updateWithMessageChange(beforeMessage: InboxMessage, afterMessage: InboxMessage): boolean {\n    const index = this.indexOfMessage(afterMessage);\n    const existingMessage = this._messages[index];\n    const newMessage = copyMessage(afterMessage);\n\n    // The message was already inserted or updated\n    // Exit early to prevent double-counting changes to the unread count\n    if (existingMessage && mutableInboxMessageFieldsEqual(existingMessage, newMessage)) {\n      return true;\n    }\n\n    // Message is already in dataset but hasn't been updated yet\n    if (existingMessage) {\n\n      // Message still qualifies for dataset after mutation\n      // Update it in place and modify unread count based on the state change\n      if (this.messageQualifiesForDataset(newMessage)) {\n        const unreadChange = this.calculateUnreadChange(existingMessage, newMessage);\n\n        this._messages.splice(index, 1, newMessage);\n        this.totalUnreadCount += unreadChange;\n\n        this._datastoreListeners.forEach(listener => {\n          listener.events.onMessageUpdate?.(newMessage, index, this._id);\n          listener.events.onUnreadCountChange?.(this.totalUnreadCount, this._id);\n          listener.events.onTotalUnreadCountChange?.(CourierInboxDatastore.shared.totalUnreadCount);\n        });\n\n        return true;\n      }\n\n      // Message no longer qualifies for dataset\n      // Remove it, which may also update unread count\n      this.removeMessage(existingMessage);\n      return false;\n    }\n\n    // Message is not yet in the dataset\n    // Check if the after-mutation message qualifies for this dataset\n    if (this.messageQualifiesForDataset(afterMessage)) {\n\n      // Add the message to the dataset\n      // We re-implement the addMessage logic here since the unreadCount change logic differs\n      // from the public method\n      const insertIndex = this.findInsertIndex(afterMessage);\n      this._messages.splice(insertIndex, 0, copyMessage(afterMessage));\n\n      // Calculate unread count change based on the transition\n      const beforeQualifies = this.messageQualifiesForDataset(beforeMessage);\n      const unreadChange = beforeQualifies\n        // If beforeMessage qualified but wasn't present, this is a state change and could either\n        // increment or decrement the unread count\n        ? this.calculateUnreadChange(beforeMessage, afterMessage)\n\n        // If beforeMessage didn't qualify, this is a new message to this dataset\n        // Update unread count based on afterMessage's read state\n        : (!afterMessage.read ? 1 : 0);\n\n      this.totalUnreadCount += unreadChange;\n\n      this._datastoreListeners.forEach(listener => {\n        listener.events.onMessageAdd?.(afterMessage, insertIndex, this._id);\n        listener.events.onUnreadCountChange?.(this.totalUnreadCount, this._id);\n        listener.events.onTotalUnreadCountChange?.(CourierInboxDatastore.shared.totalUnreadCount);\n      });\n\n      return true;\n    }\n\n    // At this point the message was neither updated, removed, nor added.\n    // We know afterMessage does NOT qualify for this dataset (checked above).\n    // We must still determine if the mutation affects the unread count for this dataset.\n    //\n    // Consider the scenario where the unread count for this dataset has been loaded, but its messages have not.\n    // In another dataset, a message which affects the unread count here is mutated (marked read, archived, etc).\n    // We should update the unread count, even though the message hasn't been loaded here yet.\n\n    const beforeQualifies = this.messageQualifiesForDataset(beforeMessage);\n    if (beforeQualifies) {\n\n      // beforeMessage qualified for this dataset but afterMessage does not.\n      // If beforeMessage was unread, it contributed to the count and should be decremented.\n      if (!beforeMessage.read) {\n        this.totalUnreadCount -= 1;\n      }\n\n      this._datastoreListeners.forEach(listener => {\n        listener.events.onUnreadCountChange?.(this.totalUnreadCount, this._id);\n        listener.events.onTotalUnreadCountChange?.(CourierInboxDatastore.shared.totalUnreadCount);\n      });\n    }\n\n    return false;\n  }\n\n  private calculateUnreadChange(beforeMessage: InboxMessage, afterMessage: InboxMessage): number {\n    // Message transitioned from read to unread\n    if (beforeMessage.read && !afterMessage.read) {\n      return 1;\n    }\n\n    // Message transitioned from unread to read\n    if (!beforeMessage.read && afterMessage.read) {\n      return -1;\n    }\n\n    // Message did not change read states\n    return 0;\n  }\n\n  /**\n   * Remove the specified message from this dataset, if it's present.\n   *\n   * @param message the message to remove from this dataset\n   * @returns true if the message was removed, else false\n   */\n  removeMessage(message: InboxMessage): boolean {\n    const indexToRemove = this.indexOfMessage(message);\n    if (indexToRemove > -1) {\n      this._messages.splice(indexToRemove, 1);\n\n      if (!message.read) {\n        this.totalUnreadCount -= 1;\n      }\n\n      this._datastoreListeners.forEach(listener => {\n        listener.events.onMessageRemove?.(message, indexToRemove, this._id);\n        listener.events.onUnreadCountChange?.(this.totalUnreadCount, this._id);\n        listener.events.onTotalUnreadCountChange?.(CourierInboxDatastore.shared.totalUnreadCount);\n      });\n\n      return true;\n    }\n\n    return false;\n  }\n\n  getMessage(messageId: string): InboxMessage | undefined {\n    return this._messages.find(message => message.messageId === messageId);\n  }\n\n  async loadDataset(canUseCache: boolean): Promise<void> {\n    // Returned cached data if it's requested and available\n    if (canUseCache && this._firstFetchComplete) {\n      this._datastoreListeners.forEach(listener => {\n        listener.events.onDataSetChange?.(this.toInboxDataset());\n        listener.events.onUnreadCountChange?.(this.totalUnreadCount, this._id);\n        listener.events.onTotalUnreadCountChange?.(CourierInboxDatastore.shared.totalUnreadCount);\n      });\n      return;\n    }\n\n    const fetchedDataset = await this.fetchMessages();\n\n    // Unpack response and call listeners\n    this._messages = [...fetchedDataset.messages];\n    this.totalUnreadCount = fetchedDataset.unreadCount;\n    this._hasNextPage = fetchedDataset.canPaginate;\n    this._lastPaginationCursor = fetchedDataset.paginationCursor ?? undefined;\n    this._firstFetchComplete = true;\n\n    this._datastoreListeners.forEach(listener => {\n      listener.events.onDataSetChange?.(this.toInboxDataset());\n      listener.events.onUnreadCountChange?.(this.totalUnreadCount, this._id);\n      listener.events.onTotalUnreadCountChange?.(CourierInboxDatastore.shared.totalUnreadCount);\n    });\n  }\n\n  async fetchNextPageOfMessages(): Promise<InboxDataSet | null> {\n    if (!this._hasNextPage) {\n      return null;\n    }\n\n    const fetchedDataset = await this.fetchMessages(this._lastPaginationCursor);\n\n    // Unpack response and call listeners\n    this._messages = [...this._messages, ...fetchedDataset.messages];\n    this._hasNextPage = fetchedDataset.canPaginate;\n    this._lastPaginationCursor = fetchedDataset.paginationCursor ?? undefined;\n    this._firstFetchComplete = true;\n\n    this._datastoreListeners.forEach(listener => {\n      listener.events.onDataSetChange?.(this.toInboxDataset());\n      listener.events.onUnreadCountChange?.(this.totalUnreadCount, this._id);\n      listener.events.onPageAdded?.(fetchedDataset);\n      listener.events.onTotalUnreadCountChange?.(CourierInboxDatastore.shared.totalUnreadCount);\n    });\n\n    return fetchedDataset;\n  }\n\n  addDatastoreListener(listener: CourierInboxDataStoreListener): void {\n    this._datastoreListeners.push(listener);\n  }\n\n  removeDatastoreListener(listener: CourierInboxDataStoreListener): void {\n    const index = this._datastoreListeners.indexOf(listener);\n\n    if (index > -1) {\n      this._datastoreListeners.splice(index, 1);\n    }\n  }\n\n  toInboxDataset(): InboxDataSet {\n    return {\n      id: this._id,\n      messages: [...this._messages],\n      unreadCount: this.totalUnreadCount,\n      canPaginate: this._hasNextPage,\n      paginationCursor: this._lastPaginationCursor ?? null\n    };\n  }\n\n  private async fetchMessages(startCursor?: string): Promise<InboxDataSet> {\n    const client = Courier.shared.client;\n\n    if (!client?.options.userId) {\n      throw new Error('User is not signed in');\n    }\n\n    const response = await client.inbox.getMessages({\n      paginationLimit: Courier.shared.paginationLimit,\n      startCursor,\n      filter: this.getFilter(),\n    });\n\n    return {\n      id: this._id,\n      messages: [...(response.data?.messages?.nodes ?? [])],\n      unreadCount: response.data?.unreadCount ?? 0,\n      canPaginate: response.data?.messages?.pageInfo?.hasNextPage ?? false,\n      paginationCursor: response.data?.messages?.pageInfo?.startCursor ?? null,\n    }\n  }\n\n  private indexOfMessage(message: InboxMessage): number {\n    return this._messages.findIndex(m => m.messageId === message.messageId);\n  }\n\n  /**\n   * Find the insert index for a new message in a data set\n   * @param newMessage - The new message to insert\n   * @param dataSet - The data set to insert the message into\n   * @returns The index to insert the message at\n   */\n  private findInsertIndex(newMessage: InboxMessage): number {\n    const messages = this._messages;\n\n    for (let i = 0; i < messages.length; i++) {\n      const message = messages[i];\n      if (message.created && newMessage.created && message.created < newMessage.created) {\n        return i;\n      }\n    }\n\n    return messages.length;\n  }\n\n  private messageQualifiesForDataset(message: InboxMessage): boolean {\n    // Is the message archived state compatible with the dataset?\n    if (message.archived && !this._filter.archived ||\n      !message.archived && this._filter.archived) {\n      return false;\n    }\n\n    // Is the message read state compatible with the dataset?\n    if (message.read && this._filter.status === 'unread' ||\n      !message.read && this._filter.status === 'read') {\n      return false;\n    }\n\n    // At this point, the message and dataset have compatible\n    // read and archived states.\n\n    // If the dataset requires tags, does the message have tags?\n    if (this._filter.tags && !message.tags) {\n      return false;\n    }\n\n    // Does one of the message's tags match this dataset's tags?\n    if (this._filter.tags && message.tags) {\n      for (const tag of this._filter.tags) {\n        if (message.tags.includes(tag)) {\n          return true;\n        }\n      }\n      return false;\n    }\n\n    // Either:\n    //  - dataset and message have no tags\n    //  - dataset doesn't require tags and\n    //    the dataset and message have compatible read and archived states\n    return true;\n  }\n\n  /**\n   * Restore this dataset from a snapshot.\n   *\n   * Note: _firstFetchComplete does not need to be restored\n   * as it indicates specific lifecycle stages for the dataset.\n   */\n  public restoreFromSnapshot(snapshot: InboxDataSet): void {\n    this._messages = snapshot.messages.map(m => copyMessage(m));\n\n    this.totalUnreadCount = snapshot.unreadCount;\n    this._hasNextPage = snapshot.canPaginate;\n    this._lastPaginationCursor = snapshot.paginationCursor ?? undefined;\n\n    this._datastoreListeners.forEach(listener => {\n      listener.events.onDataSetChange?.(snapshot);\n      listener.events.onUnreadCountChange?.(this.totalUnreadCount, this._id);\n      listener.events.onTotalUnreadCountChange?.(CourierInboxDatastore.shared.totalUnreadCount);\n    });\n  }\n}\n","import { Courier, InboxMessage, InboxMessageEvent, InboxMessageEventEnvelope } from \"@trycourier/courier-js\";\nimport { CourierGetInboxMessagesQueryFilter } from \"@trycourier/courier-js/dist/types/inbox\";\nimport { CourierInboxDatasetFilter, CourierInboxFeed, InboxDataSet } from \"../types/inbox-data-set\";\nimport { CourierInboxDataset } from \"./inbox-dataset\";\nimport { CourierInboxDataStoreListener } from \"./datastore-listener\";\nimport { copyInboxDataSet, copyMessage } from \"../utils/utils\";\n\n/**\n * Snapshot of a single dataset's state for rollback purposes\n */\ninterface DatasetSnapshot {\n  id: string;\n  dataset: InboxDataSet;\n}\n\n/**\n * Snapshot of the entire datastore state for rollback purposes\n */\ninterface DatastoreSnapshot {\n  datasets: DatasetSnapshot[];\n  globalMessages: Map<string, InboxMessage>;\n}\n\n/**\n * Shared datastore for Inbox components.\n *\n * CourierInboxDatastore is a singleton. Use `CourierInboxDatastore.shared`\n * to access the shared instance.\n *\n * @public\n */\nexport class CourierInboxDatastore {\n  private static readonly TAG = \"CourierInboxDatastore\";\n  private static readonly OPEN_BATCH_DELAY_MS = 100;\n  private static readonly OPEN_BATCH_MAX_SIZE = 50;\n\n  private static instance: CourierInboxDatastore;\n\n  private _datasets: Map<string, CourierInboxDataset> = new Map();\n  private _listeners: CourierInboxDataStoreListener[] = [];\n  private _removeMessageEventListener?: () => void;\n  private _pendingOpenMessageIds = new Set<string>();\n  private _openBatchTimer: ReturnType<typeof setTimeout> | null = null;\n\n  /**\n   * Global message store is a map of Message ID to Message for all messages\n   * that have been loaded.\n   *\n   * This acts as the source of truth to apply messages mutations to a message\n   * given its ID and propagate those mutations to individual datasets.\n   */\n  private _globalMessages = new Map<string, InboxMessage>();\n\n  /** Access CourierInboxDatastore through {@link CourierInboxDatastore.shared} */\n  private constructor() { }\n\n  /**\n   * Instantiate the datastore with the feeds specified.\n   *\n   * Feeds are added to the datastore as datasets. Each feed has a respective\n   * dataset. Existing datasets will be cleared before the feeds specified are added.\n   *\n   * @param feeds - The feeds with which to instantiate the datastore\n   */\n  public registerFeeds(feeds: CourierInboxFeed[]): void {\n    const datasets = new Map<string, CourierInboxDatasetFilter>(\n      feeds.flatMap(feed => feed.tabs).map(tab => [tab.datasetId, tab.filter])\n    );\n\n    this.createDatasetsFromFilters(datasets);\n  }\n\n  private createDatasetsFromFilters(filters: Map<string, CourierInboxDatasetFilter>): void {\n    this.clearDatasets();\n\n    for (let [id, filter] of filters) {\n      const dataset = new CourierInboxDataset(id, filter);\n\n      // Re-attach all existing listeners to the new dataset\n      for (let listener of this._listeners) {\n        dataset.addDatastoreListener(listener);\n      }\n\n      this._datasets.set(id, dataset);\n    }\n  }\n\n  /**\n   * Add a message to the datastore.\n   *\n   * The message will be added to any datasets for which it qualifies.\n   *\n   * @param message - The message to add\n   */\n  public addMessage(message: InboxMessage) {\n    // Add to global store\n    this._globalMessages.set(message.messageId, message);\n\n    // Add to all qualifying datasets\n    for (let dataset of this._datasets.values()) {\n      dataset.addMessage(message);\n    }\n  }\n\n  private updateDatasetsWithMessageChange(beforeMessage: InboxMessage, afterMessage: InboxMessage) {\n    for (let dataset of this._datasets.values()) {\n      dataset.updateWithMessageChange(beforeMessage, afterMessage);\n    }\n  }\n\n  /**\n   * Listen for real-time message updates from the Courier backend.\n   *\n   * If an existing WebSocket connection is open, it will be re-used. If not,\n   * a new connection will be opened.\n   */\n  public async listenForUpdates() {\n    const socket = Courier.shared.client?.inbox.socket;\n\n    if (!socket) {\n      Courier.shared.client?.options.logger?.info('CourierInbox socket not available');\n      return;\n    }\n\n    try {\n      // Remove any existing listener before adding a new one.\n      // This both prevents multiple listeners from being added to the same WebSocket client\n      // and makes sure the listener is on the current WebSocket client (rather than maintaining\n      // one from a stale client).\n      if (this._removeMessageEventListener) {\n        this._removeMessageEventListener();\n      }\n\n      this._removeMessageEventListener = socket.addMessageEventListener(event => this.handleMessageEvent(event));\n\n      // If the socket is already connecting or open, return early\n      if (socket.isConnecting || socket.isOpen) {\n        Courier.shared.client?.options.logger?.info(`Inbox socket already connecting or open for client ID: [${Courier.shared.client?.options.connectionId}]`);\n        return;\n      }\n\n      // Connect to the socket. By default, the socket will subscribe to all events for the user after opening.\n      await socket.connect();\n      Courier.shared.client?.options.logger?.info(`Inbox socket connected for client ID: [${Courier.shared.client?.options.connectionId}]`);\n    } catch (error) {\n      Courier.shared.client?.options.logger?.error('Failed to connect socket:', error);\n    }\n  }\n\n  /**\n   * Load unread counts for multiple tabs in a single GraphQL query.\n   * This populates tab badges without loading messages.\n   * @param tabIds - Array of tab IDs to load counts for\n   */\n  public async loadUnreadCountsForTabs(tabIds: string[]): Promise<void> {\n    const client = Courier.shared.client;\n    if (!client) {\n      return;\n    }\n\n    // Build filters map for the specified tabs\n    const filtersMap: Record<string, CourierGetInboxMessagesQueryFilter> = {};\n    for (const tabId of tabIds) {\n      const dataset = this._datasets.get(tabId);\n      if (dataset) {\n        filtersMap[tabId] = dataset.getFilter();\n      }\n    }\n\n    if (Object.keys(filtersMap).length === 0) {\n      return;\n    }\n\n    const counts = await client.inbox.getUnreadCounts(filtersMap);\n\n    // Update datasets with the fetched counts\n    for (const [tabId, count] of Object.entries(counts)) {\n      const dataset = this._datasets.get(tabId);\n\n      // If datasets changed out while the request was in progress,\n      // we'll update a dataset with the same ID, but otherwise pass through\n      if (dataset) {\n        dataset.setUnreadCount(count);\n      }\n    }\n  }\n\n  /**\n   * Add a datastore listener, whose callbacks will be called in response to various message events.\n   * @param listener - The listener instance to add\n   */\n  public addDataStoreListener(listener: CourierInboxDataStoreListener): void {\n    this._listeners.push(listener);\n\n    for (let dataset of this._datasets.values()) {\n      dataset.addDatastoreListener(listener);\n    }\n  }\n\n  /**\n   * Remove a datastore listener.\n   * @param listener - The listener instance to remove\n   */\n  public removeDataStoreListener(listener: CourierInboxDataStoreListener): void {\n    this._listeners = this._listeners.filter(l => l !== listener);\n\n    for (let dataset of this._datasets.values()) {\n      dataset.removeDatastoreListener(listener);\n    }\n  }\n\n  /**\n   * Mark a message as read.\n   * @param message - The message to mark as read\n   */\n  public async readMessage({ message }: { message: InboxMessage }): Promise<void> {\n    // Don't mark as read if already read\n    if (message.read) {\n      return;\n    }\n\n    const beforeMessage = this._globalMessages.get(message.messageId);\n    if (!beforeMessage) {\n      return;\n    }\n\n    await this.executeWithRollback(async () => {\n      // Mutate in global store\n      const afterMessage = copyMessage(beforeMessage);\n      afterMessage.read = CourierInboxDatastore.getISONow();\n      this._globalMessages.set(message.messageId, afterMessage);\n\n      // Update all datasets\n      this.updateDatasetsWithMessageChange(beforeMessage, afterMessage);\n\n      // Apply the read to the server\n      await Courier.shared.client?.inbox.read({ messageId: message.messageId });\n    });\n  }\n\n  /**\n   * Mark a message as unread.\n   * @param message - The message to mark as unread\n   */\n  public async unreadMessage({ message }: { message: InboxMessage }): Promise<void> {\n    // Don't mark as unread if already unread\n    if (!message.read) {\n      return;\n    }\n\n    const beforeMessage = this._globalMessages.get(message.messageId);\n    if (!beforeMessage) {\n      return;\n    }\n\n    await this.executeWithRollback(async () => {\n      // Mutate in global store\n      const afterMessage = copyMessage(beforeMessage);\n      afterMessage.read = undefined;\n      this._globalMessages.set(message.messageId, afterMessage);\n\n      // Update all datasets\n      this.updateDatasetsWithMessageChange(beforeMessage, afterMessage);\n\n      // Apply the unread to the server\n      await Courier.shared.client?.inbox.unread({ messageId: message.messageId });\n    });\n  }\n\n  /**\n   * Mark a message as opened.\n   *\n   * The local state is updated optimistically and the server call is\n   * batched: multiple opens arriving within a short window\n   * are collected and flushed as a single GraphQL request.\n   *\n   * @param message - The message to mark as opened\n   */\n  public openMessage({ message }: { message: InboxMessage }): void {\n    if (message.opened) {\n      return;\n    }\n\n    const beforeMessage = this._globalMessages.get(message.messageId);\n    if (!beforeMessage || beforeMessage.opened) {\n      return;\n    }\n\n    // Optimistic update\n    const afterMessage = copyMessage(beforeMessage);\n    afterMessage.opened = CourierInboxDatastore.getISONow();\n    this._globalMessages.set(message.messageId, afterMessage);\n    this.updateDatasetsWithMessageChange(beforeMessage, afterMessage);\n\n    // Queue for batched server call\n    this._pendingOpenMessageIds.add(message.messageId);\n    this.scheduleBatchOpen();\n  }\n\n  private scheduleBatchOpen(): void {\n    if (this._openBatchTimer !== null) {\n      clearTimeout(this._openBatchTimer);\n    }\n\n    this._openBatchTimer = setTimeout(() => {\n      this.flushBatchOpen();\n    }, CourierInboxDatastore.OPEN_BATCH_DELAY_MS);\n  }\n\n  private async flushBatchOpen(): Promise<void> {\n    this._openBatchTimer = null;\n\n    const messageIds = Array.from(this._pendingOpenMessageIds);\n    this._pendingOpenMessageIds.clear();\n\n    if (messageIds.length === 0) return;\n\n    const maxSize = CourierInboxDatastore.OPEN_BATCH_MAX_SIZE;\n    const chunks: string[][] = [];\n    for (let i = 0; i < messageIds.length; i += maxSize) {\n      chunks.push(messageIds.slice(i, i + maxSize));\n    }\n\n    try {\n      await Promise.all(\n        chunks.map(chunk => Courier.shared.client?.inbox.batchOpen(chunk))\n      );\n    } catch (error) {\n      Courier.shared.client?.options.logger?.error(\n        `[${CourierInboxDatastore.TAG}] Error batch opening messages:`, error\n      );\n\n      this._listeners.forEach(listener => {\n        listener.events.onError?.(error as Error);\n      });\n    }\n  }\n\n  /**\n   * Unarchive a message.\n   * @param message - The message to unarchive\n   */\n  public async unarchiveMessage({ message }: { message: InboxMessage }): Promise<void> {\n    // Don't unarchive if already unarchived\n    if (!message.archived) {\n      return;\n    }\n\n    const beforeMessage = this._globalMessages.get(message.messageId);\n    if (!beforeMessage) {\n      return;\n    }\n\n    await this.executeWithRollback(async () => {\n      // Mutate in global store\n      const afterMessage = copyMessage(beforeMessage);\n      afterMessage.archived = undefined;\n      this._globalMessages.set(message.messageId, afterMessage);\n\n      // Update all datasets\n      this.updateDatasetsWithMessageChange(beforeMessage, afterMessage);\n\n      // Apply the unarchive to the server\n      await Courier.shared.client?.inbox.unarchive({ messageId: message.messageId });\n    });\n  }\n\n  /**\n   * Archive a message.\n   * @param message - The message to archive\n   */\n  public async archiveMessage({ message }: { message: InboxMessage }): Promise<void> {\n    // Don't archive if already archived\n    if (message.archived) {\n      return;\n    }\n\n    const beforeMessage = this._globalMessages.get(message.messageId);\n    if (!beforeMessage) {\n      return;\n    }\n\n    await this.executeWithRollback(async () => {\n      // Mutate in global store\n      const afterMessage = copyMessage(beforeMessage);\n      afterMessage.archived = CourierInboxDatastore.getISONow();\n      this._globalMessages.set(message.messageId, afterMessage);\n\n      // Update all datasets\n      this.updateDatasetsWithMessageChange(beforeMessage, afterMessage);\n\n      // Apply the archive to the server\n      await Courier.shared.client?.inbox.archive({ messageId: message.messageId });\n    });\n  }\n\n  /**\n   * Track a click event for a message.\n   * @param message - The message that was clicked\n   */\n  public async clickMessage({ message }: { message: InboxMessage }): Promise<void> {\n    // Clicking a message does not mutate it locally, but we still want error handling\n    if (message.trackingIds?.clickTrackingId) {\n      try {\n        await Courier.shared.client?.inbox.click({\n          messageId: message.messageId,\n          trackingId: message.trackingIds.clickTrackingId\n        });\n      } catch (error) {\n        // Log error\n        Courier.shared.client?.options.logger?.error(`[${CourierInboxDatastore.TAG}] Error clicking message:`, error);\n\n        // Notify listeners of error\n        this._listeners.forEach(listener => {\n          listener.events.onError?.(error as Error);\n        });\n\n        // Do NOT re-throw - swallow the error\n      }\n    }\n  }\n\n  /**\n   * Archive all messages for the specified dataset.\n   */\n  public async archiveAllMessages(): Promise<void> {\n    await this.executeWithRollback(async () => {\n      const archiveDate = CourierInboxDatastore.getISONow();\n\n      // Mutate all messages in global store that aren't already archived\n      for (const [messageId, beforeMessage] of this._globalMessages.entries()) {\n        if (!beforeMessage.archived) {\n          const afterMessage = copyMessage(beforeMessage);\n          afterMessage.archived = archiveDate;\n          this._globalMessages.set(messageId, afterMessage);\n          this.updateDatasetsWithMessageChange(beforeMessage, afterMessage);\n        }\n      }\n\n      // Force non-archived dataset unread counts to 0.\n      // The loop above only decrements for messages in _globalMessages, but\n      // _totalUnreadCount may include server-reported counts for unloaded pages.\n      for (const dataset of this._datasets.values()) {\n        if (!dataset.getFilter().archived) {\n          dataset.setUnreadCount(0);\n        }\n      }\n\n      // Apply the archive to the server\n      await Courier.shared.client?.inbox.archiveAll();\n    });\n  }\n\n  /**\n   * Mark all messages read across all datasets.\n   */\n  public async readAllMessages(): Promise<void> {\n    await this.executeWithRollback(async () => {\n      const readDate = CourierInboxDatastore.getISONow();\n\n      // Mutate all messages in global store that aren't already read\n      for (const [messageId, beforeMessage] of this._globalMessages.entries()) {\n        if (!beforeMessage.read) {\n          const afterMessage = copyMessage(beforeMessage);\n          afterMessage.read = readDate;\n          this._globalMessages.set(messageId, afterMessage);\n          this.updateDatasetsWithMessageChange(beforeMessage, afterMessage);\n        }\n      }\n\n      // Force all dataset unread counts to 0.\n      // The loop above only decrements for messages in _globalMessages, but\n      // _totalUnreadCount may include server-reported counts for unloaded pages.\n      for (const dataset of this._datasets.values()) {\n        dataset.setUnreadCount(0);\n      }\n\n      // Apply the read to the server\n      await Courier.shared.client?.inbox.readAll();\n    });\n  }\n\n  /**\n   * Archive all read messages for the specified dataset.\n   */\n  public async archiveReadMessages(): Promise<void> {\n    await this.executeWithRollback(async () => {\n      const archiveDate = CourierInboxDatastore.getISONow();\n\n      // Mutate all read messages in global store that aren't already archived\n      for (const [messageId, beforeMessage] of this._globalMessages.entries()) {\n        if (beforeMessage.read && !beforeMessage.archived) {\n          const afterMessage = copyMessage(beforeMessage);\n          afterMessage.archived = archiveDate;\n          this._globalMessages.set(messageId, afterMessage);\n          this.updateDatasetsWithMessageChange(beforeMessage, afterMessage);\n        }\n      }\n\n      // Apply the archive to the server\n      await Courier.shared.client?.inbox.archiveRead();\n    });\n  }\n\n  /**\n   * Load datasets from the backend.\n   *\n   * Props:\n   *  - canUseCache: If true and the dataset has already been loaded once, this will return the dataset from memory.\n   *  - datasetIds: Optional: The set of dataset IDs to load. If unset, all known datasets will be loaded.\n   *\n   * @param props - Options to load datasets, see method documentation\n   */\n  public async load(props?: { canUseCache: boolean, datasetIds?: string[] }): Promise<void> {\n    const client = Courier.shared.client;\n\n    if (!client?.options.userId) {\n      throw new Error('[Datastore] User is not signed in');\n    }\n\n    const canUseCache = props?.canUseCache ?? true;\n\n    if (props?.datasetIds) {\n      // flatMap asserts all members are defined\n      const datasets: CourierInboxDataset[] = props.datasetIds.flatMap(id => {\n        const dataset = this._datasets.get(id);\n        return dataset ? [dataset] : [];\n      });\n\n      return await this.loadDatasets({ canUseCache, datasets });\n    }\n\n    return await this.loadDatasets({\n      canUseCache,\n      datasets: Array.from(this._datasets.values()),\n    });\n  }\n\n  private async loadDatasets(props: { canUseCache: boolean, datasets: CourierInboxDataset[] }): Promise<void> {\n    await Promise.all(props.datasets.map(async (dataset) => {\n      await dataset.loadDataset(props.canUseCache);\n      // Sync loaded messages to global store\n      this.syncDatasetMessagesToGlobalStore(dataset);\n    }));\n  }\n\n  /**\n   * Sync messages from a dataset to the global message store.\n   * This is called after datasets load messages to ensure the global store has all messages.\n   */\n  private syncDatasetMessagesToGlobalStore(dataset: CourierInboxDataset): void {\n    const datasetState = dataset.toInboxDataset();\n    for (const message of datasetState.messages) {\n      // Only add if not already in global store (don't overwrite)\n      if (!this._globalMessages.has(message.messageId)) {\n        this._globalMessages.set(message.messageId, message);\n      }\n    }\n  }\n\n  /**\n   * Fetch the next page of messages for the specified feed or datasetId.\n   *\n   * feedType is deprecated and will be removed in the next major release.\n   * Please migrate to pass the same identifier as datasetId.\n   * While both options are present, exactly one is required.\n   *\n   * @param props - Options to fetch the next page of messages, see method documetation\n   */\n  public async fetchNextPageOfMessages(props: { feedType?: string, datasetId?: string }): Promise<InboxDataSet | null> {\n    const client = Courier.shared.client;\n\n    if (!client?.options.userId) {\n      throw new Error('User is not signed in');\n    }\n\n    let datasetIdToFetch: string;\n    if (props.feedType && !props.datasetId) {\n      Courier.shared.client?.options.logger.warn(`[${CourierInboxDatastore.TAG}] feedType is deprecated and` +\n        `will be removed in the next major version. Please update callers to use datasetIds.`);\n      datasetIdToFetch = props.feedType;\n    } else if (props.datasetId) {\n      datasetIdToFetch = props.datasetId;\n    } else {\n      throw new Error(`[${CourierInboxDatastore.TAG}] Exactly one of feedType or datasetId is required to call fetchNextPageOfMessages.`);\n    }\n\n    const datasetToFetch = this._datasets.get(datasetIdToFetch);\n    if (!datasetToFetch) {\n      throw new Error(`[${CourierInboxDatastore.TAG}] Attempted to fetch next page of messages for dataset ${datasetIdToFetch}, but the dataset does not exist.`);\n    }\n\n    return this.fetchNextPageForDataset({ dataset: datasetToFetch });\n  }\n\n  /**\n   * Get the {@link InboxDataSet} representation of the dataset ID specified.\n   * @param datasetId - The dataset ID to get\n   */\n  public getDatasetById(datasetId: string): InboxDataSet | undefined {\n    return this._datasets.get(datasetId)?.toInboxDataset();\n  }\n\n  /**\n   * Get datasets currently in the datastore.\n   * @returns A record mapping dataset IDs to their InboxDataSet representations\n   */\n  public getDatasets(): Record<string, InboxDataSet> {\n    const datasets: Record<string, InboxDataSet> = {};\n    for (const [id, dataset] of this._datasets.entries()) {\n      datasets[id] = dataset.toInboxDataset();\n    }\n    return datasets;\n  }\n\n  /**\n   * Get the total unread count across all datasets.\n   */\n  public get totalUnreadCount(): number {\n    let unreadCount = 0;\n    for (let dataset of this._datasets.values()) {\n      unreadCount += dataset.totalUnreadCount;\n    }\n\n    return unreadCount;\n  }\n\n  private async fetchNextPageForDataset(props: { dataset: CourierInboxDataset }): Promise<InboxDataSet | null> {\n    const result = await props.dataset.fetchNextPageOfMessages();\n    if (result) {\n      // Sync newly loaded messages to global store\n      this.syncDatasetMessagesToGlobalStore(props.dataset);\n    }\n    return result;\n  }\n\n  private handleMessageEvent(envelope: InboxMessageEventEnvelope) {\n    const event = envelope.event;\n\n    // Handle new message\n    if (event === InboxMessageEvent.NewMessage) {\n      const message = envelope.data as InboxMessage;\n      this._globalMessages.set(message.messageId, message);\n      for (let dataset of this._datasets.values()) {\n        dataset.addMessage(message);\n      }\n      return;\n    }\n\n    // Handle all-messages updates\n    const isAllMessagesEvent = event === InboxMessageEvent.ArchiveAll ||\n      event === InboxMessageEvent.ArchiveRead ||\n      event === InboxMessageEvent.MarkAllRead;\n    if (isAllMessagesEvent) {\n      this.updateAllMessages(event);\n      return;\n    }\n\n    // Handle single-message update\n    const messageId = envelope.messageId;\n    if (messageId) {\n      this.updateMessage(messageId, event);\n      return;\n    }\n\n    Courier.shared.client?.options.logger?.warn(`[${CourierInboxDatastore.TAG}] Received unexpected event: ${event}`);\n  }\n\n  /**\n   * Update all messages across all datasets from an InboxMessageEvent.\n   * This only handles InboxMessageEvents that do not specify a messageId\n   * and mutate all messages.\n   *\n   * Related: {@link CourierInboxDatastore.updateMessage}\n   */\n  private updateAllMessages(event: InboxMessageEvent) {\n    const timestamp = CourierInboxDatastore.getISONow();\n\n    for (const [messageId, beforeMessage] of this._globalMessages.entries()) {\n      let afterMessage: InboxMessage | null = null;\n\n      switch (event) {\n        case InboxMessageEvent.MarkAllRead:\n          if (!beforeMessage.read) {\n            afterMessage = copyMessage(beforeMessage);\n            afterMessage.read = timestamp;\n          }\n          break;\n        case InboxMessageEvent.ArchiveAll:\n          if (!beforeMessage.archived) {\n            afterMessage = copyMessage(beforeMessage);\n            afterMessage.archived = timestamp;\n          }\n          break;\n        case InboxMessageEvent.ArchiveRead:\n          if (beforeMessage.read && !beforeMessage.archived) {\n            afterMessage = copyMessage(beforeMessage);\n            afterMessage.archived = timestamp;\n          }\n          break;\n        default:\n          break;\n      }\n\n      if (afterMessage) {\n        this._globalMessages.set(messageId, afterMessage);\n        this.updateDatasetsWithMessageChange(beforeMessage, afterMessage);\n      }\n    }\n\n    // Force dataset unread counts to 0 for bulk operations where the loop\n    // only processes messages in _globalMessages but _totalUnreadCount may\n    // include server-reported counts for unloaded pages.\n    if (event === InboxMessageEvent.MarkAllRead) {\n      for (const dataset of this._datasets.values()) {\n        dataset.setUnreadCount(0);\n      }\n    } else if (event === InboxMessageEvent.ArchiveAll) {\n      for (const dataset of this._datasets.values()) {\n        if (!dataset.getFilter().archived) {\n          dataset.setUnreadCount(0);\n        }\n      }\n    }\n  }\n\n  /**\n   * Update a single message across all datasets from an InboxMessageEvent.\n   * This only handles InboxMessageEvents that specify a messageId.\n   *\n   * Related: {@link CourierInboxDatastore.updateAllMessages}\n   */\n  private updateMessage(messageId: string, event: InboxMessageEvent) {\n    // Get the message from global store\n    const beforeMessage = this._globalMessages.get(messageId);\n    if (!beforeMessage) {\n      return;\n    }\n\n    let afterMessage: InboxMessage;\n\n    switch (event) {\n      case InboxMessageEvent.Archive:\n        afterMessage = copyMessage(beforeMessage);\n        afterMessage.archived = CourierInboxDatastore.getISONow();\n        break;\n      case InboxMessageEvent.Opened:\n        afterMessage = copyMessage(beforeMessage);\n        afterMessage.opened = CourierInboxDatastore.getISONow();\n        break;\n      case InboxMessageEvent.Read:\n        afterMessage = copyMessage(beforeMessage);\n        afterMessage.read = CourierInboxDatastore.getISONow();\n        break;\n      case InboxMessageEvent.Unarchive:\n        afterMessage = copyMessage(beforeMessage);\n        afterMessage.archived = undefined;\n        break;\n      case InboxMessageEvent.Unread:\n        afterMessage = copyMessage(beforeMessage);\n        afterMessage.read = undefined;\n        break;\n      case InboxMessageEvent.Clicked:\n      case InboxMessageEvent.Unopened:\n      default:\n        return;\n    }\n\n    // Update global store and propagate to datasets\n    this._globalMessages.set(messageId, afterMessage);\n    this.updateDatasetsWithMessageChange(beforeMessage, afterMessage);\n  }\n\n  private clearDatasets() {\n    this._datasets.clear();\n    this._globalMessages.clear();\n  }\n\n  private static getISONow(): string {\n    return new Date().toISOString();\n  }\n\n  /**\n   * Create a snapshot of all datasets and global messages for rollback purposes.\n   * This captures the current state of all messages and metadata.\n   */\n  private createDatastoreSnapshot(): DatastoreSnapshot {\n    const snapshots: DatasetSnapshot[] = [];\n\n    for (const [id, dataset] of this._datasets.entries()) {\n      const datasetState = dataset.toInboxDataset();\n      if (datasetState) {\n        const copy = copyInboxDataSet(datasetState);\n        if (copy) {\n          snapshots.push({\n            id,\n            dataset: copy\n          });\n        }\n      }\n    }\n\n    // Snapshot global messages\n    const globalMessagesSnapshot = new Map<string, InboxMessage>();\n    for (const [messageId, message] of this._globalMessages.entries()) {\n      globalMessagesSnapshot.set(messageId, copyMessage(message));\n    }\n\n    return {\n      datasets: snapshots,\n      globalMessages: globalMessagesSnapshot\n    };\n  }\n\n  /**\n   * Restore all datasets and global messages from a snapshot, reverting any mutations.\n   * This is used for rollback when API calls or updates to downstream datasets fail.\n   */\n  private restoreDatastoreSnapshot(snapshot: DatastoreSnapshot): void {\n    // Restore global messages\n    this._globalMessages.clear();\n    for (const [messageId, message] of snapshot.globalMessages.entries()) {\n      this._globalMessages.set(messageId, copyMessage(message));\n    }\n\n    // Restore datasets\n    for (const datasetSnapshot of snapshot.datasets) {\n      const dataset = this._datasets.get(datasetSnapshot.id);\n      if (dataset) {\n        dataset.restoreFromSnapshot(datasetSnapshot.dataset);\n      }\n    }\n  }\n\n  /**\n   * Execute an operation with automatic rollback on failure.\n   * Snapshots all datasets before the operation and restores them if the operation throws.\n   *\n   * Note: Errors are caught and logged, but not re-thrown to match the behavior\n   * for backwards compatibility with the legacy (inbox/archive) datastore implementation.\n   *\n   * Note: This method exists at the datastore level (rather than dataset) to handle\n   * errors from API calls.\n   */\n  private async executeWithRollback<T>(\n    operation: () => Promise<T>\n  ): Promise<T | void> {\n    const snapshot = this.createDatastoreSnapshot();\n\n    try {\n      return await operation();\n    } catch (error) {\n      Courier.shared.client?.options.logger?.error(`[${CourierInboxDatastore.TAG}] Error during operation:`, error);\n\n      this.restoreDatastoreSnapshot(snapshot);\n\n      this._listeners.forEach(listener => {\n        listener.events.onError?.(error as Error);\n      });\n    }\n  }\n\n  /**\n   * Get the shared instance of CourierInboxDatastore.\n   *\n   * CourierInboxDatastore is a singleton. Instance methods should be accessed\n   * through this `shared` static accessor.\n   */\n  public static get shared(): CourierInboxDatastore {\n    if (!CourierInboxDatastore.instance) {\n      CourierInboxDatastore.instance = new CourierInboxDatastore();\n    }\n    return CourierInboxDatastore.instance;\n  }\n\n}\n","import { InboxAction, InboxMessage } from \"@trycourier/courier-js\";\nimport { CourierBaseElement, CourierButton, CourierIcon, CourierIconSVGs, registerElement } from \"@trycourier/courier-ui-core\";\nimport { CourierInboxTheme } from \"../types/courier-inbox-theme\";\nimport { getMessageTime } from \"../utils/utils\";\nimport { looksLikeHtml, linkifyPlainText, sanitizeHtmlForInbox } from \"../utils/sanitize-html\";\nimport { CourierInboxListItemMenu, CourierInboxListItemActionMenuOption } from \"./courier-inbox-list-item-menu\";\nimport { CourierInboxDatastore } from \"../datastore/inbox-datastore\";\nimport { CourierInboxThemeManager } from \"../types/courier-inbox-theme-manager\";\nimport { CourierInboxListItemAction } from \"../types/inbox-defaults\";\nimport { CourierInbox } from \"./courier-inbox\";\n\nexport class CourierInboxListItem extends CourierBaseElement {\n\n  static get id(): string {\n    return 'courier-inbox-list-item';\n  }\n\n  // State\n  private _themeManager: CourierInboxThemeManager;\n  private _theme: CourierInboxTheme;\n  private _message: InboxMessage | null = null;\n  private _isMobile: boolean = false;\n  private _canClick: boolean = false;\n  private _listItemActions: CourierInboxListItemAction[] = CourierInbox.defaultListItemActions();\n  // private _canLongPress: boolean = false; // Unused for now. But we can use this in the future if needed.\n\n  // Elements\n  private _titleElement?: HTMLParagraphElement;\n  private _subtitleElement?: HTMLParagraphElement;\n  private _timeElement?: HTMLParagraphElement;\n  private _menu?: CourierInboxListItemMenu;\n  private _unreadIndicator?: HTMLDivElement;\n  private _actionsContainer?: HTMLDivElement;\n\n  // Touch gestures\n  private _longPressTimeout: number | null = null;\n  private _isLongPress: boolean = false;\n\n  // Intersection Observer\n  private _observer?: IntersectionObserver;\n\n  // Callbacks\n  private onItemClick: ((message: InboxMessage) => void) | null = null;\n  private onItemLongPress: ((message: InboxMessage) => void) | null = null;\n  private onItemActionClick: ((message: InboxMessage, action: InboxAction) => void) | null = null;\n  private onItemVisible: ((message: InboxMessage) => void) | null = null;\n\n  constructor(themeManager: CourierInboxThemeManager, canClick: boolean, _canLongPress: boolean, listItemActions?: CourierInboxListItemAction[]) {\n    super();\n    this._canClick = canClick;\n    // this._canLongPress = canLongPress;\n    this._themeManager = themeManager;\n    this._theme = themeManager.getTheme();\n    this._isMobile = 'ontouchstart' in window;\n    if (listItemActions) {\n      this._listItemActions = listItemActions;\n    }\n    this.render();\n    this._setupIntersectionObserver();\n  }\n\n  private render() {\n\n    const contentContainer = document.createElement('div');\n    contentContainer.className = 'content-container';\n\n    // Title\n    this._titleElement = document.createElement('p');\n    this._titleElement.className = 'title';\n\n    // Subtitle\n    this._subtitleElement = document.createElement('p');\n    this._subtitleElement.className = 'subtitle';\n\n    // Actions\n    this._actionsContainer = document.createElement('div');\n    this._actionsContainer.className = 'actions-container';\n\n    contentContainer.appendChild(this._titleElement);\n    contentContainer.appendChild(this._subtitleElement);\n    contentContainer.appendChild(this._actionsContainer);\n\n    // Time\n    this._timeElement = document.createElement('p');\n    this._timeElement.className = 'time';\n\n    // Unread indicator\n    this._unreadIndicator = document.createElement('div');\n    this._unreadIndicator.className = 'unread-indicator';\n\n    // Action menu\n    this._menu = new CourierInboxListItemMenu(this._theme);\n    this._menu.setOptions(this._getMenuOptions());\n\n    // Append elements into shadow‑DOM\n    this.append(this._unreadIndicator, contentContainer, this._timeElement, this._menu);\n\n    const cancelPropagation = (e: Event): void => {\n      e.stopPropagation();\n      e.preventDefault();\n    };\n\n    this._menu.addEventListener('mousedown', cancelPropagation);\n    this._menu.addEventListener('pointerdown', cancelPropagation);\n    this._menu.addEventListener('click', cancelPropagation);\n\n    this.addEventListener('click', (e) => {\n      if (!this._canClick) return;\n      if (this._menu && (this._menu.contains(e.target as Node) || e.composedPath().includes(this._menu))) {\n        return;\n      }\n      if (e.target instanceof HTMLAnchorElement) return;\n      if (this._message && this.onItemClick && !(e.target instanceof CourierIcon) && !this._isLongPress) {\n        this.onItemClick(this._message);\n      }\n    });\n\n    this._setupHoverBehavior();\n    this._setupLongPressBehavior();\n\n    // Enable clickable class if canClick\n    if (this._canClick) {\n      this.classList.add('clickable');\n    }\n\n  }\n\n  private _setupIntersectionObserver(): void {\n    // Only set up if running in browser and IntersectionObserver is available\n    if (typeof window === \"undefined\" || typeof IntersectionObserver === \"undefined\") {\n      return;\n    }\n\n    // Clean up any previous observer\n    if (this._observer) {\n      this._observer.disconnect();\n    }\n\n    this._observer = new IntersectionObserver((entries) => {\n      entries.forEach((entry) => {\n        if (entry.intersectionRatio === 1 && this.onItemVisible && this._message) {\n          this.onItemVisible(this._message);\n        }\n      });\n    }, { threshold: 1.0 });\n\n    this._observer.observe(this);\n  }\n\n  onComponentUnmounted() {\n    this._observer?.disconnect();\n  }\n\n  static getStyles(theme: CourierInboxTheme): string {\n\n    const list = theme.inbox?.list;\n\n    return `\n      ${CourierInboxListItem.id} {\n        display: flex;\n        flex-direction: row;\n        align-items: flex-start;\n        justify-content: space-between;\n        border-bottom: ${list?.item?.divider ?? '1px solid red'};\n        font-family: inherit;\n        cursor: default;\n        transition: ${list?.item?.transition ?? 'all 0.2s ease'};\n        margin: 0;\n        width: 100%;\n        box-sizing: border-box;\n        padding: 12px 20px;\n        position: relative;\n        background-color: ${list?.item?.backgroundColor ?? 'transparent'};\n        user-select: none;\n        -webkit-user-select: none;\n        -moz-user-select: none;\n        -ms-user-select: none;\n        touch-action: manipulation;\n      }\n\n      /* Only apply hover/active background if clickable */\n      @media (hover: hover) {\n        ${CourierInboxListItem.id}.clickable:hover {\n          cursor: pointer;\n          background-color: ${list?.item?.hoverBackgroundColor ?? 'red'};\n        }\n      }\n\n      ${CourierInboxListItem.id}.clickable:active {\n        cursor: pointer;\n        background-color: ${list?.item?.activeBackgroundColor ?? 'red'};\n      }\n\n      /* Menu hover / active */\n      @media (hover: hover) {\n        ${CourierInboxListItem.id}.clickable:hover:has(courier-inbox-list-item-menu:hover, courier-inbox-list-item-menu *:hover, courier-button:hover, courier-button *:hover) {\n          background-color: ${list?.item?.backgroundColor ?? 'transparent'};\n        }\n      }\n\n      ${CourierInboxListItem.id}.clickable:active:has(courier-inbox-list-item-menu:active, courier-inbox-list-item-menu *:active, courier-button:active, courier-button *:active) {\n        background-color: ${list?.item?.backgroundColor ?? 'transparent'};\n      }\n\n      ${CourierInboxListItem.id}:last-child {\n        border-bottom: none;\n      }\n\n      ${CourierInboxListItem.id} .unread-indicator {\n        position: absolute;\n        top: 28px;\n        left: 6px;\n        width: 8px;\n        height: 8px;\n        border-radius: 50%;\n        background-color: ${list?.item?.unreadIndicatorColor ?? 'red'};\n        display: none;\n      }\n\n      ${CourierInboxListItem.id}.unread .unread-indicator {\n        display: block;\n      }\n\n      ${CourierInboxListItem.id} .content-container {\n        flex: 1;\n        display: flex;\n        flex-direction: column;\n        margin-right: 12px;\n      }\n\n      ${CourierInboxListItem.id} p {\n        margin: 0;\n        overflow-wrap: break-word;\n        word-break: break-word;\n        hyphens: auto;\n        line-height: 1.4;\n        user-select: none;\n        -webkit-user-select: none;\n        -moz-user-select: none;\n        -ms-user-select: none;\n        text-align: left;\n      }\n\n      ${CourierInboxListItem.id} .title {\n        font-family: ${list?.item?.title?.family ?? 'inherit'};\n        font-size: ${list?.item?.title?.size ?? '14px'};\n        color: ${list?.item?.title?.color ?? 'red'};\n        margin-bottom: 4px;\n      }\n      ${CourierInboxListItem.id} .title a,\n      ${CourierInboxListItem.id} .title .courier-inbox-subtitle-link {\n        --courier-inbox-subtitle-link-color: ${list?.item?.subtitleLink?.color ?? '#2563EB'};\n        --courier-inbox-subtitle-link-decoration: ${list?.item?.subtitleLink?.textDecoration ?? 'underline'};\n        color: var(--courier-inbox-subtitle-link-color);\n        text-decoration: var(--courier-inbox-subtitle-link-decoration);\n        cursor: pointer;\n      }\n      ${CourierInboxListItem.id} .title a:hover,\n      ${CourierInboxListItem.id} .title .courier-inbox-subtitle-link:hover {\n        color: ${list?.item?.subtitleLink?.hoverColor ?? list?.item?.subtitleLink?.color ?? '#2563EB'};\n      }\n\n      ${CourierInboxListItem.id} .subtitle {\n        font-family: ${list?.item?.subtitle?.family ?? 'inherit'};\n        font-size: ${list?.item?.subtitle?.size ?? '14px'};\n        color: ${list?.item?.subtitle?.color ?? 'red'};\n      }\n\n      ${CourierInboxListItem.id} .subtitle a,\n      ${CourierInboxListItem.id} .subtitle .courier-inbox-subtitle-link {\n        --courier-inbox-subtitle-link-color: ${list?.item?.subtitleLink?.color ?? '#2563EB'};\n        --courier-inbox-subtitle-link-decoration: ${list?.item?.subtitleLink?.textDecoration ?? 'underline'};\n        color: var(--courier-inbox-subtitle-link-color);\n        text-decoration: var(--courier-inbox-subtitle-link-decoration);\n        cursor: pointer;\n      }\n\n      ${CourierInboxListItem.id} .subtitle a:hover,\n      ${CourierInboxListItem.id} .subtitle .courier-inbox-subtitle-link:hover {\n        color: ${list?.item?.subtitleLink?.hoverColor ?? list?.item?.subtitleLink?.color ?? '#2563EB'};\n      }\n\n      ${CourierInboxListItem.id} .time {\n        font-family: ${list?.item?.time?.family ?? 'inherit'};\n        font-size: ${list?.item?.time?.size ?? '14px'};\n        color: ${list?.item?.time?.color ?? 'red'};\n        text-align: right;\n        white-space: nowrap;\n      }\n\n      ${CourierInboxListItem.id} courier-inbox-list-item-menu {\n        z-index: 1;\n        position: absolute;\n        top: 8px;\n        right: 8px;\n        display: none;\n        opacity: 0;\n        transition: opacity 0.2s ease;\n      }\n\n      ${CourierInboxListItem.id} courier-inbox-list-item-menu.visible {\n        opacity: 1;\n      }\n\n      /* Show menu on hover for non-mobile devices - CSS handles this reliably */\n      @media (hover: hover) {\n        ${CourierInboxListItem.id}.clickable:hover courier-inbox-list-item-menu {\n          display: block;\n        }\n        ${CourierInboxListItem.id}.clickable:hover courier-inbox-list-item-menu.visible {\n          display: block;\n        }\n        ${CourierInboxListItem.id}.clickable:hover .time {\n          opacity: 0;\n          transition: opacity 0.2s ease;\n        }\n      }\n\n      ${CourierInboxListItem.id} .actions-container {\n        display: flex;\n        margin-top: 10px;\n        flex-wrap: wrap;\n        flex-direction: row;\n        align-items: center;\n        gap: 8px;\n        display: none;\n      }\n    `;\n\n  }\n\n  private _setupHoverBehavior(): void {\n    // CSS handles hover display for non-mobile devices - just update menu options\n    if (!this._isMobile) {\n      this.addEventListener('mouseenter', () => {\n        this._isLongPress = false;\n        // Update menu options when hovering\n        const menuOptions = this._getMenuOptions();\n        if (menuOptions.length > 0 && this._menu) {\n          this._menu.setOptions(menuOptions);\n          // Trigger show() to add visible class for transitions\n          this._menu.show();\n          if (this._timeElement) {\n            this._timeElement.style.opacity = '0';\n          }\n        }\n      });\n      this.addEventListener('mouseleave', () => {\n        // Hide menu and restore time opacity\n        if (this._menu) {\n          this._menu.hide();\n        }\n        if (this._timeElement) {\n          this._timeElement.style.opacity = '1';\n        }\n      });\n    }\n  }\n\n  private _setupLongPressBehavior(): void {\n    const menu = this._theme.inbox?.list?.item?.menu\n\n    if (!menu?.enabled) {\n      return;\n    }\n\n    const longPress = menu.longPress;\n\n    this.addEventListener(\n      'touchstart',\n      () => {\n        // Start long press timer\n        this._longPressTimeout = window.setTimeout(() => {\n          this._isLongPress = true;\n          this._showMenu();\n          if (this._message && this.onItemLongPress) {\n            this.onItemLongPress(this._message);\n            // Vibrate device if supported\n            if (navigator.vibrate) {\n              navigator.vibrate(longPress?.vibrationDuration ?? 50);\n            }\n          }\n          // Keep the menu visible for 2 s, then hide again\n          setTimeout(() => {\n            this._hideMenu();\n            this._isLongPress = false;\n          }, longPress?.displayDuration ?? 2000);\n        }, 650);\n      },\n      { passive: true },\n    );\n\n    this.addEventListener('touchend', () => {\n      // Clear long press timeout\n      if (this._longPressTimeout) {\n        window.clearTimeout(this._longPressTimeout);\n        this._longPressTimeout = null;\n      }\n    });\n  }\n\n  // Helpers\n  private _getMenuOptions(): CourierInboxListItemActionMenuOption[] {\n    const menuTheme = this._theme.inbox?.list?.item?.menu?.item;\n    let options: CourierInboxListItemActionMenuOption[] = [];\n\n    const isArchived = !!this._message?.archived;\n\n    // Iterate through list item actions in the order they were specified\n    for (const action of this._listItemActions) {\n      switch (action.id) {\n        case 'read_unread':\n          options.push({\n            id: this._message?.read ? 'unread' : 'read',\n            icon: {\n              svg: this._message?.read\n                ? (action.unreadIconSVG ?? menuTheme?.unread?.svg ?? CourierIconSVGs.unread)\n                : (action.readIconSVG ?? menuTheme?.read?.svg ?? CourierIconSVGs.read),\n              color: this._message?.read ? menuTheme?.unread?.color : menuTheme?.read?.color ?? 'red',\n            },\n            onClick: () => {\n              if (this._message) {\n                if (this._message.read) {\n                  CourierInboxDatastore.shared.unreadMessage({ message: this._message });\n                } else {\n                  CourierInboxDatastore.shared.readMessage({ message: this._message });\n                }\n              }\n            },\n          });\n          break;\n        case 'archive_unarchive':\n          options.push({\n            id: isArchived ? 'unarchive' : 'archive',\n            icon: {\n              svg: isArchived\n                ? (action.unarchiveIconSVG ?? menuTheme?.unarchive?.svg ?? CourierIconSVGs.unarchive)\n                : (action.archiveIconSVG ?? menuTheme?.archive?.svg ?? CourierIconSVGs.archive),\n              color: isArchived ? menuTheme?.unarchive?.color : menuTheme?.archive?.color ?? 'red',\n            },\n            onClick: () => {\n              if (this._message) {\n                if (isArchived) {\n                  CourierInboxDatastore.shared.unarchiveMessage({ message: this._message });\n                } else {\n                  CourierInboxDatastore.shared.archiveMessage({ message: this._message });\n                }\n              }\n            },\n          });\n          break;\n      }\n    }\n\n    return options;\n  }\n\n  // Menu visibility helpers\n  private _showMenu(): void {\n    const menu = this._theme.inbox?.list?.item?.menu;\n    const menuOptions = this._getMenuOptions();\n\n    // Don't show menu if there are no actions enabled\n    if (menuOptions.length === 0) {\n      return;\n    }\n\n    if (menu && menu.enabled && this._menu && this._timeElement) {\n      this._menu.setOptions(menuOptions);\n      this._menu.show();\n      this._timeElement.style.opacity = '0';\n    }\n  }\n\n  private _hideMenu(): void {\n    const menu = this._theme.inbox?.list?.item?.menu;\n\n    if (menu && menu.enabled && this._menu && this._timeElement) {\n      this._menu.hide();\n      this._timeElement.style.opacity = '1';\n    }\n  }\n\n  // Public API\n  public setMessage(message: InboxMessage): void {\n    this._message = message;\n    this._updateContent();\n  }\n\n  public setOnItemClick(cb: (message: InboxMessage) => void): void {\n    this.onItemClick = cb;\n  }\n\n  public setOnItemActionClick(cb: (message: InboxMessage, action: InboxAction) => void): void {\n    this.onItemActionClick = cb;\n  }\n\n  public setOnItemLongPress(cb: (message: InboxMessage) => void): void {\n    this.onItemLongPress = cb;\n  }\n\n  public setOnItemVisible(cb: (message: InboxMessage) => void): void {\n    this.onItemVisible = cb;\n  }\n\n  // Content rendering\n  private _updateContent(): void {\n\n    if (!this._message) {\n      if (this._titleElement) this._titleElement.textContent = '';\n      if (this._subtitleElement) this._subtitleElement.textContent = '';\n      return;\n    }\n\n    // Unread marker\n    this.classList.toggle('unread', !this._message.read);\n\n    if (this._titleElement) {\n      const titleText = this._message.title || 'Untitled Message';\n      if (looksLikeHtml(titleText)) {\n        this._titleElement.innerHTML = sanitizeHtmlForInbox(titleText);\n      } else {\n        this._titleElement.innerHTML = sanitizeHtmlForInbox(linkifyPlainText(titleText));\n      }\n    }\n    if (this._subtitleElement) {\n      const body = this._message.body ?? '';\n      const preview = this._message.preview ?? '';\n      const preferBodyWithHtml = body && looksLikeHtml(body);\n      const subtitleText = preferBodyWithHtml ? body : (preview || body || '');\n      if (looksLikeHtml(subtitleText)) {\n        this._subtitleElement.innerHTML = sanitizeHtmlForInbox(subtitleText);\n      } else {\n        this._subtitleElement.innerHTML = sanitizeHtmlForInbox(linkifyPlainText(subtitleText));\n      }\n    }\n    if (this._timeElement) {\n      this._timeElement.textContent = getMessageTime(this._message);\n    }\n\n    // Update menu icons (e.g. read/unread)\n    if (this._menu) {\n      this._menu.setOptions(this._getMenuOptions());\n    }\n\n    // Update actions container\n    const hasActions = this._message.actions && this._message.actions.length > 0;\n    if (this._actionsContainer) {\n      this._actionsContainer.style.display = hasActions ? 'flex' : 'none';\n    }\n\n    const actionsTheme = this._theme.inbox?.list?.item?.actions;\n\n    // Add the actions to the actions container\n    if (this._actionsContainer && this._message.actions) {\n      this._actionsContainer.innerHTML = \"\"; // Clear previous actions to avoid duplicates\n      this._message.actions.forEach(action => {\n        // Create the action element\n        const actionButton = new CourierButton({\n          mode: this._themeManager.mode,\n          text: action.content,\n          variant: 'secondary',\n          backgroundColor: actionsTheme?.backgroundColor,\n          hoverBackgroundColor: actionsTheme?.hoverBackgroundColor,\n          activeBackgroundColor: actionsTheme?.activeBackgroundColor,\n          border: actionsTheme?.border,\n          borderRadius: actionsTheme?.borderRadius,\n          shadow: actionsTheme?.shadow,\n          fontFamily: actionsTheme?.font?.family,\n          fontSize: actionsTheme?.font?.size,\n          fontWeight: actionsTheme?.font?.weight,\n          textColor: actionsTheme?.font?.color,\n          onClick: () => {\n            if (this._message && this.onItemActionClick) {\n              this.onItemActionClick(this._message, action);\n            }\n          },\n        });\n\n        // Add the action element to the actions container\n        this._actionsContainer?.appendChild(actionButton);\n      });\n    }\n  }\n}\n\nregisterElement(CourierInboxListItem);\n","import { CourierBaseElement, injectGlobalStyle, registerElement } from \"@trycourier/courier-ui-core\";\nimport { CourierInboxTheme } from \"../types/courier-inbox-theme\";\n\nexport class CourierInboxSkeletonListItem extends CourierBaseElement {\n\n  static get id(): string {\n    return 'courier-inbox-skeleton-list-item';\n  }\n\n  private _theme: CourierInboxTheme;\n  private _style?: HTMLStyleElement;\n\n  constructor(theme: CourierInboxTheme) {\n    super();\n    this._theme = theme;\n  }\n\n  onComponentMounted() {\n    this._style = injectGlobalStyle(CourierInboxSkeletonListItem.id, CourierInboxSkeletonListItem.getStyles(this._theme));\n    this.render();\n  }\n\n  onComponentUnmounted() {\n    this._style?.remove();\n  }\n\n  private render() {\n    // Create skeleton items using CourierSkeletonAnimatedRow\n    const firstRow = new CourierSkeletonAnimatedRow(this._theme);\n    const secondRow = new CourierSkeletonAnimatedRow(this._theme);\n    const thirdRow = new CourierSkeletonAnimatedRow(this._theme);\n\n    this.appendChild(firstRow);\n    this.appendChild(secondRow);\n    this.appendChild(thirdRow);\n  }\n\n  static getStyles(_theme: CourierInboxTheme): string {\n    return `\n      ${CourierInboxSkeletonListItem.id} {\n        display: flex;\n        flex-direction: column;\n        gap: 12px;\n        padding: 16px 20px 16px 20px;\n        width: 100%;\n        box-sizing: border-box;\n      }\n\n      ${CourierInboxSkeletonListItem.id} > *:first-child {\n        width: 35%;\n      }\n\n      ${CourierInboxSkeletonListItem.id} > *:nth-child(2) {\n        width: 100%;\n      }\n\n      ${CourierInboxSkeletonListItem.id} > *:nth-child(3) {\n        width: 82%;\n      }\n    `;\n  }\n}\n\n// Register the custom element\nregisterElement(CourierInboxSkeletonListItem);\n\nclass CourierSkeletonAnimatedRow extends CourierBaseElement {\n\n  static get id(): string {\n    return 'courier-skeleton-animated-row';\n  }\n\n  private _theme: CourierInboxTheme;\n  private _style?: HTMLStyleElement;\n\n  constructor(theme: CourierInboxTheme) {\n    super();\n    this._theme = theme;\n  }\n\n  onComponentMounted() {\n    this._style = injectGlobalStyle(CourierSkeletonAnimatedRow.id, CourierSkeletonAnimatedRow.getStyles(this._theme));\n    this.render();\n  }\n\n  onComponentUnmounted() {\n    this._style?.remove();\n  }\n\n  private render() {\n    const skeletonItem = document.createElement('div');\n    skeletonItem.className = 'skeleton-item';\n    this.appendChild(skeletonItem);\n  }\n\n  static getStyles(theme: CourierInboxTheme): string {\n    const color = theme.inbox?.loading?.animation?.barColor ?? '#000';\n\n    // Handle both 3 and 6 character hex colors\n    const hexColor = color.length === 4 ?\n      `#${color[1]}${color[1]}${color[2]}${color[2]}${color[3]}${color[3]}` :\n      color;\n\n    // Convert hex to RGB\n    const r = parseInt(hexColor.slice(1, 3), 16);\n    const g = parseInt(hexColor.slice(3, 5), 16);\n    const b = parseInt(hexColor.slice(5, 7), 16);\n\n    const colorWithAlpha80 = `rgba(${r}, ${g}, ${b}, 0.8)`; // 80% opacity\n    const colorWithAlpha40 = `rgba(${r}, ${g}, ${b}, 0.4)`; // 40% opacity\n\n    return `\n      ${CourierSkeletonAnimatedRow.id} {\n        display: flex;\n        height: 100%;\n        width: 100%;\n        align-items: flex-start;\n        justify-content: flex-start;\n      }\n\n      ${CourierSkeletonAnimatedRow.id} .skeleton-item {\n        height: ${theme.inbox?.loading?.animation?.barHeight ?? '14px'};\n        width: 100%;\n        background: linear-gradient(\n          90deg,\n          ${colorWithAlpha80} 25%,\n          ${colorWithAlpha40} 50%,\n          ${colorWithAlpha80} 75%\n        );\n        background-size: 200% 100%;\n        animation: ${CourierSkeletonAnimatedRow.id}-shimmer ${theme.inbox?.loading?.animation?.duration ?? '2s'} ease-in-out infinite;\n        border-radius: ${theme.inbox?.loading?.animation?.barBorderRadius ?? '14px'};\n      }\n\n      @keyframes ${CourierSkeletonAnimatedRow.id}-shimmer {\n        0% {\n          background-position: 200% 0;\n        }\n        100% {\n          background-position: -200% 0;\n        }\n      }\n    `;\n  }\n}\n\nregisterElement(CourierSkeletonAnimatedRow);\n","import { CourierFactoryElement, injectGlobalStyle, registerElement } from \"@trycourier/courier-ui-core\";\nimport { CourierInboxSkeletonListItem } from \"./courier-inbox-skeleton-list-item\";\nimport { CourierInboxTheme } from \"../types/courier-inbox-theme\";\n\nexport class CourierInboxSkeletonList extends CourierFactoryElement {\n\n  static get id(): string {\n    return 'courier-inbox-skeleton-list';\n  }\n\n  private _theme: CourierInboxTheme;\n  private _style?: HTMLStyleElement;\n\n  constructor(theme: CourierInboxTheme) {\n    super();\n    this._theme = theme;\n  }\n\n  onComponentMounted() {\n    this._style = injectGlobalStyle(CourierInboxSkeletonList.id, CourierInboxSkeletonList.getStyles(this._theme));\n  }\n\n  onComponentUnmounted() {\n    this._style?.remove();\n  }\n\n  defaultElement(): HTMLElement {\n    const list = document.createElement('div');\n    list.className = 'list';\n\n    // Create skeleton items\n    for (let i = 0; i < 3; i++) {\n      const skeletonItem = new CourierInboxSkeletonListItem(this._theme); // TODO: Make this a prop\n      list.appendChild(skeletonItem);\n    }\n\n    this.appendChild(list);\n    return list;\n\n  }\n\n  static getStyles(theme: CourierInboxTheme): string {\n\n    return `\n      ${CourierInboxSkeletonList.id} {\n        display: flex;\n        height: 100%;\n        width: 100%;\n        align-items: flex-start;\n        justify-content: flex-start;\n        overflow: hidden;\n      }\n\n      ${CourierInboxSkeletonList.id} .list {\n        display: flex;\n        flex-direction: column;\n        width: 100%;\n        overflow: hidden;\n      }\n\n      ${CourierInboxSkeletonList.id} .list > * {\n        border-bottom: ${theme.inbox?.loading?.divider ?? '1px solid red'};\n        opacity: 100%;\n      }\n\n      ${CourierInboxSkeletonList.id} .list > *:nth-child(2) {\n        border-bottom: ${theme.inbox?.loading?.divider ?? '1px solid red'};\n        opacity: 88%;\n      }\n\n      ${CourierInboxSkeletonList.id} .list > *:nth-child(3) {\n        border-bottom: none;\n        opacity: 50%;\n      }\n    `;\n\n  }\n}\n\nregisterElement(CourierInboxSkeletonList);\n","import { CourierBaseElement, injectGlobalStyle, registerElement } from \"@trycourier/courier-ui-core\";\nimport { CourierInboxTheme } from \"../types/courier-inbox-theme\";\nimport { CourierInboxSkeletonList } from \"./courier-inbox-skeleton-list\";\n\nexport class CourierInboxPaginationListItem extends CourierBaseElement {\n\n  static get id(): string {\n    return 'courier-inbox-pagination-list-item';\n  }\n\n  // State\n  private _theme: CourierInboxTheme;\n\n  // Components\n  private _style?: HTMLStyleElement;\n  private _skeletonLoadingList?: CourierInboxSkeletonList;\n  private _observer?: IntersectionObserver;\n  private _customItem?: HTMLElement;\n\n  // Handlers\n  private _onPaginationTrigger: () => void;\n\n  constructor(props: { theme: CourierInboxTheme, customItem?: HTMLElement, onPaginationTrigger: () => void }) {\n    super();\n    this._theme = props.theme;\n    this._customItem = props.customItem;\n    this._onPaginationTrigger = props.onPaginationTrigger;\n  }\n\n  onComponentMounted() {\n\n    this._style = injectGlobalStyle(CourierInboxPaginationListItem.id, CourierInboxPaginationListItem.getStyles(this._theme));\n\n    if (this._customItem) {\n      this.appendChild(this._customItem);\n    } else {\n      const container = document.createElement('div');\n      container.className = 'skeleton-container';\n\n      this._skeletonLoadingList = new CourierInboxSkeletonList(this._theme);\n      this._skeletonLoadingList.build(undefined);\n      container.appendChild(this._skeletonLoadingList);\n\n      this.appendChild(container);\n    }\n\n    // Initialize intersection observer\n    this._observer = new IntersectionObserver((entries) => {\n      entries.forEach((entry) => {\n        if (entry.isIntersecting) {\n          this._onPaginationTrigger();\n        }\n      });\n    });\n\n    // Start observing the element\n    this._observer.observe(this);\n\n  }\n\n  onComponentUnmounted() {\n    this._observer?.disconnect();\n    this._style?.remove();\n  }\n\n  static getStyles(_theme: CourierInboxTheme): string {\n    return `\n      ${CourierInboxPaginationListItem.id} {\n        padding: 0;\n        margin: 0;\n        box-sizing: border-box;\n      }\n\n      ${CourierInboxPaginationListItem.id} .skeleton-container {\n        height: 150%;\n      }\n    `;\n  }\n\n}\n\nregisterElement(CourierInboxPaginationListItem);\n","import { InboxMessage } from \"@trycourier/courier-js\";\nimport { CourierInboxDatastore } from \"../datastore/inbox-datastore\";\n\nexport function markAsRead(message: InboxMessage): Promise<void> {\n  return CourierInboxDatastore.shared.readMessage({ message });\n}\n\nexport function markAsUnread(message: InboxMessage): Promise<void> {\n  return CourierInboxDatastore.shared.unreadMessage({ message });\n}\n\nexport function clickMessage(message: InboxMessage): Promise<void> {\n  return CourierInboxDatastore.shared.clickMessage({ message });\n}\n\nexport function archiveMessage(message: InboxMessage): Promise<void> {\n  return CourierInboxDatastore.shared.archiveMessage({ message });\n}\n\nexport function openMessage(message: InboxMessage): void {\n  CourierInboxDatastore.shared.openMessage({ message });\n}\n","import { CourierIconSVGs } from \"@trycourier/courier-ui-core\";\nimport { CourierInboxFeed } from \"./inbox-data-set\";\n\n/**\n * Header action ID types.\n */\nexport type CourierInboxHeaderActionId = 'readAll' | 'archiveRead' | 'archiveAll';\n\n/**\n * List item action ID types.\n */\nexport type CourierInboxListItemActionId = 'read_unread' | 'archive_unarchive';\n\n/**\n * Configuration for a header action.\n */\nexport type CourierInboxHeaderAction = {\n  id: CourierInboxHeaderActionId;\n  iconSVG?: string;\n  text?: string;\n};\n\n/**\n * Configuration for a list item action.\n */\nexport type CourierInboxListItemAction = {\n  id: CourierInboxListItemActionId;\n  readIconSVG?: string;\n  unreadIconSVG?: string;\n  archiveIconSVG?: string;\n  unarchiveIconSVG?: string;\n};\n\n/**\n * Returns the default feeds for the inbox.\n */\nexport function defaultFeeds(): CourierInboxFeed[] {\n  return [\n    {\n      feedId: 'inbox_feed',\n      title: 'Inbox',\n      iconSVG: CourierIconSVGs.inbox,\n      tabs: [\n        {\n          datasetId: 'all_messages',\n          title: 'All Messages',\n          filter: {}\n        }\n      ]\n    },\n    {\n      feedId: 'archive_feed',\n      title: 'Archive',\n      iconSVG: CourierIconSVGs.archive,\n      tabs: [\n        {\n          datasetId: 'archived_messages',\n          title: 'Archived Messages',\n          filter: {\n            archived: true\n          }\n        }\n      ]\n    }\n  ];\n}\n\n/**\n * Returns the default header actions.\n */\nexport function defaultActions(): CourierInboxHeaderAction[] {\n  return [\n    { id: 'readAll' },\n    { id: 'archiveRead' },\n    { id: 'archiveAll' }\n  ];\n}\n\n/**\n * Returns the default list item actions.\n */\nexport function defaultListItemActions(): CourierInboxListItemAction[] {\n  return [\n    { id: 'read_unread' },\n    { id: 'archive_unarchive' }\n  ];\n}\n\n","import { InboxAction, InboxMessage } from \"@trycourier/courier-js\";\nimport { CourierBaseElement, CourierInfoState, injectGlobalStyle, registerElement } from \"@trycourier/courier-ui-core\";\nimport { CourierInboxListItem } from \"./courier-inbox-list-item\";\nimport { CourierInboxPaginationListItem } from \"./courier-inbox-pagination-list-item\";\nimport { InboxDataSet } from \"../types/inbox-data-set\";\nimport { CourierInboxStateErrorFactoryProps, CourierInboxStateEmptyFactoryProps, CourierInboxStateLoadingFactoryProps, CourierInboxListItemFactoryProps, CourierInboxPaginationItemFactoryProps } from \"../types/factories\";\nimport { CourierInboxTheme } from \"../types/courier-inbox-theme\";\nimport { CourierInboxThemeManager, CourierInboxThemeSubscription } from \"../types/courier-inbox-theme-manager\";\nimport { CourierInboxSkeletonList } from \"./courier-inbox-skeleton-list\";\nimport { CourierInboxListItemMenu } from \"./courier-inbox-list-item-menu\";\nimport { openMessage } from \"../utils/extensions\";\nimport { CourierInboxListItemAction, defaultFeeds } from \"../types/inbox-defaults\";\nimport { CourierInbox } from \"./courier-inbox\";\n\nexport class CourierInboxList extends CourierBaseElement {\n\n  static get id(): string {\n    return 'courier-inbox-list';\n  }\n\n  // Theme\n  private _themeSubscription: CourierInboxThemeSubscription;\n\n  // State\n  private _messages: InboxMessage[] = [];\n  private _datasetId: string = defaultFeeds()[0].tabs[0].datasetId;\n  private _isLoading = true;\n  private _error: Error | null = null;\n  private _canPaginate = false;\n  private _canClickListItems = false;\n  private _canLongPressListItems = false;\n  private _listItemActions: CourierInboxListItemAction[] = CourierInbox.defaultListItemActions();\n\n  // Callbacks\n  private _onMessageClick: ((message: InboxMessage, index: number) => void) | null = null;\n  private _onMessageActionClick: ((message: InboxMessage, action: InboxAction, index: number) => void) | null = null;\n  private _onMessageLongPress: ((message: InboxMessage, index: number) => void) | null = null;\n  private _onRefresh: () => void;\n\n  // Factories\n  private _onPaginationTrigger?: (feedId: string) => void;\n  private _listItemFactory?: (props: CourierInboxListItemFactoryProps | undefined | null) => HTMLElement;\n  private _paginationItemFactory?: (props: CourierInboxPaginationItemFactoryProps | undefined | null) => HTMLElement;\n  private _loadingStateFactory?: (props: CourierInboxStateLoadingFactoryProps | undefined | null) => HTMLElement;\n  private _emptyStateFactory?: (props: CourierInboxStateEmptyFactoryProps | undefined | null) => HTMLElement;\n  private _errorStateFactory?: (props: CourierInboxStateErrorFactoryProps | undefined | null) => HTMLElement;\n\n  // Getters\n  public get messages(): InboxMessage[] {\n    return this._messages;\n  }\n\n  private get theme(): CourierInboxTheme {\n    return this._themeSubscription.manager.getTheme();\n  }\n\n  // Components\n  private _listStyles?: HTMLStyleElement;\n  private _listItemStyles?: HTMLStyleElement;\n  private _listItemMenuStyles?: HTMLStyleElement;\n  private _errorContainer?: CourierInfoState;\n  private _emptyContainer?: CourierInfoState;\n\n  constructor(props: {\n    themeManager: CourierInboxThemeManager,\n    listItemActions?: CourierInboxListItemAction[],\n    canClickListItems: boolean,\n    canLongPressListItems: boolean,\n    onRefresh: () => void,\n    onPaginationTrigger: (datasetId: string) => void,\n    onMessageClick: (message: InboxMessage, index: number) => void,\n    onMessageActionClick: (message: InboxMessage, action: InboxAction, index: number) => void,\n    onMessageLongPress: (message: InboxMessage, index: number) => void\n  }) {\n    super();\n\n    // Initialize the callbacks\n    this._onRefresh = props.onRefresh;\n    this._onPaginationTrigger = props.onPaginationTrigger;\n    this._onMessageClick = props.onMessageClick;\n    this._onMessageActionClick = props.onMessageActionClick;\n    this._onMessageLongPress = props.onMessageLongPress;\n\n    // Set list item actions\n    if (props.listItemActions) {\n      this._listItemActions = props.listItemActions;\n    }\n\n    // Initialize the theme subscription\n    this._themeSubscription = props.themeManager.subscribe((_: CourierInboxTheme) => {\n      this.refreshTheme();\n    });\n\n  }\n\n  onComponentMounted() {\n\n    // Inject styles at head\n    // Since list items and menus don't listen to theme changes directly, their styles are created\n    // at the parent level, and the parent manages their theming updates.\n    this._listStyles = injectGlobalStyle(CourierInboxList.id, CourierInboxList.getStyles(this.theme));\n    this._listItemStyles = injectGlobalStyle(CourierInboxListItem.id, CourierInboxListItem.getStyles(this.theme));\n    this._listItemMenuStyles = injectGlobalStyle(CourierInboxListItemMenu.id, CourierInboxListItemMenu.getStyles(this.theme));\n\n    // Layout the component\n    this.render();\n\n  }\n\n  onComponentUnmounted() {\n    this._themeSubscription.unsubscribe();\n    this._listStyles?.remove();\n    this._listItemStyles?.remove();\n    this._listItemMenuStyles?.remove();\n  }\n\n  public setCanClickListItems(canClick: boolean) {\n    this._canClickListItems = canClick;\n  }\n\n  public setCanLongPressListItems(canLongPress: boolean) {\n    this._canLongPressListItems = canLongPress;\n  }\n\n  public setListItemActions(actions: CourierInboxListItemAction[]) {\n    this._listItemActions = actions;\n    this.render();\n  }\n\n  static getStyles(theme: CourierInboxTheme): string {\n\n    const list = theme.inbox?.list;\n    const scrollbar = list?.scrollbar;\n\n    return `\n      ${CourierInboxList.id} {\n        flex: 1;\n        width: 100%;\n        background-color: ${list?.backgroundColor ?? 'red'};\n        scrollbar-width: ${scrollbar?.width ?? 'thin'};\n        scrollbar-color: ${scrollbar?.thumbColor ?? 'rgba(0, 0, 0, 0.2)'} ${scrollbar?.trackBackgroundColor ?? 'transparent'};\n      }\n\n      ${CourierInboxList.id} ul {\n        list-style: none;\n        padding: 0;\n        margin: 0;\n        height: 100%;\n      }\n\n      /* Webkit scrollbar styling - show thumb, hide track background, overlay above content */\n      ${CourierInboxList.id}::-webkit-scrollbar {\n        width: ${scrollbar?.width ?? '8px'};\n        height: ${scrollbar?.height ?? '8px'};\n      }\n\n      ${CourierInboxList.id}::-webkit-scrollbar-track {\n        background: ${scrollbar?.trackBackgroundColor ?? 'transparent'};\n      }\n\n      ${CourierInboxList.id}::-webkit-scrollbar-thumb {\n        background: ${scrollbar?.thumbColor ?? 'rgba(0, 0, 0, 0.2)'};\n        border-radius: ${scrollbar?.borderRadius ?? '4px'};\n      }\n\n      ${CourierInboxList.id}::-webkit-scrollbar-thumb:hover {\n        background: ${scrollbar?.thumbHoverColor ?? scrollbar?.thumbColor ?? 'rgba(0, 0, 0, 0.3)'};\n      }\n    `;\n\n  }\n\n  public setDataSet(dataSet: InboxDataSet): void {\n    this._messages = [...dataSet.messages];\n    this._canPaginate = Boolean(dataSet.canPaginate);\n    this._error = null;\n    this._isLoading = false;\n    this.render();\n  }\n\n  public addPage(dataSet: InboxDataSet): void {\n    this._messages = [...this._messages, ...dataSet.messages];\n    this._canPaginate = Boolean(dataSet.canPaginate);\n    this._error = null;\n    this._isLoading = false;\n    this.render();\n  }\n\n  public addMessage(message: InboxMessage, index = 0): void {\n    this._messages.splice(index, 0, message);\n    this.render();\n  }\n\n  public removeMessage(index = 0): void {\n    this._messages.splice(index, 1);\n    this.render();\n  }\n\n  public updateMessage(message: InboxMessage, index = 0): void {\n    this._messages[index] = message;\n    this.render();\n  }\n\n  public selectDataset(datasetId: string): void {\n    this._datasetId = datasetId;\n    this._error = null;\n    this._isLoading = true;\n    this.render();\n  }\n\n  public setLoading(isLoading: boolean): void {\n    this._error = null;\n    this._isLoading = isLoading;\n    this.render();\n  }\n\n  public setError(error: Error | null): void {\n    this._error = error;\n    this._isLoading = false;\n    this._messages = [];\n    this.render();\n  }\n\n  public setErrorNoClient(): void {\n    this.setError(new Error('No user signed in'));\n  }\n\n  private handleRetry(): void {\n    this._onRefresh();\n  }\n\n  private handleRefresh(): void {\n    this._onRefresh();\n  }\n\n  private refreshTheme(): void {\n\n    // Update list styles\n    if (this._listStyles) {\n      this._listStyles.textContent = CourierInboxList.getStyles(this.theme);\n    }\n\n    // Update list item styles\n    if (this._listItemStyles) {\n      this._listItemStyles.textContent = CourierInboxListItem.getStyles(this.theme);\n    }\n\n    // Update list item menu styles\n    if (this._listItemMenuStyles) {\n      this._listItemMenuStyles.textContent = CourierInboxListItemMenu.getStyles(this.theme);\n    }\n\n    // Update info state themes if they are rendered\n    this.refreshInfoStateThemes();\n  }\n\n  public refreshInfoStateThemes() {\n    this._emptyContainer?.updateStyles(this.errorProps);\n    this._emptyContainer?.updateStyles(this.emptyProps);\n  }\n\n  get errorProps(): any {\n    const error = this.theme.inbox?.error;\n    const themeMode = this._themeSubscription.manager.mode;\n    return {\n      title: {\n        text: error?.title?.text ?? this._error?.message,\n        textColor: error?.title?.font?.color,\n        fontFamily: error?.title?.font?.family,\n        fontSize: error?.title?.font?.size,\n        fontWeight: error?.title?.font?.weight\n      },\n      button: {\n        mode: themeMode,\n        text: error?.button?.text,\n        backgroundColor: error?.button?.backgroundColor,\n        hoverBackgroundColor: error?.button?.hoverBackgroundColor,\n        activeBackgroundColor: error?.button?.activeBackgroundColor,\n        textColor: error?.button?.font?.color,\n        fontFamily: error?.button?.font?.family,\n        fontSize: error?.button?.font?.size,\n        fontWeight: error?.button?.font?.weight,\n        shadow: error?.button?.shadow,\n        border: error?.button?.border,\n        borderRadius: error?.button?.borderRadius,\n        onClick: () => this.handleRetry()\n      }\n    };\n  }\n\n  get emptyProps(): any {\n    const empty = this.theme.inbox?.empty;\n    const themeMode = this._themeSubscription.manager.mode;\n    return {\n      title: {\n        text: empty?.title?.text ?? `No Messages`,\n        textColor: empty?.title?.font?.color,\n        fontFamily: empty?.title?.font?.family,\n        fontSize: empty?.title?.font?.size,\n        fontWeight: empty?.title?.font?.weight\n      },\n      button: {\n        mode: themeMode,\n        text: empty?.button?.text,\n        backgroundColor: empty?.button?.backgroundColor,\n        hoverBackgroundColor: empty?.button?.hoverBackgroundColor,\n        activeBackgroundColor: empty?.button?.activeBackgroundColor,\n        textColor: empty?.button?.font?.color,\n        fontFamily: empty?.button?.font?.family,\n        fontSize: empty?.button?.font?.size,\n        fontWeight: empty?.button?.font?.weight,\n        shadow: empty?.button?.shadow,\n        border: empty?.button?.border,\n        borderRadius: empty?.button?.borderRadius,\n        onClick: () => this.handleRefresh()\n      },\n    };\n  }\n\n  private render(): void {\n\n    // Remove all existing elements\n    while (this.firstChild) {\n      this.removeChild(this.firstChild);\n      this._errorContainer = undefined;\n      this._emptyContainer = undefined;\n    }\n\n    // Refresh theme-related styles and info states\n    this.refreshTheme();\n\n    // Error state\n    if (this._error) {\n      this._errorContainer = new CourierInfoState(this.errorProps);\n      this._errorContainer.build(this._errorStateFactory?.({ datasetId: this._datasetId, error: this._error }));\n      this.appendChild(this._errorContainer);\n      return;\n    }\n\n    // Loading state\n    if (this._isLoading) {\n      const loadingElement = new CourierInboxSkeletonList(this.theme);\n      loadingElement.build(this._loadingStateFactory?.({ datasetId: this._datasetId }));\n      this.appendChild(loadingElement);\n      return;\n    }\n\n    // Empty state\n    if (this._messages.length === 0) {\n      this._emptyContainer = new CourierInfoState(this.emptyProps);\n      this._emptyContainer.build(this._emptyStateFactory?.({ datasetId: this._datasetId }));\n      this.appendChild(this._emptyContainer);\n      return;\n    }\n\n    // Create list before adding messages\n    const list = document.createElement('ul');\n    this.appendChild(list);\n\n    // Add messages to the list\n    this._messages.forEach((message, index) => {\n      if (this._listItemFactory) {\n        list.appendChild(this._listItemFactory({ message, index }));\n        return;\n      }\n      const listItem = new CourierInboxListItem(this._themeSubscription.manager, this._canClickListItems, this._canLongPressListItems, this._listItemActions);\n      listItem.setMessage(message);\n      listItem.setOnItemClick((message) => this._onMessageClick?.(message, index));\n      listItem.setOnItemActionClick((message, action) => this._onMessageActionClick?.(message, action, index));\n      listItem.setOnItemLongPress((message) => this._onMessageLongPress?.(message, index));\n      listItem.setOnItemVisible((message) => this.openVisibleMessage(message))\n      list.appendChild(listItem);\n    });\n\n    // Add pagination item if can paginate\n    if (this._canPaginate) {\n      const paginationItem = new CourierInboxPaginationListItem({\n        theme: this.theme,\n        customItem: this._paginationItemFactory?.({ datasetId: this._datasetId }),\n        onPaginationTrigger: () => this._onPaginationTrigger?.(this._datasetId),\n      });\n      list.appendChild(paginationItem);\n    }\n  }\n\n  private openVisibleMessage(message: InboxMessage) {\n    openMessage(message);\n  }\n\n  // Factories\n  public setLoadingStateFactory(factory: (props: CourierInboxStateLoadingFactoryProps | undefined | null) => HTMLElement): void {\n    this._loadingStateFactory = factory;\n    this.render();\n  }\n\n  public setEmptyStateFactory(factory: (props: CourierInboxStateEmptyFactoryProps | undefined | null) => HTMLElement): void {\n    this._emptyStateFactory = factory;\n    this.render();\n  }\n\n  public setErrorStateFactory(factory: (props: CourierInboxStateErrorFactoryProps | undefined | null) => HTMLElement): void {\n    this._errorStateFactory = factory;\n    this.render();\n  }\n\n  public setListItemFactory(factory: (props: CourierInboxListItemFactoryProps | undefined | null) => HTMLElement): void {\n    this._listItemFactory = factory;\n    this.render();\n  }\n\n  public setPaginationItemFactory(factory: (props: CourierInboxPaginationItemFactoryProps | undefined | null) => HTMLElement): void {\n    this._paginationItemFactory = factory;\n    this.render();\n  }\n\n  public scrollToTop(animate: boolean = true): void {\n    this.scrollTo({ top: 0, behavior: animate ? 'smooth' : 'instant' });\n  }\n\n}\n\nregisterElement(CourierInboxList);\n","import { CourierBaseElement, registerElement } from \"@trycourier/courier-ui-core\";\nimport { CourierInboxTheme, CourierInboxUnreadCountIndicatorTheme } from \"../types/courier-inbox-theme\";\nimport { CourierInboxThemeManager, CourierInboxThemeSubscription } from \"../types/courier-inbox-theme-manager\";\n\nexport type CourierUnreadCountBadgeLocation = \"feed\" | \"tab\";\n\nexport class CourierUnreadCountBadge extends CourierBaseElement {\n\n  static get id(): string {\n    return 'courier-unread-count-badge';\n  }\n\n  // Theme\n  private _themeSubscription: CourierInboxThemeSubscription;\n  private _location: CourierUnreadCountBadgeLocation;\n\n  // State\n  private _count: number = 0;\n\n  // Elements\n  private _style?: HTMLStyleElement;\n  private _shadowRoot?: ShadowRoot;\n  private _container?: HTMLElement;\n\n  get theme(): CourierInboxTheme {\n    return this._themeSubscription.manager.getTheme();\n  }\n\n  constructor(props: { themeBus: CourierInboxThemeManager, location: CourierUnreadCountBadgeLocation }) {\n    super();\n    this._location = props.location;\n\n    this._themeSubscription = props.themeBus.subscribe((_: CourierInboxTheme) => {\n      this.refreshTheme();\n    });\n  }\n\n  onComponentMounted() {\n    this.attachElements();\n    this.setActive(true);\n    this.updateBadge();\n  }\n\n  private attachElements() {\n    // Attach shadow DOM\n    this._shadowRoot = this.attachShadow({ mode: 'closed' });\n\n    // Create container element\n    this._container = document.createElement('div');\n    this._container.className = 'badge-container';\n\n    // Create and add style\n    this._style = document.createElement('style');\n    this._style.textContent = this.getStyles();\n    this._shadowRoot.appendChild(this._style);\n    this._shadowRoot.appendChild(this._container);\n  }\n\n  onComponentUnmounted() {\n    this._themeSubscription.unsubscribe();\n  }\n\n  private static getThemePath(\n    theme: CourierInboxTheme,\n    location: CourierUnreadCountBadgeLocation,\n    active: boolean\n  ): CourierInboxUnreadCountIndicatorTheme | undefined {\n    if (location === \"tab\") {\n      const tabsTheme = theme.inbox?.header?.tabs;\n      return active\n        ? tabsTheme?.selected?.unreadIndicator\n        : tabsTheme?.default?.unreadIndicator;\n    } else {\n      // Default to \"feed\" location\n      return theme.inbox?.header?.feeds?.button?.unreadCountIndicator;\n    }\n  }\n\n  static getStyles(theme: CourierInboxTheme, location: CourierUnreadCountBadgeLocation = \"feed\"): string {\n    const activeTheme = CourierUnreadCountBadge.getThemePath(theme, location, true);\n    const inactiveTheme = CourierUnreadCountBadge.getThemePath(theme, location, false);\n\n    // Fallback to feed button theme if location-specific theme is not available\n    const fallbackTheme = theme.inbox?.header?.feeds?.button?.unreadCountIndicator;\n\n    return `\n      :host {\n        display: inline-block;\n      }\n\n      .badge-container {\n        display: none;\n        pointer-events: none;\n      }\n\n      :host(.active) .badge-container {\n        display: inline-block;\n        background-color: ${activeTheme?.backgroundColor ?? fallbackTheme?.backgroundColor};\n        color: ${activeTheme?.font?.color ?? fallbackTheme?.font?.color};\n        border-radius: ${activeTheme?.borderRadius ?? fallbackTheme?.borderRadius};\n        font-size: ${activeTheme?.font?.size ?? fallbackTheme?.font?.size};\n        font-family: ${activeTheme?.font?.family ?? fallbackTheme?.font?.family ?? 'inherit'};\n        font-weight: ${activeTheme?.font?.weight ?? fallbackTheme?.font?.weight ?? 'inherit'};\n        padding: ${activeTheme?.padding ?? fallbackTheme?.padding};\n      }\n\n      :host(.inactive) .badge-container {\n        display: inline-block;\n        background-color: ${inactiveTheme?.backgroundColor ?? fallbackTheme?.backgroundColor};\n        color: ${inactiveTheme?.font?.color ?? fallbackTheme?.font?.color};\n        border-radius: ${inactiveTheme?.borderRadius ?? fallbackTheme?.borderRadius};\n        font-size: ${inactiveTheme?.font?.size ?? fallbackTheme?.font?.size};\n        font-family: ${inactiveTheme?.font?.family ?? fallbackTheme?.font?.family ?? 'inherit'};\n        font-weight: ${inactiveTheme?.font?.weight ?? fallbackTheme?.font?.weight ?? 'inherit'};\n        padding: ${inactiveTheme?.padding ?? fallbackTheme?.padding};\n      }\n    `\n  }\n\n  private getStyles(): string {\n    return CourierUnreadCountBadge.getStyles(this.theme, this._location);\n  }\n\n  public setCount(count: number) {\n    this._count = count;\n    this.updateBadge();\n  }\n\n  public setActive(active: boolean) {\n    this.className = active ? 'active' : 'inactive';\n    if (this._style) {\n      this._style.textContent = this.getStyles();\n    }\n    this.updateBadge();\n  }\n\n  public refreshTheme() {\n    if (this._style) {\n      this._style.textContent = this.getStyles();\n    }\n    this.updateBadge();\n  }\n\n  private updateBadge() {\n    if (!this._container) return;\n\n    // Set display on the host element (this element)\n    if (this._count > 0) {\n      this.style.display = 'inline-block';\n      this._container.textContent = this._count > 99 ? '99+' : this._count.toString();\n    } else {\n      this.style.display = 'none';\n      this._container.textContent = '';\n    }\n  }\n}\n\nregisterElement(CourierUnreadCountBadge);\n","import { CourierBaseElement, CourierIcon, CourierIconSVGs, injectGlobalStyle, registerElement } from \"@trycourier/courier-ui-core\";\nimport { CourierInboxThemeManager, CourierInboxThemeSubscription } from \"../types/courier-inbox-theme-manager\";\nimport { CourierInboxTheme } from \"../types/courier-inbox-theme\";\nimport { CourierInboxFeed } from \"../types/inbox-data-set\";\nimport { CourierUnreadCountBadge } from \"./courier-unread-count-badge\";\n\nexport class CourierInboxFeedButton extends CourierBaseElement {\n\n  static get id(): string {\n    return 'courier-inbox-header-title';\n  }\n\n  // Theme\n  private _themeSubscription: CourierInboxThemeSubscription;\n\n  // State\n  private _feeds: CourierInboxFeed[];\n  private _selectedFeed?: CourierInboxFeed;\n\n  get selectedFeed(): CourierInboxFeed | undefined {\n    return this._selectedFeed;\n  }\n\n  // Components\n  private _style?: HTMLStyleElement;\n  private _iconElement?: CourierIcon;\n  private _titleElement?: HTMLHeadingElement;\n  private _switchIconElement?: CourierIcon;\n  private _unreadBadge?: CourierUnreadCountBadge;\n\n  private get theme(): CourierInboxTheme {\n    return this._themeSubscription.manager.getTheme();\n  }\n\n  constructor(themeManager: CourierInboxThemeManager, feeds: CourierInboxFeed[]) {\n    super();\n\n    this._feeds = feeds;\n\n    // Subscribe to the theme bus\n    this._themeSubscription = themeManager.subscribe((_) => {\n      this.refreshTheme();\n    });\n\n  }\n\n  private getStyles(theme: CourierInboxTheme): string {\n    const hasMultipleFeeds = this._feeds.length > 1;\n    const hoverStyle = hasMultipleFeeds\n      ? `${CourierInboxFeedButton.id}:hover {\n        background: ${theme.inbox?.header?.feeds?.button?.hoverBackgroundColor ?? 'red'};\n      }`\n      : '';\n    const activeStyle = hasMultipleFeeds\n      ? `${CourierInboxFeedButton.id}:active {\n        background: ${theme.inbox?.header?.feeds?.button?.activeBackgroundColor ?? 'red'};\n      }`\n      : '';\n\n    return `\n      ${CourierInboxFeedButton.id} {\n        display: flex;\n        align-items: center;\n        gap: 8px;\n        position: relative;\n        transition: ${theme.inbox?.header?.feeds?.button?.transition ?? 'all 0.2s ease'};\n        border-radius: 6px;\n        padding-top: 4px;\n        padding-bottom: 4px;\n        padding-left: 4px;\n        padding-right: 8px;\n      }\n\n      ${hoverStyle}\n\n      ${activeStyle}\n\n      ${CourierInboxFeedButton.id} courier-icon {\n        display: flex;\n        align-items: center;\n      }\n\n      ${CourierInboxFeedButton.id} .title-container {\n        display: flex;\n        flex-direction: row;\n        align-items: center;\n        gap: 0px;\n      }\n\n      ${CourierInboxFeedButton.id} .title-container h2 {\n        margin: 0;\n        font-family: ${theme.inbox?.header?.feeds?.button?.font?.family ?? 'inherit'};\n        font-size: ${theme.inbox?.header?.feeds?.button?.font?.size ?? '16px'};\n        font-weight: ${theme.inbox?.header?.feeds?.button?.font?.weight ?? '500'};\n        color: ${theme.inbox?.header?.feeds?.button?.font?.color ?? 'red'};\n      }\n\n    `;\n  }\n\n  onComponentMounted() {\n    this.render();\n  }\n\n  onComponentUnmounted() {\n    this._themeSubscription.unsubscribe();\n    this._style?.remove();\n  }\n\n  private render() {\n    this._style = injectGlobalStyle(CourierInboxFeedButton.id, this.getStyles(this.theme));\n\n    // Icon\n    this._iconElement = new CourierIcon();\n    this.appendChild(this._iconElement);\n\n    // Title wrapped in a div\n    const titleContainer = document.createElement('div');\n    titleContainer.className = 'title-container';\n    this._titleElement = document.createElement('h2');\n    titleContainer.appendChild(this._titleElement);\n\n    // Switch icon\n    const switchIcon = this.theme.inbox?.header?.feeds?.button?.changeFeedIcon;\n    this._switchIconElement = new CourierIcon(switchIcon?.color ?? 'red', switchIcon?.svg ?? CourierIconSVGs.chevronDown);\n    this._switchIconElement.style.display = this._feeds.length > 1 ? 'flex' : 'none';\n    titleContainer.appendChild(this._switchIconElement);\n\n    this.appendChild(titleContainer);\n\n    // Unread badge\n    this._unreadBadge = new CourierUnreadCountBadge({\n      themeBus: this._themeSubscription.manager,\n      location: \"feed\"\n    });\n    this.appendChild(this._unreadBadge);\n\n    // Refresh theme\n    this.refreshTheme();\n  }\n\n  public setUnreadCount(count: number) {\n    this._unreadBadge?.setCount(count);\n  }\n\n  public setFeeds(feeds: CourierInboxFeed[]) {\n    this._feeds = feeds;\n    if (this._switchIconElement) {\n      this._switchIconElement.style.display = this._feeds.length > 1 ? 'flex' : 'none';\n    }\n    // Refresh theme to update hover/active styles based on feed count\n    this.refreshTheme();\n  }\n\n  public setSelectedFeed(feedId: string) {\n    this._selectedFeed = this._feeds.find(feed => feed.feedId === feedId);\n    this.refreshSelectedFeed();\n  }\n\n  private refreshTheme() {\n    if (this._style) {\n      this._style.textContent = this.getStyles(this.theme);\n    }\n    this.refreshSelectedFeed();\n    this.refreshSwitchIcon();\n    this.refreshUnreadBadge();\n  }\n\n  private refreshSelectedFeed() {\n    if (this._selectedFeed) {\n      this._iconElement?.updateSVG(this._selectedFeed.iconSVG ?? CourierIconSVGs.inbox);\n      this._iconElement?.updateColor(this.theme.inbox?.header?.feeds?.button?.selectedFeedIconColor ?? 'red');\n      if (this._titleElement) {\n        this._titleElement.textContent = this._selectedFeed.title;\n      }\n    }\n  }\n\n  private refreshSwitchIcon() {\n    if (this._switchIconElement) {\n      const switchIcon = this.theme.inbox?.header?.feeds?.button?.changeFeedIcon;\n      this._switchIconElement.updateSVG(switchIcon?.svg ?? CourierIconSVGs.chevronDown);\n      this._switchIconElement.updateColor(switchIcon?.color ?? 'red');\n    }\n  }\n\n  private refreshUnreadBadge() {\n    if (this._unreadBadge) {\n      this._unreadBadge.refreshTheme();\n    }\n  }\n\n}\n\nregisterElement(CourierInboxFeedButton);\n","import { CourierBaseElement, injectGlobalStyle, registerElement } from \"@trycourier/courier-ui-core\";\nimport { CourierInboxTheme } from \"../types/courier-inbox-theme\";\nimport { CourierInboxThemeManager, CourierInboxThemeSubscription } from \"../types/courier-inbox-theme-manager\";\nimport { CourierInboxTab } from \"../types/inbox-data-set\";\nimport { CourierUnreadCountBadge } from \"./courier-unread-count-badge\";\n\nexport class CourierInboxTabs extends CourierBaseElement {\n\n  static get id(): string {\n    return 'courier-inbox-tabs';\n  }\n\n  // Theme\n  private _themeManager: CourierInboxThemeManager;\n  private _themeSubscription: CourierInboxThemeSubscription;\n\n  private _selectedTabId?: string;\n  private _tabs: CourierInboxTab[] = [];\n  private _onTabClick: (tab: CourierInboxTab) => void;\n  private _onTabReselected: (tab: CourierInboxTab) => void;\n  private _tabBadges: Map<string, CourierUnreadCountBadge> = new Map();\n\n  // Components\n  private _style?: HTMLStyleElement;\n\n  get theme(): CourierInboxTheme {\n    return this._themeSubscription.manager.getTheme();\n  }\n\n  constructor(props: { themeManager: CourierInboxThemeManager, onTabClick: (tab: CourierInboxTab) => void, onTabReselected: (tab: CourierInboxTab) => void }) {\n    super();\n    this._themeManager = props.themeManager;\n    this._onTabClick = props.onTabClick;\n    this._onTabReselected = props.onTabReselected;\n    this._themeSubscription = props.themeManager.subscribe((_: CourierInboxTheme) => {\n      this.refreshTheme();\n    });\n  }\n\n  onComponentMounted() {\n    this._style = injectGlobalStyle(CourierInboxTabs.id, CourierInboxTabs.getStyles(this.theme));\n    this.render();\n  }\n\n  onComponentUnmounted() {\n    this._themeSubscription.unsubscribe();\n    this._style?.remove();\n  }\n\n  private render() {\n    // Clear the existing tabs\n    this.innerHTML = '';\n\n    // Create a single container that holds all tabs\n    const tabContainer = document.createElement('div');\n    tabContainer.className = 'tab-container';\n\n    // Create the tab elements inside the container\n    for (let tab of this._tabs) {\n      const tabElement = this.createTab(tab);\n      tabContainer.appendChild(tabElement);\n    }\n\n    // Append the container to the main element\n    this.appendChild(tabContainer);\n\n    // Set the theme of the button\n    this.refreshTheme();\n  }\n\n  static getStyles(theme: CourierInboxTheme): string {\n    const tabs = theme.inbox?.header?.tabs;\n\n    // Helper function to convert borderRadius to CSS\n    const getBorderRadius = (borderRadius?: string | { topLeft?: string; topRight?: string; bottomLeft?: string; bottomRight?: string }): string => {\n      if (!borderRadius) return '';\n      if (typeof borderRadius === 'string') {\n        return `border-radius: ${borderRadius};`;\n      }\n      const parts: string[] = [];\n      if (borderRadius.topLeft) parts.push(borderRadius.topLeft);\n      else parts.push('0');\n      if (borderRadius.topRight) parts.push(borderRadius.topRight);\n      else parts.push('0');\n      if (borderRadius.bottomRight) parts.push(borderRadius.bottomRight);\n      else parts.push('0');\n      if (borderRadius.bottomLeft) parts.push(borderRadius.bottomLeft);\n      else parts.push('0');\n      return `border-radius: ${parts.join(' ')};`;\n    };\n\n    return `\n      ${CourierInboxTabs.id} {\n        position: relative;\n        width: 100%;\n        max-width: 100%;\n        min-width: 0;\n        margin-top: -5px;\n        overflow-x: auto;\n        scrollbar-width: none; /* Firefox */\n        -ms-overflow-style: none; /* IE and Edge */\n        height: 41px;\n      }\n\n      ${CourierInboxTabs.id}::-webkit-scrollbar {\n        display: none;\n      }\n\n      ${CourierInboxTabs.id} .tab-container {\n        display: flex;\n        flex-direction: row;\n        gap: 4px;\n        padding: 0 10px;\n        width: fit-content;\n        height: 100%;\n      }\n\n      ${CourierInboxTabs.id} .tab-item {\n        position: relative;\n        display: flex;\n        align-items: center;\n        cursor: pointer;\n        transition: ${tabs?.transition ?? 'all 0.2s ease'};\n        user-select: none;\n        padding: 0 10px;\n        flex-shrink: 0;\n        height: 100%;\n        ${getBorderRadius(tabs?.borderRadius)}\n      }\n\n      ${CourierInboxTabs.id} .tab {\n        position: relative;\n        display: flex;\n        align-items: center;\n        gap: 8px;\n        border-bottom: ${tabs?.default?.indicatorHeight ?? '1px'} solid ${tabs?.default?.indicatorColor ?? 'transparent'};\n        height: 40px;\n        min-width: 40px;\n        justify-content: center;\n        position: relative;\n      }\n\n      ${CourierInboxTabs.id} .tab-item:hover {\n        background-color: ${tabs?.default?.hoverBackgroundColor ?? 'transparent'};\n      }\n\n      ${CourierInboxTabs.id} .tab-item:active {\n        background-color: ${tabs?.default?.activeBackgroundColor ?? 'transparent'};\n      }\n\n      ${CourierInboxTabs.id} .tab.selected {\n        border-bottom: ${(tabs?.selected?.indicatorHeight ?? '1px')} solid ${(tabs?.selected?.indicatorColor ?? 'transparent')};\n      }\n\n      ${CourierInboxTabs.id} .tab-item:hover.selected {\n        background-color: ${tabs?.selected?.hoverBackgroundColor ?? 'transparent'};\n      }\n\n      ${CourierInboxTabs.id} .tab-item:active.selected {\n        background-color: ${tabs?.selected?.activeBackgroundColor ?? 'transparent'};\n      }\n\n      ${CourierInboxTabs.id} .tab-label {\n        font-size: ${tabs?.default?.font?.size ?? '14px'};\n        font-family: ${tabs?.default?.font?.family ?? 'inherit'};\n        font-weight: ${tabs?.default?.font?.weight ?? 'inherit'};\n        color: ${tabs?.default?.font?.color ?? 'red'};\n        user-select: none;\n        white-space: nowrap;\n      }\n\n      ${CourierInboxTabs.id} .tab.selected .tab-label {\n        color: ${tabs?.selected?.font?.color ?? 'red'};\n      }\n    `;\n  }\n\n  public setTabs(tabs: CourierInboxTab[]) {\n    this._tabs = tabs;\n    this._tabBadges.clear(); // Clear existing badges when tabs are reset\n    this.render();\n  }\n\n  public setSelectedTab(tabId: string) {\n    this._selectedTabId = tabId;\n    this.reloadTabs();\n    this.updateBadgeStates();\n  }\n\n  public updateTabUnreadCount(tabId: string, count: number) {\n    const badge = this._tabBadges.get(tabId);\n    if (badge) {\n      badge.setCount(count);\n    }\n  }\n\n  public scrollToStart(animate: boolean = true) {\n    if (animate) {\n      this.scrollTo({\n        left: 0,\n        behavior: 'smooth'\n      });\n    } else {\n      this.scrollLeft = 0;\n    }\n  }\n\n  private refreshTheme() {\n    if (this._style) {\n      this._style.textContent = CourierInboxTabs.getStyles(this.theme);\n    }\n  }\n\n  private reloadTabs() {\n    const tabContainer = this.querySelector('.tab-container');\n    if (!tabContainer) return;\n\n    for (let child of Array.from(tabContainer.children)) {\n      if (child instanceof HTMLElement && child.classList.contains('tab-item')) {\n        const tabId = child.getAttribute('data-tab-id');\n        const tabElement = child.querySelector('.tab');\n        if (tabElement instanceof HTMLElement) {\n          if (tabId === this._selectedTabId) {\n            tabElement.classList.add('selected');\n          } else {\n            tabElement.classList.remove('selected');\n          }\n        }\n      }\n    }\n  }\n\n  private updateBadgeStates() {\n    for (let [tabId, badge] of this._tabBadges) {\n      badge.setActive(tabId === this._selectedTabId);\n    }\n  }\n\n  private createTab(tab: CourierInboxTab): HTMLDivElement {\n    const container = document.createElement('div');\n    container.className = 'tab-item';\n    container.setAttribute('data-tab-id', tab.datasetId);\n\n    const el = document.createElement('div');\n    el.className = 'tab';\n    if (tab.datasetId === this._selectedTabId) {\n      el.classList.add('selected');\n    }\n\n    const label = document.createElement('div');\n    label.className = 'tab-label';\n    label.innerText = tab.title;\n\n    const unreadBadge = new CourierUnreadCountBadge({\n      themeBus: this._themeManager,\n      location: \"tab\"\n    });\n    this._tabBadges.set(tab.datasetId, unreadBadge);\n\n    el.appendChild(label);\n    el.appendChild(unreadBadge);\n    container.appendChild(el);\n\n    container.addEventListener('click', () => {\n      if (tab.datasetId === this._selectedTabId) {\n        this._onTabReselected(tab);\n      } else {\n        this._onTabClick(tab);\n      }\n    });\n\n    return container;\n  }\n\n}\n\nregisterElement(CourierInboxTabs);\n","import { CourierBaseElement, CourierIcon, CourierIconSVGs, registerElement } from \"@trycourier/courier-ui-core\";\nimport { CourierInboxThemeManager } from \"../types/courier-inbox-theme-manager\";\nimport { CourierInboxMenuOption } from \"./courier-inbox-option-menu\";\n\nexport class CourierInboxOptionMenuItem extends CourierBaseElement {\n\n  static get id(): string {\n    return 'courier-inbox-option-menu-item';\n  }\n\n  // State\n  private _option: CourierInboxMenuOption;\n  private _isSelectedable: boolean;\n  private _isSelected?: boolean;\n  private _theme: CourierInboxThemeManager;\n\n  // Components\n  private _content?: HTMLDivElement;\n  private _itemIcon?: CourierIcon;\n  private _title?: HTMLParagraphElement;\n  private _selectionIcon?: CourierIcon;\n\n  constructor(props: { option: CourierInboxMenuOption, selectable: boolean, isSelected: boolean, themeManager: CourierInboxThemeManager }) {\n    super();\n    this._option = props.option;\n    this._isSelected = props.isSelected;\n    this._isSelectedable = props.selectable;\n    this._theme = props.themeManager;\n  }\n\n  onComponentMounted() {\n\n    this._content = document.createElement('div');\n    this._content.className = 'menu-item';\n\n    this._itemIcon = new CourierIcon(this._option.icon.svg ?? CourierIconSVGs.inbox);\n    this._itemIcon.setAttribute('size', '16');\n\n    this._title = document.createElement('p');\n    this._title.textContent = this._option.text;\n\n    const spacer = document.createElement('div');\n    spacer.className = 'spacer';\n\n    this._selectionIcon = new CourierIcon(CourierIconSVGs.check);\n    this._selectionIcon.classList.add('check-icon');\n\n    this._content.appendChild(this._itemIcon);\n    this._content.appendChild(this._title);\n    this._content.appendChild(spacer);\n\n    // Add check icon if selectable\n    if (this._isSelectedable) {\n      this._content.appendChild(this._selectionIcon);\n    }\n\n    this.appendChild(this._content);\n\n    this.updateSelectionState();\n\n    this.refreshTheme();\n\n  }\n\n  public refreshTheme() {\n\n    // Set title text\n    if (this._title) {\n      this._title.textContent = this._option.text ?? 'Missing Text';\n    }\n\n    // Set selected icon color\n    const theme = this._theme.getTheme();\n    this._selectionIcon?.updateColor(theme.inbox?.header?.feeds?.menu?.list?.selectedIcon?.color ?? 'red');\n    this._selectionIcon?.updateSVG(theme.inbox?.header?.feeds?.menu?.list?.selectedIcon?.svg ?? CourierIconSVGs.check);\n\n    // Set item icon color and SVG\n    this._itemIcon?.updateColor(this._option.icon?.color ?? 'red');\n    this._itemIcon?.updateSVG(this._option.icon?.svg ?? CourierIconSVGs.inbox);\n\n  }\n\n  public setSelected(isSelected: boolean) {\n    this._isSelected = isSelected;\n    this.updateSelectionState();\n  }\n\n  private updateSelectionState() {\n    if (this._selectionIcon) {\n      this._selectionIcon.style.display = this._isSelected ? 'block' : 'none';\n    }\n  }\n\n}\n\nregisterElement(CourierInboxOptionMenuItem);\n","import { CourierBaseElement, registerElement } from \"@trycourier/courier-ui-core\";\nimport { CourierInboxThemeManager, CourierInboxThemeSubscription } from \"../types/courier-inbox-theme-manager\";\nimport { CourierInboxOptionMenuItem } from \"./courier-inbox-option-menu-item\";\nimport { CourierInboxIconTheme } from \"../types/courier-inbox-theme\";\n\nexport type CourierInboxMenuOption = {\n  id: string;\n  text: string;\n  icon: CourierInboxIconTheme;\n  onClick: (option: CourierInboxMenuOption) => void;\n};\n\nexport type CourierInboxOptionMenuType = 'feed' | 'action';\n\nexport class CourierInboxOptionMenu extends CourierBaseElement {\n\n  static get id(): string {\n    return 'courier-inbox-option-menu';\n  }\n\n  // Theme\n  private _themeSubscription: CourierInboxThemeSubscription;\n\n  // State\n  private _selectedIndex: number = 0;\n  private _options: CourierInboxMenuOption[];\n  private _selectable: boolean;\n  private _onMenuOpen?: () => void;\n  private _isOpen: boolean = false;\n  private _menuType: CourierInboxOptionMenuType;\n\n  // Components\n  private _style?: HTMLStyleElement;\n  private _shadowRoot?: ShadowRoot;\n  private _container?: HTMLElement;\n\n  constructor(themeManager: CourierInboxThemeManager, selectable: boolean, options: CourierInboxMenuOption[], menuType: CourierInboxOptionMenuType, onMenuOpen?: () => void) {\n    super();\n\n    this._selectable = selectable;\n    this._options = options;\n    this._onMenuOpen = onMenuOpen;\n    this._menuType = menuType;\n\n    // Handle the theme change\n    this._themeSubscription = themeManager.subscribe((_) => {\n      this.refreshTheme();\n    });\n  }\n\n  onComponentMounted() {\n    this.attachElements();\n    document.addEventListener('click', this.handleOutsideClick.bind(this));\n    this.refreshTheme();\n  }\n\n  onComponentUnmounted() {\n    this._themeSubscription.unsubscribe();\n  }\n\n  private attachElements() {\n    // Attach shadow DOM\n    this._shadowRoot = this.attachShadow({ mode: 'closed' });\n\n    // Create container element\n    this._container = document.createElement('div');\n    this._container.className = 'menu-container';\n\n    // Create and add style\n    this._style = document.createElement('style');\n    this._style.textContent = this.getStyles();\n    this._shadowRoot.appendChild(this._style);\n    this._shadowRoot.appendChild(this._container);\n  }\n\n  private getStyles(): string {\n    const theme = this._themeSubscription.manager.getTheme();\n    const transition = this._menuType === 'feed'\n      ? theme.inbox?.header?.feeds?.menu?.animation\n      : theme.inbox?.header?.actions?.animation;\n    const menuTheme = this._menuType === 'feed'\n      ? theme.inbox?.header?.feeds?.menu\n      : theme.inbox?.header?.actions?.menu ?? theme.inbox?.header?.feeds?.menu;\n    const initialTransform = transition?.initialTransform ?? 'translate3d(0, 0, 0)';\n    const visibleTransform = transition?.visibleTransform ?? 'translate3d(0, 0, 0)';\n\n    return `\n      :host {\n        position: absolute;\n        top: 42px;\n        z-index: 1000;\n        min-width: 200px;\n        user-select: none;\n        opacity: 0;\n        pointer-events: none;\n        transition: ${transition?.transition ?? 'all 0.2s ease'};\n        transform: ${initialTransform};\n        will-change: transform, opacity;\n        display: none;\n      }\n\n      :host(.displayed) {\n        display: block;\n      }\n\n      :host(.visible) {\n        opacity: 1;\n        pointer-events: auto;\n        transform: ${visibleTransform};\n      }\n\n      .menu-container {\n        display: flex;\n        flex-direction: column;\n        border-radius: ${menuTheme?.borderRadius ?? '6px'};\n        border: ${menuTheme?.border ?? '1px solid red'};\n        background: ${menuTheme?.backgroundColor ?? 'red'};\n        box-shadow: ${menuTheme?.shadow ?? '0 4px 12px 0 red'};\n        overflow: hidden;\n        padding: 4px 0;\n      }\n\n      courier-inbox-option-menu-item {\n        border-bottom: ${menuTheme?.list?.divider ?? 'none'};\n      }\n\n      courier-inbox-option-menu-item:last-child {\n        border-bottom: none;\n      }\n\n      ${CourierInboxOptionMenuItem.id} {\n        display: flex;\n        flex-direction: row;\n        padding: 6px 12px;\n        cursor: pointer;\n      }\n\n      ${CourierInboxOptionMenuItem.id}:hover {\n        background-color: ${menuTheme?.list?.hoverBackgroundColor ?? 'red'};\n      }\n\n      ${CourierInboxOptionMenuItem.id}:active {\n        background-color: ${menuTheme?.list?.activeBackgroundColor ?? 'red'};\n      }\n\n      ${CourierInboxOptionMenuItem.id} .menu-item {\n        display: flex;\n        align-items: center;\n        width: 100%;\n        gap: 12px;\n      }\n\n      ${CourierInboxOptionMenuItem.id} .spacer {\n        flex: 1;\n      }\n\n      ${CourierInboxOptionMenuItem.id} p {\n        margin: 0;\n        font-family: ${menuTheme?.list?.font?.family ?? 'inherit'};\n        font-weight: ${menuTheme?.list?.font?.weight ?? 'inherit'};\n        font-size: ${menuTheme?.list?.font?.size ?? '14px'};\n        color: ${menuTheme?.list?.font?.color ?? 'red'};\n        white-space: nowrap;\n      }\n\n      ${CourierInboxOptionMenuItem.id} .check-icon {\n        display: block;\n      }\n    `;\n  }\n\n  public setPosition(position: { right?: string, left?: string, top?: string }) {\n    this.style.left = position.left ?? 'auto';\n    this.style.right = position.right ?? 'auto';\n    this.style.top = position.top ?? 'auto';\n  }\n\n  private refreshTheme() {\n    // Update styles\n    if (this._style) {\n      this._style.textContent = this.getStyles();\n    }\n\n    // Reload menu items\n    this.refreshMenuItems();\n  }\n\n  public setOptions(options: CourierInboxMenuOption[]) {\n    this._options = options;\n    this.refreshMenuItems();\n  }\n\n  private refreshMenuItems() {\n    if (!this._container) return;\n\n    const container = this._container;\n\n    // Clear existing items\n    container.innerHTML = '';\n\n    this._options.forEach((option, index) => {\n      const menuItem = new CourierInboxOptionMenuItem({\n        option: option,\n        selectable: this._selectable,\n        isSelected: this._selectedIndex === index,\n        themeManager: this._themeSubscription.manager\n      });\n\n      menuItem.addEventListener('click', () => {\n\n        // Select if possible\n        if (this._selectable) {\n          this.selectionItemAtIndex(index);\n        }\n\n        // Handle the click\n        option.onClick(option);\n        this.closeMenu();\n\n      });\n\n      container.appendChild(menuItem);\n    });\n  }\n\n  public toggleMenu() {\n    this._isOpen = !this._isOpen;\n    if (this._isOpen) {\n      this.showMenu();\n      this._onMenuOpen?.();\n    } else {\n      this.hideMenu();\n    }\n  }\n\n  private showMenu() {\n    // Remove visible class first to reset state\n    this.classList.remove('visible');\n\n    // Add displayed class to set display: block (but keep opacity 0 and initial transform)\n    this.classList.add('displayed');\n\n    // Trigger transition on next frame\n    requestAnimationFrame(() => {\n      requestAnimationFrame(() => {\n        this.classList.add('visible');\n      });\n    });\n  }\n\n  private hideMenu() {\n    // Remove visible class to trigger transition\n    this.classList.remove('visible');\n\n    // If there is no transition, remove the displayed class immediately\n    const style = window.getComputedStyle(this);\n    const durations = style.transitionDuration.split(',').map(d => parseFloat(d) || 0);\n    const hasTransition = durations.some(d => d > 0);\n    if (!hasTransition) {\n      this.classList.remove('displayed');\n      return;\n    }\n\n    // Wait for transition to complete, then remove displayed class\n    const handleTransitionEnd = (e: TransitionEvent) => {\n      if (e.target !== this) return;\n      if (!this.classList.contains('visible')) {\n        this.classList.remove('displayed');\n        this.removeEventListener('transitionend', handleTransitionEnd);\n      }\n    };\n\n    this.addEventListener('transitionend', handleTransitionEnd);\n  }\n\n  public closeMenu() {\n    this._isOpen = false;\n    this.hideMenu();\n  }\n\n  private handleOutsideClick(event: MouseEvent) {\n    const target = event.target as Node;\n    // contains() checks the entire tree including shadow DOM\n    if (!this.contains(target)) {\n      this.closeMenu();\n    }\n  }\n\n  public selectionItemAtIndex(index: number) {\n    if (!this._selectable || !this._container) {\n      return;\n    }\n\n    this._selectedIndex = index;\n\n    // Update all menu items to reflect the new selection\n    this._options.forEach((_, idx) => {\n      const item = this._container?.children[idx] as CourierInboxOptionMenuItem;\n      if (item && item.setSelected) {\n        item.setSelected(idx === index);\n      }\n    });\n  }\n\n}\n\nregisterElement(CourierInboxOptionMenu);\n","import { CourierFactoryElement, registerElement, CourierColors, injectGlobalStyle, CourierIconButton, CourierIconSVGs } from \"@trycourier/courier-ui-core\";\nimport { CourierInboxFeedButton } from \"./courier-inbox-feed-button\";\nimport { CourierInboxHeaderFactoryProps } from \"../types/factories\";\nimport { CourierInboxThemeManager, CourierInboxThemeSubscription } from \"../types/courier-inbox-theme-manager\";\nimport { CourierInboxTheme } from \"../types/courier-inbox-theme\";\nimport { CourierInboxFeed, CourierInboxTab } from \"../types/inbox-data-set\";\nimport { CourierInboxTabs } from \"./courier-inbox-tabs\";\nimport { CourierInboxMenuOption, CourierInboxOptionMenu } from \"./courier-inbox-option-menu\";\nimport { CourierInboxDatastore } from \"../datastore/inbox-datastore\";\nimport { CourierInboxHeaderAction } from \"../types/inbox-defaults\";\nimport { CourierInbox } from \"./courier-inbox\";\n\nexport class CourierInboxHeader extends CourierFactoryElement {\n\n  static get id(): string {\n    return 'courier-inbox-header';\n  }\n\n  // Theme\n  private _themeSubscription: CourierInboxThemeSubscription;\n\n  // State\n  private _feeds: CourierInboxFeed[] = [];\n  private _currentFeedId?: string;\n  private _actions: CourierInboxHeaderAction[] = CourierInbox.defaultActions();\n\n  // Components\n  private _feedButton?: CourierInboxFeedButton;\n  private _feedMenu?: CourierInboxOptionMenu;\n  private _actionMenuButton?: CourierIconButton;\n  private _actionMenu?: CourierInboxOptionMenu;\n  public tabs?: CourierInboxTabs;\n  private _style?: HTMLStyleElement;\n  private _feedButtonClickHandler?: (event: Event) => void;\n\n  // Callbacks\n  private _onFeedChange: (feed: CourierInboxFeed) => void;\n  private _onFeedReselected: (feed: CourierInboxFeed) => void;\n  private _onTabChange: (tab: CourierInboxTab) => void;\n  private _onTabReselected: (tab: CourierInboxTab) => void;\n\n  private get theme(): CourierInboxTheme {\n    return this._themeSubscription.manager.getTheme();\n  }\n\n  /** Returns whether the tabs are currently visible based on the current feed having more than 1 tab. */\n  get showTabs(): boolean {\n    const currentFeed = this._feeds.find(feed => feed.feedId === this._currentFeedId);\n    return (currentFeed?.tabs?.length ?? 0) > 1;\n  }\n\n  constructor(props: {\n    themeManager: CourierInboxThemeManager,\n    actions?: CourierInboxHeaderAction[],\n    onFeedChange: (feed: CourierInboxFeed) => void,\n    onFeedReselected: (feed: CourierInboxFeed) => void,\n    onTabChange: (tab: CourierInboxTab) => void,\n    onTabReselected: (tab: CourierInboxTab) => void\n  }) {\n    super();\n\n    // Subscribe to the theme bus\n    this._themeSubscription = props.themeManager.subscribe((_) => {\n      this.refreshTheme();\n    });\n\n    // Set actions\n    if (props.actions) {\n      this._actions = props.actions;\n    }\n\n    // Set the callbacks\n    this._onFeedChange = props.onFeedChange;\n    this._onFeedReselected = props.onFeedReselected;\n    this._onTabChange = props.onTabChange;\n    this._onTabReselected = props.onTabReselected;\n  }\n\n  onComponentMounted() {\n    // Initialize style element if not already set (may have been set by refreshTheme if called earlier)\n    if (!this._style) {\n    this._style = injectGlobalStyle(CourierInboxHeader.id, CourierInboxHeader.getStyles(this.theme));\n    } else {\n      // Ensure style is up to date with current theme\n      this._style.textContent = CourierInboxHeader.getStyles(this.theme);\n    }\n  }\n\n  onComponentUmounted() {\n    this._themeSubscription.unsubscribe();\n    this._style?.remove();\n  }\n\n  private getActionOptions(): CourierInboxMenuOption[] {\n    const theme = this._themeSubscription.manager.getTheme();\n    const actionMenu = theme.inbox?.header?.actions;\n    const options: CourierInboxMenuOption[] = [];\n\n    // Iterate through actions in the order they were specified\n    for (const action of this._actions) {\n      switch (action.id) {\n        case 'readAll':\n          options.push({\n            id: 'make_all_read',\n            text: action.text ?? actionMenu?.markAllRead?.text ?? 'Mark All as Read',\n            icon: {\n              color: actionMenu?.markAllRead?.icon?.color ?? 'red',\n              svg: action.iconSVG ?? actionMenu?.markAllRead?.icon?.svg ?? CourierIconSVGs.read\n            },\n            onClick: (_: CourierInboxMenuOption) => {\n              CourierInboxDatastore.shared.readAllMessages();\n            }\n          });\n          break;\n        case 'archiveAll':\n          options.push({\n            id: 'archive_all',\n            text: action.text ?? actionMenu?.archiveAll?.text ?? 'Archive All',\n            icon: {\n              color: actionMenu?.archiveAll?.icon?.color ?? 'red',\n              svg: action.iconSVG ?? actionMenu?.archiveAll?.icon?.svg ?? CourierIconSVGs.archive\n            },\n            onClick: (_: CourierInboxMenuOption) => {\n              CourierInboxDatastore.shared.archiveAllMessages();\n            }\n          });\n          break;\n        case 'archiveRead':\n          options.push({\n            id: 'archive_read',\n            text: action.text ?? actionMenu?.archiveRead?.text ?? 'Archive Read',\n            icon: {\n              color: actionMenu?.archiveRead?.icon?.color ?? 'red',\n              svg: action.iconSVG ?? actionMenu?.archiveRead?.icon?.svg ?? CourierIconSVGs.archiveRead\n            },\n            onClick: (_: CourierInboxMenuOption) => {\n              CourierInboxDatastore.shared.archiveReadMessages();\n            }\n          });\n          break;\n      }\n    }\n\n    return options;\n  }\n\n  private refreshTheme() {\n    // Ensure style element exists before updating\n    if (!this._style) {\n      this._style = injectGlobalStyle(CourierInboxHeader.id, CourierInboxHeader.getStyles(this.theme));\n    } else {\n      this._style.textContent = CourierInboxHeader.getStyles(this.theme);\n    }\n\n    this.refreshActionMenuButton();\n    this._actionMenu?.setOptions(this.getActionOptions());\n    this._feedMenu?.setOptions(this.getFeedMenuOptions());\n\n    // Update action menu button visibility\n    if (this._actionMenuButton) {\n      this._actionMenuButton.style.display = this._actions.length > 0 ? '' : 'none';\n    }\n    if (this._actionMenu) {\n      this._actionMenu.style.display = this._actions.length > 0 ? '' : 'none';\n    }\n  }\n\n  private getFeedMenuOptions(): CourierInboxMenuOption[] {\n    return this._feeds.map((feed, _index) => ({\n      id: feed.feedId,\n      text: feed.title,\n      icon: {\n        color: this.theme.inbox?.header?.feeds?.button?.selectedFeedIconColor ?? 'red',\n        svg: feed.iconSVG ?? CourierIconSVGs.inbox\n      },\n      onClick: (_: CourierInboxMenuOption) => {\n        if (feed.feedId === this._currentFeedId) {\n          this._onFeedReselected(feed);\n        } else {\n          this._onFeedChange(feed);\n        }\n      }\n    }));\n  }\n\n  public render(props: CourierInboxHeaderFactoryProps): void {\n    const selectedFeed = props.feeds.find(feed => feed.isSelected);\n    const selectedTab = selectedFeed?.tabs.find(tab => tab.isSelected);\n    const showTabs = (selectedFeed?.tabs.length ?? 0) > 1;\n\n    if (this._feedButton) {\n      // Use the original feed's feedId (which maps to the header feed's id)\n      this._feedButton.setSelectedFeed(selectedFeed?.feedId ?? '');\n      this._feedButton.setUnreadCount(showTabs ? 0 : (selectedTab?.unreadCount ?? 0));\n      this.updateFeedButtonInteraction();\n    }\n\n    if (this.tabs) {\n      this.tabs.style.display = showTabs ? 'flex' : 'none';\n      this.tabs.setSelectedTab(selectedTab?.datasetId ?? '');\n      this.tabs.updateTabUnreadCount(selectedTab?.datasetId ?? '', selectedTab?.unreadCount ?? 0);\n    }\n  }\n\n  build(newElement: HTMLElement | undefined | null) {\n    super.build(newElement);\n    this.refreshTheme();\n  }\n\n  defaultElement(): HTMLElement {\n    // Create feed button\n    this._feedButton = new CourierInboxFeedButton(\n      this._themeSubscription.manager,\n      this._feeds\n    );\n\n    // Set the feed menu up\n    this._feedMenu = new CourierInboxOptionMenu(this._themeSubscription.manager, true, this.getFeedMenuOptions(), 'feed');\n    this._feedMenu.setPosition({ left: '12px', top: '51px' });\n\n    // Add click handler to feed button to toggle menu (only if multiple feeds)\n    this._feedButtonClickHandler = (event: Event) => {\n      event.stopPropagation();\n      this._feedMenu?.toggleMenu();\n      this._actionMenu?.closeMenu();\n    };\n    this.updateFeedButtonInteraction();\n\n    // Action menu\n    this._actionMenu = new CourierInboxOptionMenu(this._themeSubscription.manager, false, this.getActionOptions(), 'action');\n    this._actionMenu.setPosition({ right: '12px', top: '51px' }); // 51px just looks better\n\n    // Action menu button\n    this._actionMenuButton = new CourierIconButton(CourierIconSVGs.overflow);\n    this.refreshActionMenuButton();\n    this._actionMenuButton.addEventListener('click', (event: Event) => {\n      event.stopPropagation();\n      this._actionMenu?.toggleMenu();\n      this._feedMenu?.closeMenu();\n    });\n\n    // Create title section with feed button\n    const titleSection = document.createElement('div');\n    titleSection.className = 'title';\n    titleSection.appendChild(this._feedButton);\n\n    // Create flexible spacer\n    const spacer = document.createElement('div');\n    spacer.className = 'spacer';\n\n    const headerContent = document.createElement('div');\n    headerContent.className = 'header-content';\n    headerContent.appendChild(titleSection);\n    headerContent.appendChild(spacer);\n\n    // Add action menu button and menu only if there are actions\n    if (this._actions.length > 0) {\n      headerContent.appendChild(this._actionMenuButton);\n      headerContent.appendChild(this._actionMenu);\n    }\n\n    // Add feed menu if it exists (for multiple feeds)\n    headerContent.appendChild(this._feedMenu);\n\n    this.tabs = new CourierInboxTabs({\n      themeManager: this._themeSubscription.manager,\n      onTabClick: (tab: CourierInboxTab) => {\n        this._onTabChange(tab);\n      },\n      onTabReselected: (tab: CourierInboxTab) => {\n        this._onTabReselected(tab);\n      }\n    });\n\n    const header = document.createElement('div');\n    header.className = 'header';\n    header.appendChild(headerContent);\n    header.appendChild(this.tabs);\n\n    return header;\n  }\n\n  private refreshActionMenuButton() {\n    const buttonConfig = this.theme?.inbox?.header?.actions?.button;\n    this._actionMenuButton?.updateIconSVG(buttonConfig?.icon?.svg ?? CourierIconSVGs.overflow);\n    this._actionMenuButton?.updateIconColor(buttonConfig?.icon?.color ?? 'red');\n    this._actionMenuButton?.updateBackgroundColor(buttonConfig?.backgroundColor ?? 'transparent');\n    this._actionMenuButton?.updateHoverBackgroundColor(buttonConfig?.hoverBackgroundColor ?? CourierColors.black[500_10]);\n    this._actionMenuButton?.updateActiveBackgroundColor(buttonConfig?.activeBackgroundColor ?? CourierColors.black[500_20]);\n  }\n\n  private updateFeedButtonInteraction() {\n    if (!this._feedButton || !this._feedButtonClickHandler) {\n      return;\n    }\n\n    // Always remove the listener first to avoid duplicates\n    this._feedButton.removeEventListener('click', this._feedButtonClickHandler);\n\n    const hasMultipleFeeds = this._feeds.length > 1;\n\n    if (hasMultipleFeeds) {\n      // Enable interaction: add click handler and set cursor to pointer\n      this._feedButton.style.cursor = 'pointer';\n      this._feedButton.addEventListener('click', this._feedButtonClickHandler);\n    } else {\n      // Disable interaction: remove click handler and set cursor to default\n      this._feedButton.style.cursor = 'default';\n    }\n  }\n\n  public setFeeds(feeds: CourierInboxFeed[]) {\n    if (feeds.length === 0) {\n      throw new Error('[CourierInboxHeader] Cannot set feeds to an empty array.');\n    }\n\n    if (!feeds[0].tabs.length) {\n      throw new Error('[CourierInboxHeader] First feed does not have a tab.');\n    }\n\n    this._feeds = feeds;\n\n    // Set the feeds and select the first feed\n    this._feedButton?.setFeeds(feeds);\n    this.selectFeed(feeds[0].feedId, feeds[0].tabs[0].datasetId);\n\n    // Set the feed menu options\n    this._feedMenu?.setOptions(this.getFeedMenuOptions());\n\n    // Update feed button interaction based on number of feeds\n    this.updateFeedButtonInteraction();\n  }\n\n  public setActions(actions: CourierInboxHeaderAction[]) {\n    this._actions = actions;\n    this._actionMenu?.setOptions(this.getActionOptions());\n\n    // Show/hide action menu button based on whether there are actions\n    if (this._actionMenuButton) {\n      this._actionMenuButton.style.display = this._actions.length > 0 ? '' : 'none';\n    }\n    if (this._actionMenu) {\n      this._actionMenu.style.display = this._actions.length > 0 ? '' : 'none';\n    }\n  }\n\n  public selectFeed(feedId: string, tabId: string) {\n    // Set the selected feed\n    this._currentFeedId = feedId;\n    this._feedButton?.setSelectedFeed(feedId);\n    const feedIndex = this._feeds.findIndex(feed => feed.feedId === feedId);\n    this._feedMenu?.selectionItemAtIndex(feedIndex);\n\n    // Set the selected tabs\n    const tabs = this._feeds.find(feed => feed.feedId === feedId)?.tabs ?? [];\n    if (tabs.length > 0 && this.tabs) {\n      this.tabs.style.display = tabs.length > 1 ? 'flex' : 'none';\n      this.tabs.setTabs(tabs);\n      this.tabs.setSelectedTab(tabId);\n\n      // Immediately update unread counts for all tabs from the datastore\n      for (const tab of tabs) {\n        const dataset = CourierInboxDatastore.shared.getDatasetById(tab.datasetId);\n        if (dataset) {\n          this.tabs.updateTabUnreadCount(tab.datasetId, dataset.unreadCount);\n        }\n      }\n    }\n  }\n\n  static getStyles(theme: CourierInboxTheme): string {\n    return `\n      ${CourierInboxHeader.id} {\n        display: flex;\n      }\n\n      ${CourierInboxHeader.id} > .header {\n        display: flex;\n        flex-direction: column;\n        flex: 1;\n        width: 100%;\n        max-width: 100%;\n        min-width: 0;\n        position: relative;\n        overflow-y: visible;\n        background-color: ${theme.inbox?.header?.backgroundColor ?? CourierColors.white[500]};\n        box-shadow: ${theme.inbox?.header?.shadow ?? `0px 1px 0px 0px red`};\n        border-bottom: ${theme.inbox?.header?.border ?? '1px solid red'};\n        z-index: 100;\n      }\n\n      ${CourierInboxHeader.id} .header-content {\n        padding-top: 10px;\n        padding-right: 12px;\n        padding-bottom: 10px;\n        padding-left: 12px;\n        display: flex;\n        flex-direction: row;\n        align-items: center;\n        justify-content: space-between;\n        flex: 1;\n        width: 100%;\n        max-width: 100%;\n        min-width: 0;\n        position: relative;\n        box-sizing: border-box;\n      }\n\n      ${CourierInboxHeader.id} .title {\n        display: flex;\n        align-items: center;\n        gap: 4px;\n      }\n\n      ${CourierInboxHeader.id} .spacer {\n        flex: 1;\n      }\n\n      ${CourierInboxHeader.id} .actions {\n        display: flex;\n        align-items: center;\n        gap: 4px;\n      }\n    `;\n  }\n\n}\n\nregisterElement(CourierInboxHeader);\n","import { CourierInboxDatastore } from \"./inbox-datastore\";\nimport { CourierInboxDatastoreEvents } from \"./datatore-events\";\n\nexport class CourierInboxDataStoreListener {\n  readonly events: CourierInboxDatastoreEvents;\n\n  constructor(events: CourierInboxDatastoreEvents) {\n    this.events = events;\n  }\n\n  remove() {\n    CourierInboxDatastore.shared.removeDataStoreListener(this);\n  }\n\n}\n","import { CourierColors, CourierIconSVGs, SystemThemeMode, CourierFontTheme, CourierIconTheme, CourierButtonTheme, CourierIconButtonTheme, COURIER_DEFAULT_PRIMARY_COLOR } from \"@trycourier/courier-ui-core\";\n\n// Re-export common types from core for convenience\nexport type CourierInboxFontTheme = CourierFontTheme;\nexport type CourierInboxIconTheme = CourierIconTheme;\nexport type CourierInboxButtonTheme = CourierButtonTheme;\nexport type CourierInboxIconButtonTheme = CourierIconButtonTheme;\n\nexport type CourierInboxUnreadDotIndicatorTheme = {\n  backgroundColor?: string;\n  borderRadius?: string;\n  height?: string;\n  width?: string;\n}\n\nexport type CourierInboxUnreadCountIndicatorTheme = {\n  font?: CourierInboxFontTheme;\n  backgroundColor?: string;\n  borderRadius?: string;\n  padding?: string;\n}\n\nexport type CourierInboxMenuButtonTheme = CourierInboxIconButtonTheme & {\n  unreadDotIndicator?: CourierInboxUnreadDotIndicatorTheme;\n}\n\nexport type CourierInboxAnimationTheme = {\n  transition?: string;\n  initialTransform?: string;\n  visibleTransform?: string;\n}\n\nexport type CourierInboxPopupTheme = {\n  backgroundColor?: string;\n  border?: string;\n  borderRadius?: string;\n  shadow?: string;\n  animation?: CourierInboxAnimationTheme;\n  list?: {\n    font?: CourierInboxFontTheme;\n    selectedIcon?: CourierInboxIconTheme;\n    hoverBackgroundColor?: string;\n    activeBackgroundColor?: string;\n    divider?: string;\n  };\n}\n\nexport type CourierInboxSubtitleLinkTheme = {\n  color?: string;\n  textDecoration?: string;\n  hoverColor?: string;\n}\n\nexport type CourierInboxListItemTheme = {\n  unreadIndicatorColor?: string;\n  backgroundColor?: string;\n  hoverBackgroundColor?: string;\n  activeBackgroundColor?: string;\n  transition?: string;\n  title?: CourierInboxFontTheme;\n  subtitle?: CourierInboxFontTheme;\n  /** Styles for inline links inside the subtitle/body text */\n  subtitleLink?: CourierInboxSubtitleLinkTheme;\n  time?: CourierInboxFontTheme;\n  archiveIcon?: CourierInboxIconTheme;\n  divider?: string;\n  actions?: {\n    backgroundColor?: string;\n    hoverBackgroundColor?: string;\n    activeBackgroundColor?: string;\n    border?: string;\n    borderRadius?: string;\n    shadow?: string;\n    font?: CourierInboxFontTheme;\n  }\n  menu?: {\n    enabled?: boolean;\n    backgroundColor?: string;\n    border?: string;\n    borderRadius?: string;\n    shadow?: string;\n    animation?: CourierInboxAnimationTheme;\n    longPress?: {\n      displayDuration?: number;\n      vibrationDuration?: number;\n    };\n    item?: {\n      hoverBackgroundColor?: string;\n      activeBackgroundColor?: string;\n      borderRadius?: string;\n      read?: CourierInboxIconTheme;\n      unread?: CourierInboxIconTheme;\n      archive?: CourierInboxIconTheme;\n      unarchive?: CourierInboxIconTheme;\n    };\n  };\n}\n\nexport type CourierInboxSkeletonLoadingStateTheme = {\n  animation?: {\n    barColor?: string;\n    barHeight?: string;\n    barBorderRadius?: string;\n    duration?: string;\n  },\n  divider?: string;\n}\n\nexport type CourierInboxInfoStateTheme = {\n  title?: {\n    font?: CourierInboxFontTheme;\n    text?: string;\n  },\n  button?: CourierInboxButtonTheme;\n}\n\nexport type CourierMenuItemTheme = {\n  icon?: CourierInboxIconTheme;\n  text?: string;\n}\n\nexport type CourierActionMenuTheme = {\n  button?: CourierInboxIconButtonTheme;\n  markAllRead?: CourierMenuItemTheme;\n  archiveAll?: CourierMenuItemTheme;\n  archiveRead?: CourierMenuItemTheme;\n  animation?: CourierInboxAnimationTheme;\n  menu?: CourierInboxPopupTheme;\n}\n\nexport type CourierInboxTabsBorderRadius =\n  | string\n  | {\n    topLeft?: string;\n    topRight?: string;\n    bottomLeft?: string;\n    bottomRight?: string;\n  };\n\nexport type CourierInboxListScrollbarTheme = {\n  trackBackgroundColor?: string;\n  thumbColor?: string;\n  thumbHoverColor?: string;\n  width?: string;\n  height?: string;\n  borderRadius?: string;\n}\n\nexport type CourierInboxTabsTheme = {\n  borderRadius?: CourierInboxTabsBorderRadius;\n  transition?: string;\n  default?: {\n    backgroundColor?: string;\n    hoverBackgroundColor?: string;\n    activeBackgroundColor?: string;\n    font?: CourierInboxFontTheme;\n    indicatorColor?: string;\n    indicatorHeight?: string;\n    unreadIndicator?: CourierInboxUnreadCountIndicatorTheme;\n  },\n  selected?: {\n    backgroundColor?: string;\n    hoverBackgroundColor?: string;\n    activeBackgroundColor?: string;\n    font?: CourierInboxFontTheme;\n    indicatorColor?: string;\n    indicatorHeight?: string;\n    unreadIndicator?: CourierInboxUnreadCountIndicatorTheme;\n  }\n}\n\nexport type CourierInboxTheme = {\n  popup?: {\n    button?: CourierInboxMenuButtonTheme;\n    window?: {\n      backgroundColor?: string;\n      borderRadius?: string;\n      border?: string;\n      shadow?: string;\n      animation?: CourierInboxAnimationTheme;\n    };\n  }\n  inbox?: {\n    header?: {\n      backgroundColor?: string;\n      shadow?: string;\n      border?: string;\n      feeds?: {\n        button?: {\n          selectedFeedIconColor?: string;\n          font?: CourierInboxFontTheme;\n          changeFeedIcon?: CourierIconTheme;\n          unreadCountIndicator?: CourierInboxUnreadCountIndicatorTheme;\n          hoverBackgroundColor?: string;\n          activeBackgroundColor?: string;\n          transition?: string;\n        }\n        menu?: CourierInboxPopupTheme;\n        tabs?: CourierInboxTabsTheme;\n      }\n      tabs?: CourierInboxTabsTheme;\n      actions?: CourierActionMenuTheme\n    }\n    list?: {\n      backgroundColor?: string;\n      scrollbar?: CourierInboxListScrollbarTheme;\n      item?: CourierInboxListItemTheme;\n    },\n    loading?: CourierInboxSkeletonLoadingStateTheme,\n    empty?: CourierInboxInfoStateTheme,\n    error?: CourierInboxInfoStateTheme\n  }\n};\n\nexport const defaultLightTheme: CourierInboxTheme = {\n  popup: {\n    button: {\n      icon: {\n        color: CourierColors.black[500],\n        svg: CourierIconSVGs.inbox\n      },\n      backgroundColor: 'transparent',\n      hoverBackgroundColor: CourierColors.black[500_10],\n      activeBackgroundColor: CourierColors.black[500_20],\n      unreadDotIndicator: {\n        backgroundColor: COURIER_DEFAULT_PRIMARY_COLOR,\n        borderRadius: '50%',\n        height: '8px',\n        width: '8px',\n      }\n    },\n    window: {\n      backgroundColor: CourierColors.white[500],\n      borderRadius: '8px',\n      border: `1px solid ${CourierColors.gray[500]}`,\n      shadow: `0px 8px 16px -4px ${CourierColors.gray[500]}`,\n      animation: {\n        transition: 'none',\n        initialTransform: 'translate3d(0, 0, 0)',\n        visibleTransform: 'translate3d(0, 0, 0)'\n      }\n    }\n  },\n  inbox: {\n    header: {\n      backgroundColor: CourierColors.white[500],\n      shadow: `none`,\n      border: `1px solid ${CourierColors.gray[500]}`,\n      feeds: {\n        button: {\n          selectedFeedIconColor: CourierColors.black[500],\n          hoverBackgroundColor: CourierColors.gray[200],\n          activeBackgroundColor: CourierColors.gray[500],\n          transition: 'all 0.2s ease',\n          font: {\n            color: CourierColors.black[500],\n            family: undefined,\n            size: '16px'\n          },\n          changeFeedIcon: {\n            color: CourierColors.black[500],\n            svg: CourierIconSVGs.chevronDown\n          },\n          unreadCountIndicator: {\n            font: {\n              color: CourierColors.white[500],\n              family: undefined,\n              size: '12px'\n            },\n            backgroundColor: COURIER_DEFAULT_PRIMARY_COLOR,\n            borderRadius: '4px',\n            padding: '2px 6px',\n          }\n        },\n        menu: {\n          backgroundColor: CourierColors.white[500],\n          border: `1px solid ${CourierColors.gray[500]}`,\n          borderRadius: '6px',\n          shadow: `0px 4px 8px -2px ${CourierColors.gray[500]}`,\n          animation: {\n            transition: 'none',\n            initialTransform: 'translate3d(0, 0, 0)',\n            visibleTransform: 'translate3d(0, 0, 0)'\n          },\n          list: {\n            hoverBackgroundColor: CourierColors.gray[200],\n            activeBackgroundColor: CourierColors.gray[500],\n            divider: `none`,\n            font: {\n              color: CourierColors.black[500],\n              family: undefined,\n              size: '14px'\n            },\n            selectedIcon: {\n              color: CourierColors.black[500],\n              svg: CourierIconSVGs.check\n            }\n          }\n        },\n        tabs: {\n          borderRadius: {\n            topLeft: '4px',\n            topRight: '4px'\n          },\n          transition: 'all 0.2s ease',\n          default: {\n            indicatorHeight: '1px',\n            indicatorColor: 'transparent',\n            backgroundColor: 'transparent',\n            hoverBackgroundColor: CourierColors.gray[200],\n            activeBackgroundColor: CourierColors.gray[500],\n            font: {\n              color: CourierColors.gray[600],\n              family: undefined,\n              size: '14px'\n            },\n            unreadIndicator: {\n              font: {\n                color: CourierColors.gray[600],\n                family: undefined,\n                size: '12px'\n              },\n              backgroundColor: CourierColors.black[500_10],\n              borderRadius: '4px',\n              padding: '2px 6px',\n            }\n          },\n          selected: {\n            indicatorHeight: '1px',\n            indicatorColor: COURIER_DEFAULT_PRIMARY_COLOR,\n            backgroundColor: 'transparent',\n            hoverBackgroundColor: CourierColors.gray[200],\n            activeBackgroundColor: CourierColors.gray[500],\n            font: {\n              color: COURIER_DEFAULT_PRIMARY_COLOR,\n              family: undefined,\n              size: '14px'\n            },\n            unreadIndicator: {\n              font: {\n                color: CourierColors.white[500],\n                family: undefined,\n                size: '12px'\n              },\n              backgroundColor: COURIER_DEFAULT_PRIMARY_COLOR,\n              borderRadius: '4px',\n              padding: '2px 6px',\n            }\n          }\n        }\n      },\n      tabs: {\n        borderRadius: {\n          topLeft: '4px',\n          topRight: '4px'\n        },\n        transition: 'all 0.2s ease',\n        default: {\n          indicatorHeight: '1px',\n          indicatorColor: 'transparent',\n          backgroundColor: 'transparent',\n          hoverBackgroundColor: CourierColors.gray[200],\n          activeBackgroundColor: CourierColors.gray[500],\n          font: {\n            color: CourierColors.gray[600],\n            family: undefined,\n            size: '14px'\n          },\n          unreadIndicator: {\n            font: {\n              color: CourierColors.gray[600],\n              family: undefined,\n              size: '12px'\n            },\n            backgroundColor: CourierColors.black[500_10],\n            borderRadius: '4px',\n            padding: '2px 6px',\n          }\n        },\n        selected: {\n          indicatorHeight: '1px',\n          indicatorColor: COURIER_DEFAULT_PRIMARY_COLOR,\n          backgroundColor: 'transparent',\n          hoverBackgroundColor: CourierColors.gray[200],\n          activeBackgroundColor: CourierColors.gray[500],\n          font: {\n            color: COURIER_DEFAULT_PRIMARY_COLOR,\n            family: undefined,\n            size: '14px'\n          },\n          unreadIndicator: {\n            font: {\n              color: CourierColors.white[500],\n              family: undefined,\n              size: '12px'\n            },\n            backgroundColor: COURIER_DEFAULT_PRIMARY_COLOR,\n            borderRadius: '4px',\n            padding: '2px 6px',\n          }\n        }\n      },\n      actions: {\n        button: {\n          icon: {\n            color: CourierColors.black[500],\n            svg: CourierIconSVGs.overflow\n          },\n          backgroundColor: 'transparent',\n          hoverBackgroundColor: CourierColors.gray[200],\n          activeBackgroundColor: CourierColors.gray[500],\n        },\n        markAllRead: {\n          icon: {\n            color: CourierColors.black[500]\n          },\n          text: 'Read All'\n        },\n        archiveAll: {\n          icon: {\n            color: CourierColors.black[500]\n          },\n          text: 'Archive All'\n        },\n        archiveRead: {\n          icon: {\n            color: CourierColors.black[500]\n          },\n          text: 'Archive Read'\n        },\n        animation: {\n          transition: 'none',\n          initialTransform: 'translate3d(0, 0, 0)',\n          visibleTransform: 'translate3d(0, 0, 0)'\n        }\n      }\n    },\n    list: {\n      backgroundColor: CourierColors.white[500],\n      scrollbar: {\n        trackBackgroundColor: 'transparent',\n        thumbColor: CourierColors.black[500_20],\n        thumbHoverColor: CourierColors.black[500_20],\n        width: '8px',\n        height: '8px',\n        borderRadius: '4px'\n      },\n      item: {\n        backgroundColor: 'transparent',\n        unreadIndicatorColor: COURIER_DEFAULT_PRIMARY_COLOR,\n        hoverBackgroundColor: CourierColors.gray[200],\n        activeBackgroundColor: CourierColors.gray[500],\n        transition: 'all 0.2s ease',\n        actions: {\n          backgroundColor: 'transparent',\n          hoverBackgroundColor: CourierColors.gray[200],\n          activeBackgroundColor: CourierColors.gray[500],\n          border: `1px solid ${CourierColors.gray[500]}`,\n          borderRadius: '4px',\n          shadow: '0px 1px 2px 0px rgba(0, 0, 0, 0.06)',\n          font: {\n            color: CourierColors.black[500],\n            family: undefined,\n            size: '14px'\n          }\n        },\n        title: {\n          color: CourierColors.black[500],\n          family: undefined,\n          size: '14px'\n        },\n        subtitle: {\n          color: CourierColors.gray[600],\n          family: undefined,\n          size: '14px'\n        },\n        subtitleLink: {\n          color: COURIER_DEFAULT_PRIMARY_COLOR,\n          textDecoration: 'underline',\n          hoverColor: CourierColors.blue[400]\n        },\n        time: {\n          color: CourierColors.gray[600],\n          family: undefined,\n          size: '14px'\n        },\n        divider: `1px solid ${CourierColors.gray[200]}`,\n        menu: {\n          enabled: true,\n          backgroundColor: CourierColors.white[500],\n          border: `1px solid ${CourierColors.gray[500]}`,\n          borderRadius: '4px',\n          shadow: `0px 2px 4px -2px ${CourierColors.gray[500]}`,\n          animation: {\n            transition: 'none',\n            initialTransform: 'translate3d(0, 0, 0)',\n            visibleTransform: 'translate3d(0, 0, 0)'\n          },\n          longPress: {\n            displayDuration: 4000,\n            vibrationDuration: 50\n          },\n          item: {\n            hoverBackgroundColor: CourierColors.gray[200],\n            activeBackgroundColor: CourierColors.gray[500],\n            borderRadius: '0px',\n            read: {\n              color: CourierColors.black[500]\n            },\n            unread: {\n              color: CourierColors.black[500]\n            },\n            archive: {\n              color: CourierColors.black[500]\n            },\n            unarchive: {\n              color: CourierColors.black[500]\n            }\n          }\n        }\n      }\n    },\n    loading: {\n      animation: {\n        barColor: CourierColors.gray[500],\n        barHeight: '14px',\n        barBorderRadius: '14px',\n        duration: '2s'\n      },\n      divider: `1px solid ${CourierColors.gray[200]}`\n    },\n    empty: {\n      title: {\n        font: {\n          size: '16px',\n          weight: '500',\n          color: CourierColors.black[500],\n        }\n      },\n      button: {\n        text: 'Refresh'\n      }\n    },\n    error: {\n      title: {\n        font: {\n          size: '16px',\n          weight: '500',\n          color: CourierColors.black[500],\n        }\n      },\n      button: {\n        text: 'Retry'\n      }\n    }\n  }\n};\n\nexport const defaultDarkTheme: CourierInboxTheme = {\n  popup: {\n    button: {\n      icon: {\n        color: CourierColors.white[500],\n        svg: CourierIconSVGs.inbox\n      },\n      backgroundColor: 'transparent',\n      hoverBackgroundColor: CourierColors.white[500_10],\n      activeBackgroundColor: CourierColors.white[500_20],\n      unreadDotIndicator: {\n        backgroundColor: COURIER_DEFAULT_PRIMARY_COLOR,\n        borderRadius: '50%',\n        height: '8px',\n        width: '8px',\n      }\n    },\n    window: {\n      backgroundColor: CourierColors.black[500],\n      borderRadius: '8px',\n      border: `1px solid ${CourierColors.gray[400]}`,\n      shadow: `0px 4px 8px -2px ${CourierColors.white[500_20]}`,\n      animation: {\n        transition: 'none',\n        initialTransform: 'translate3d(0, 0, 0)',\n        visibleTransform: 'translate3d(0, 0, 0)'\n      }\n    }\n  },\n  inbox: {\n    header: {\n      backgroundColor: CourierColors.black[500],\n      shadow: `none`,\n      border: `1px solid ${CourierColors.gray[400]}`,\n      feeds: {\n        button: {\n          selectedFeedIconColor: CourierColors.white[500],\n          hoverBackgroundColor: CourierColors.white[500_10],\n          activeBackgroundColor: CourierColors.white[500_20],\n          transition: 'all 0.2s ease',\n          font: {\n            color: CourierColors.white[500],\n            family: undefined,\n            size: '16px'\n          },\n          changeFeedIcon: {\n            color: CourierColors.white[500],\n            svg: CourierIconSVGs.chevronDown\n          },\n          unreadCountIndicator: {\n            font: {\n              color: CourierColors.white[500],\n              family: undefined,\n              size: '12px'\n            },\n            backgroundColor: COURIER_DEFAULT_PRIMARY_COLOR,\n            borderRadius: '4px',\n            padding: '3px 8px',\n          }\n        },\n        menu: {\n          backgroundColor: CourierColors.black[500],\n          border: `1px solid ${CourierColors.gray[400]}`,\n          borderRadius: '6px',\n          shadow: `0px 4px 8px -2px ${CourierColors.white[500_20]}`,\n          animation: {\n            transition: 'none',\n            initialTransform: 'translate3d(0, 0, 0)',\n            visibleTransform: 'translate3d(0, 0, 0)'\n          },\n          list: {\n            hoverBackgroundColor: CourierColors.white[500_10],\n            activeBackgroundColor: CourierColors.white[500_20],\n            divider: `none`,\n            font: {\n              color: CourierColors.white[500],\n              family: undefined,\n              size: '14px'\n            },\n            selectedIcon: {\n              color: CourierColors.white[500],\n              svg: CourierIconSVGs.check\n            }\n          }\n        },\n        tabs: {\n          borderRadius: {\n            topLeft: '4px',\n            topRight: '4px'\n          },\n          transition: 'all 0.2s ease',\n          default: {\n            indicatorHeight: '1px',\n            indicatorColor: 'transparent',\n            backgroundColor: 'transparent',\n            hoverBackgroundColor: CourierColors.white[500_10],\n            activeBackgroundColor: CourierColors.white[500_20],\n            font: {\n              color: CourierColors.white[500],\n              family: undefined,\n              size: '14px'\n            },\n            unreadIndicator: {\n              font: {\n                color: CourierColors.white[500],\n                family: undefined,\n                size: '12px'\n              },\n              backgroundColor: CourierColors.white[500_10],\n              borderRadius: '4px',\n              padding: '3px 8px',\n            }\n          },\n          selected: {\n            indicatorHeight: '1px',\n            indicatorColor: COURIER_DEFAULT_PRIMARY_COLOR,\n            backgroundColor: 'transparent',\n            hoverBackgroundColor: CourierColors.white[500_10],\n            activeBackgroundColor: CourierColors.white[500_20],\n            font: {\n              color: COURIER_DEFAULT_PRIMARY_COLOR,\n              family: undefined,\n              size: '14px'\n            },\n            unreadIndicator: {\n              font: {\n                color: CourierColors.white[500],\n                family: undefined,\n                size: '12px'\n              },\n              backgroundColor: COURIER_DEFAULT_PRIMARY_COLOR,\n              borderRadius: '4px',\n              padding: '3px 8px',\n            }\n          }\n        }\n      },\n      tabs: {\n        borderRadius: {\n          topLeft: '4px',\n          topRight: '4px'\n        },\n        transition: 'all 0.2s ease',\n        default: {\n          indicatorHeight: '1px',\n          indicatorColor: 'transparent',\n          backgroundColor: 'transparent',\n          hoverBackgroundColor: CourierColors.white[500_10],\n          activeBackgroundColor: CourierColors.white[500_20],\n          font: {\n            color: CourierColors.white[500],\n            family: undefined,\n            size: '14px'\n          },\n          unreadIndicator: {\n            font: {\n              color: CourierColors.white[500],\n              family: undefined,\n              size: '12px'\n            },\n            backgroundColor: CourierColors.white[500_10],\n            borderRadius: '4px',\n            padding: '3px 8px',\n          }\n        },\n        selected: {\n          indicatorHeight: '1px',\n          indicatorColor: COURIER_DEFAULT_PRIMARY_COLOR,\n          backgroundColor: 'transparent',\n          hoverBackgroundColor: CourierColors.white[500_10],\n          activeBackgroundColor: CourierColors.white[500_20],\n          font: {\n            color: COURIER_DEFAULT_PRIMARY_COLOR,\n            family: undefined,\n            size: '14px'\n          },\n          unreadIndicator: {\n            font: {\n              color: CourierColors.white[500],\n              family: undefined,\n              size: '12px'\n            },\n            backgroundColor: COURIER_DEFAULT_PRIMARY_COLOR,\n            borderRadius: '4px',\n            padding: '3px 8px',\n          }\n        }\n      },\n      actions: {\n        button: {\n          icon: {\n            color: CourierColors.white[500],\n            svg: CourierIconSVGs.overflow\n          },\n          backgroundColor: 'transparent',\n          hoverBackgroundColor: CourierColors.white[500_10],\n          activeBackgroundColor: CourierColors.white[500_20],\n        },\n        markAllRead: {\n          icon: {\n            color: CourierColors.white[500]\n          },\n          text: 'Read All'\n        },\n        archiveAll: {\n          icon: {\n            color: CourierColors.white[500]\n          },\n          text: 'Archive All'\n        },\n        archiveRead: {\n          icon: {\n            color: CourierColors.white[500]\n          },\n          text: 'Archive Read'\n        },\n        animation: {\n          transition: 'none',\n          initialTransform: 'translate3d(0, 0, 0)',\n          visibleTransform: 'translate3d(0, 0, 0)'\n        }\n      }\n    },\n    list: {\n      backgroundColor: CourierColors.black[500],\n      scrollbar: {\n        trackBackgroundColor: 'transparent',\n        thumbColor: CourierColors.white[500_20],\n        thumbHoverColor: CourierColors.white[500_20],\n        width: '8px',\n        height: '8px',\n        borderRadius: '4px'\n      },\n      item: {\n        backgroundColor: 'transparent',\n        unreadIndicatorColor: COURIER_DEFAULT_PRIMARY_COLOR,\n        hoverBackgroundColor: CourierColors.white[500_10],\n        activeBackgroundColor: CourierColors.white[500_20],\n        transition: 'all 0.2s ease',\n        actions: {\n          backgroundColor: 'transparent',\n          hoverBackgroundColor: CourierColors.white[500_10],\n          activeBackgroundColor: CourierColors.white[500_20],\n          border: `1px solid ${CourierColors.gray[400]}`,\n          borderRadius: '4px',\n          shadow: `0px 1px 2px 0px ${CourierColors.white[500_10]}`,\n          font: {\n            color: CourierColors.white[500],\n            family: undefined,\n            size: '14px'\n          }\n        },\n        title: {\n          color: CourierColors.white[500],\n          family: undefined,\n          size: '14px'\n        },\n        subtitle: {\n          color: CourierColors.gray[500],\n          family: undefined,\n          size: '14px'\n        },\n        subtitleLink: {\n          color: COURIER_DEFAULT_PRIMARY_COLOR,\n          textDecoration: 'underline',\n          hoverColor: CourierColors.blue[400]\n        },\n        time: {\n          color: CourierColors.gray[500],\n          family: undefined,\n          size: '12px'\n        },\n        divider: `1px solid ${CourierColors.gray[400]}`,\n        menu: {\n          enabled: true,\n          backgroundColor: CourierColors.black[500],\n          border: `1px solid ${CourierColors.gray[400]}`,\n          borderRadius: '4px',\n          shadow: `0px 2px 4px -2px ${CourierColors.white[500_20]}`,\n          animation: {\n            transition: 'none',\n            initialTransform: 'translate3d(0, 0, 0)',\n            visibleTransform: 'translate3d(0, 0, 0)'\n          },\n          longPress: {\n            displayDuration: 4000,\n            vibrationDuration: 50\n          },\n          item: {\n            hoverBackgroundColor: CourierColors.white[500_10],\n            activeBackgroundColor: CourierColors.white[500_20],\n            borderRadius: '0px',\n            read: {\n              color: CourierColors.white[500]\n            },\n            unread: {\n              color: CourierColors.white[500]\n            },\n            archive: {\n              color: CourierColors.white[500]\n            },\n            unarchive: {\n              color: CourierColors.white[500]\n            }\n          }\n        }\n      }\n    },\n    loading: {\n      animation: {\n        barColor: CourierColors.gray[400],\n        barHeight: '14px',\n        barBorderRadius: '14px',\n        duration: '2s'\n      },\n      divider: `1px solid ${CourierColors.gray[400]}`\n    },\n    empty: {\n      title: {\n        font: {\n          size: '16px',\n          weight: '500',\n          color: CourierColors.white[500],\n        }\n      },\n      button: {\n        text: 'Refresh'\n      }\n    },\n    error: {\n      title: {\n        font: {\n          size: '16px',\n          weight: '500',\n          color: CourierColors.white[500],\n        }\n      },\n      button: {\n        text: 'Retry'\n      }\n    }\n  }\n};\n\n// Deep merge the themes, only overwriting non-optional properties\nexport const mergeTheme = (mode: SystemThemeMode, theme: CourierInboxTheme): CourierInboxTheme => {\n  const defaultTheme = mode === 'light' ? defaultLightTheme : defaultDarkTheme;\n  return {\n    popup: {\n      button: {\n        ...defaultTheme.popup?.button,\n        ...theme.popup?.button,\n        icon: {\n          ...defaultTheme.popup?.button?.icon,\n          ...theme.popup?.button?.icon\n        },\n        unreadDotIndicator: {\n          ...defaultTheme.popup?.button?.unreadDotIndicator,\n          ...theme.popup?.button?.unreadDotIndicator\n        }\n      },\n      window: {\n        ...defaultTheme.popup?.window,\n        ...theme.popup?.window,\n        animation: {\n          ...defaultTheme.popup?.window?.animation,\n          ...theme.popup?.window?.animation\n        }\n      }\n    },\n    inbox: {\n      header: {\n        ...defaultTheme.inbox?.header,\n        ...theme.inbox?.header,\n        feeds: {\n          ...defaultTheme.inbox?.header?.feeds,\n          ...theme.inbox?.header?.feeds,\n          button: {\n            ...defaultTheme.inbox?.header?.feeds?.button,\n            ...theme.inbox?.header?.feeds?.button,\n            font: {\n              ...defaultTheme.inbox?.header?.feeds?.button?.font,\n              ...theme.inbox?.header?.feeds?.button?.font\n            },\n            changeFeedIcon: {\n              ...defaultTheme.inbox?.header?.feeds?.button?.changeFeedIcon,\n              ...theme.inbox?.header?.feeds?.button?.changeFeedIcon\n            },\n            unreadCountIndicator: {\n              ...defaultTheme.inbox?.header?.feeds?.button?.unreadCountIndicator,\n              ...theme.inbox?.header?.feeds?.button?.unreadCountIndicator,\n              font: {\n                ...defaultTheme.inbox?.header?.feeds?.button?.unreadCountIndicator?.font,\n                ...theme.inbox?.header?.feeds?.button?.unreadCountIndicator?.font\n              }\n            }\n          },\n          menu: {\n            ...defaultTheme.inbox?.header?.feeds?.menu,\n            ...theme.inbox?.header?.feeds?.menu,\n            animation: {\n              ...defaultTheme.inbox?.header?.feeds?.menu?.animation,\n              ...theme.inbox?.header?.feeds?.menu?.animation\n            },\n            list: {\n              ...defaultTheme.inbox?.header?.feeds?.menu?.list,\n              ...theme.inbox?.header?.feeds?.menu?.list,\n              font: {\n                ...defaultTheme.inbox?.header?.feeds?.menu?.list?.font,\n                ...theme.inbox?.header?.feeds?.menu?.list?.font\n              },\n              selectedIcon: {\n                ...defaultTheme.inbox?.header?.feeds?.menu?.list?.selectedIcon,\n                ...theme.inbox?.header?.feeds?.menu?.list?.selectedIcon\n              }\n            }\n          },\n          tabs: {\n            ...defaultTheme.inbox?.header?.feeds?.tabs,\n            ...theme.inbox?.header?.feeds?.tabs,\n            default: {\n              ...defaultTheme.inbox?.header?.feeds?.tabs?.default,\n              ...theme.inbox?.header?.feeds?.tabs?.default,\n              font: {\n                ...defaultTheme.inbox?.header?.feeds?.tabs?.default?.font,\n                ...theme.inbox?.header?.feeds?.tabs?.default?.font\n              },\n              unreadIndicator: {\n                ...defaultTheme.inbox?.header?.feeds?.tabs?.default?.unreadIndicator,\n                ...theme.inbox?.header?.feeds?.tabs?.default?.unreadIndicator,\n                font: {\n                  ...defaultTheme.inbox?.header?.feeds?.tabs?.default?.unreadIndicator?.font,\n                  ...theme.inbox?.header?.feeds?.tabs?.default?.unreadIndicator?.font\n                }\n              }\n            },\n            selected: {\n              ...defaultTheme.inbox?.header?.feeds?.tabs?.selected,\n              ...theme.inbox?.header?.feeds?.tabs?.selected,\n              font: {\n                ...defaultTheme.inbox?.header?.feeds?.tabs?.selected?.font,\n                ...theme.inbox?.header?.feeds?.tabs?.selected?.font\n              },\n              unreadIndicator: {\n                ...defaultTheme.inbox?.header?.feeds?.tabs?.selected?.unreadIndicator,\n                ...theme.inbox?.header?.feeds?.tabs?.selected?.unreadIndicator,\n                font: {\n                  ...defaultTheme.inbox?.header?.feeds?.tabs?.selected?.unreadIndicator?.font,\n                  ...theme.inbox?.header?.feeds?.tabs?.selected?.unreadIndicator?.font\n                }\n              }\n            }\n          }\n        },\n        tabs: {\n          ...defaultTheme.inbox?.header?.tabs,\n          ...theme.inbox?.header?.tabs,\n          default: {\n            ...defaultTheme.inbox?.header?.tabs?.default,\n            ...theme.inbox?.header?.tabs?.default,\n            font: {\n              ...defaultTheme.inbox?.header?.tabs?.default?.font,\n              ...theme.inbox?.header?.tabs?.default?.font\n            },\n            unreadIndicator: {\n              ...defaultTheme.inbox?.header?.tabs?.default?.unreadIndicator,\n              ...theme.inbox?.header?.tabs?.default?.unreadIndicator,\n              font: {\n                ...defaultTheme.inbox?.header?.tabs?.default?.unreadIndicator?.font,\n                ...theme.inbox?.header?.tabs?.default?.unreadIndicator?.font\n              }\n            }\n          },\n          selected: {\n            ...defaultTheme.inbox?.header?.tabs?.selected,\n            ...theme.inbox?.header?.tabs?.selected,\n            font: {\n              ...defaultTheme.inbox?.header?.tabs?.selected?.font,\n              ...theme.inbox?.header?.tabs?.selected?.font\n            },\n            unreadIndicator: {\n              ...defaultTheme.inbox?.header?.tabs?.selected?.unreadIndicator,\n              ...theme.inbox?.header?.tabs?.selected?.unreadIndicator,\n              font: {\n                ...defaultTheme.inbox?.header?.tabs?.selected?.unreadIndicator?.font,\n                ...theme.inbox?.header?.tabs?.selected?.unreadIndicator?.font\n              }\n            }\n          }\n        },\n        actions: {\n          ...defaultTheme.inbox?.header?.actions,\n          ...theme.inbox?.header?.actions,\n          button: {\n            ...defaultTheme.inbox?.header?.actions?.button,\n            ...theme.inbox?.header?.actions?.button,\n            icon: {\n              ...defaultTheme.inbox?.header?.actions?.button?.icon,\n              ...theme.inbox?.header?.actions?.button?.icon\n            }\n          },\n          markAllRead: {\n            ...defaultTheme.inbox?.header?.actions?.markAllRead,\n            ...theme.inbox?.header?.actions?.markAllRead,\n            icon: {\n              ...defaultTheme.inbox?.header?.actions?.markAllRead?.icon,\n              ...theme.inbox?.header?.actions?.markAllRead?.icon\n            }\n          },\n          archiveAll: {\n            ...defaultTheme.inbox?.header?.actions?.archiveAll,\n            ...theme.inbox?.header?.actions?.archiveAll,\n            icon: {\n              ...defaultTheme.inbox?.header?.actions?.archiveAll?.icon,\n              ...theme.inbox?.header?.actions?.archiveAll?.icon\n            }\n          },\n          archiveRead: {\n            ...defaultTheme.inbox?.header?.actions?.archiveRead,\n            ...theme.inbox?.header?.actions?.archiveRead,\n            icon: {\n              ...defaultTheme.inbox?.header?.actions?.archiveRead?.icon,\n              ...theme.inbox?.header?.actions?.archiveRead?.icon\n            }\n          },\n          animation: {\n            ...defaultTheme.inbox?.header?.actions?.animation,\n            ...theme.inbox?.header?.actions?.animation\n          }\n        }\n      },\n      list: {\n        ...defaultTheme.inbox?.list,\n        ...theme.inbox?.list,\n        scrollbar: {\n          ...defaultTheme.inbox?.list?.scrollbar,\n          ...theme.inbox?.list?.scrollbar\n        },\n        item: {\n          ...defaultTheme.inbox?.list?.item,\n          ...theme.inbox?.list?.item,\n          actions: {\n            ...defaultTheme.inbox?.list?.item?.actions,\n            ...theme.inbox?.list?.item?.actions,\n            font: {\n              ...defaultTheme.inbox?.list?.item?.actions?.font,\n              ...theme.inbox?.list?.item?.actions?.font\n            }\n          },\n          title: {\n            ...defaultTheme.inbox?.list?.item?.title,\n            ...theme.inbox?.list?.item?.title\n          },\n          subtitle: {\n            ...defaultTheme.inbox?.list?.item?.subtitle,\n            ...theme.inbox?.list?.item?.subtitle\n          },\n          subtitleLink: {\n            ...defaultTheme.inbox?.list?.item?.subtitleLink,\n            ...theme.inbox?.list?.item?.subtitleLink\n          },\n          time: {\n            ...defaultTheme.inbox?.list?.item?.time,\n            ...theme.inbox?.list?.item?.time\n          },\n          menu: {\n            ...defaultTheme.inbox?.list?.item?.menu,\n            ...theme.inbox?.list?.item?.menu,\n            animation: {\n              ...defaultTheme.inbox?.list?.item?.menu?.animation,\n              ...theme.inbox?.list?.item?.menu?.animation\n            },\n            item: {\n              ...defaultTheme.inbox?.list?.item?.menu?.item,\n              ...theme.inbox?.list?.item?.menu?.item,\n              read: {\n                ...defaultTheme.inbox?.list?.item?.menu?.item?.read,\n                ...theme.inbox?.list?.item?.menu?.item?.read\n              },\n              unread: {\n                ...defaultTheme.inbox?.list?.item?.menu?.item?.unread,\n                ...theme.inbox?.list?.item?.menu?.item?.unread\n              },\n              archive: {\n                ...defaultTheme.inbox?.list?.item?.menu?.item?.archive,\n                ...theme.inbox?.list?.item?.menu?.item?.archive\n              },\n              unarchive: {\n                ...defaultTheme.inbox?.list?.item?.menu?.item?.unarchive,\n                ...theme.inbox?.list?.item?.menu?.item?.unarchive\n              }\n            }\n          }\n        }\n      },\n      loading: {\n        ...defaultTheme.inbox?.loading,\n        ...theme.inbox?.loading,\n        animation: {\n          ...defaultTheme.inbox?.loading?.animation,\n          ...theme.inbox?.loading?.animation\n        }\n      },\n      empty: {\n        ...defaultTheme.inbox?.empty,\n        ...theme.inbox?.empty,\n        title: {\n          ...defaultTheme.inbox?.empty?.title,\n          ...theme.inbox?.empty?.title,\n          font: {\n            ...defaultTheme.inbox?.empty?.title?.font,\n            ...theme.inbox?.empty?.title?.font\n          }\n        },\n        button: {\n          ...defaultTheme.inbox?.empty?.button,\n          ...theme.inbox?.empty?.button,\n          font: {\n            ...defaultTheme.inbox?.empty?.button?.font,\n            ...theme.inbox?.empty?.button?.font\n          }\n        }\n      },\n      error: {\n        ...defaultTheme.inbox?.error,\n        ...theme.inbox?.error,\n        title: {\n          ...defaultTheme.inbox?.error?.title,\n          ...theme.inbox?.error?.title,\n          font: {\n            ...defaultTheme.inbox?.error?.title?.font,\n            ...theme.inbox?.error?.title?.font\n          }\n        },\n        button: {\n          ...defaultTheme.inbox?.error?.button,\n          ...theme.inbox?.error?.button,\n          font: {\n            ...defaultTheme.inbox?.error?.button?.font,\n            ...theme.inbox?.error?.button?.font\n          }\n        }\n      }\n    }\n  };\n};\n","import { CourierThemeManager, CourierThemeSubscription, SystemThemeMode } from \"@trycourier/courier-ui-core\";\nimport { CourierInboxTheme, defaultDarkTheme, defaultLightTheme, mergeTheme } from \"./courier-inbox-theme\";\n\nexport interface CourierInboxThemeSubscription extends CourierThemeSubscription<CourierInboxTheme> {\n  manager: CourierInboxThemeManager;\n}\n\n/**\n * Inbox-specific theme manager that extends the abstract CourierThemeManager.\n * Provides inbox theme management with light/dark mode support.\n */\nexport class CourierInboxThemeManager extends CourierThemeManager<CourierInboxTheme> {\n\n  // Event ID for inbox theme changes\n  protected readonly THEME_CHANGE_EVENT: string = 'courier_inbox_theme_change';\n\n  constructor(initialTheme: CourierInboxTheme) {\n    super(initialTheme);\n  }\n\n  /**\n   * Get the default light theme for inbox\n   */\n  protected getDefaultLightTheme(): CourierInboxTheme {\n    return defaultLightTheme;\n  }\n\n  /**\n   * Get the default dark theme for inbox\n   */\n  protected getDefaultDarkTheme(): CourierInboxTheme {\n    return defaultDarkTheme;\n  }\n\n  /**\n   * Merge the inbox theme with defaults\n   */\n  protected mergeTheme(mode: SystemThemeMode, theme: CourierInboxTheme): CourierInboxTheme {\n    return mergeTheme(mode, theme);\n  }\n\n  /**\n   * Subscribe to inbox theme changes\n   * @param callback - Function to run when the theme changes\n   * @returns Object with unsubscribe method to stop listening\n   */\n  public subscribe(callback: (theme: CourierInboxTheme) => void): CourierInboxThemeSubscription {\n    const baseSubscription = super.subscribe(callback);\n    return {\n      ...baseSubscription,\n      manager: this\n    };\n  }\n\n}\n","import { AuthenticationListener, Courier, InboxMessage } from \"@trycourier/courier-js\";\nimport { CourierInboxList } from \"./courier-inbox-list\";\nimport { CourierInboxHeader } from \"./courier-inbox-header\";\nimport { CourierBaseElement, CourierComponentThemeMode, injectGlobalStyle, registerElement } from \"@trycourier/courier-ui-core\";\nimport { CourierInboxFeed, CourierInboxTab, InboxDataSet } from \"../types/inbox-data-set\";\nimport { CourierInboxDataStoreListener } from \"../datastore/datastore-listener\";\nimport { CourierInboxDatastore } from \"../datastore/inbox-datastore\";\nimport { CourierInboxHeaderFactoryProps, CourierInboxHeaderFeed, CourierInboxListItemActionFactoryProps, CourierInboxListItemFactoryProps, CourierInboxPaginationItemFactoryProps, CourierInboxStateEmptyFactoryProps, CourierInboxStateErrorFactoryProps, CourierInboxStateLoadingFactoryProps } from \"../types/factories\";\nimport { CourierInboxTheme, defaultLightTheme } from \"../types/courier-inbox-theme\";\nimport { CourierInboxThemeManager } from \"../types/courier-inbox-theme-manager\";\nimport { CourierInboxHeaderAction, CourierInboxListItemAction, defaultFeeds, defaultActions, defaultListItemActions } from \"../types/inbox-defaults\";\n\nexport class CourierInbox extends CourierBaseElement {\n\n  static get id(): string {\n    return 'courier-inbox';\n  }\n\n  /**\n   * Returns the default set of feeds used by CourierInbox.\n   * Exposed as a convenience for constructing matching datasets in\n   * custom integrations (for example, when using CourierInboxDatastore directly).\n   * \n   * @example\n   * Returns:\n   * [\n   *   {\n   *     feedId: 'inbox_feed',\n   *     title: 'Inbox',\n   *     iconSVG: CourierIconSVGs.inbox,\n   *     tabs: [\n   *       {\n   *         datasetId: 'all_messages',\n   *         title: 'All Messages',\n   *         filter: {}\n   *       }\n   *     ]\n   *   },\n   *   {\n   *     feedId: 'archive_feed',\n   *     title: 'Archive',\n   *     iconSVG: CourierIconSVGs.archive,\n   *     tabs: [\n   *       {\n   *         datasetId: 'archived_messages',\n   *         title: 'Archived Messages',\n   *         filter: {\n   *           archived: true\n   *         }\n   *       }\n   *     ]\n   *   }\n   * ]\n   */\n  public static defaultFeeds(): CourierInboxFeed[] {\n    return defaultFeeds();\n  }\n\n  /**\n   * Returns the default header actions used by CourierInbox.\n   * Exposed as a convenience for building matching headers in custom UIs.\n   * \n   * @example\n   * Returns:\n   * [\n   *   { id: 'readAll' },\n   *   { id: 'archiveRead' },\n   *   { id: 'archiveAll' }\n   * ]\n   */\n  public static defaultActions(): CourierInboxHeaderAction[] {\n    return defaultActions();\n  }\n\n  /**\n   * Returns the default list item actions used by CourierInbox.\n   * Exposed as a convenience for building matching message menus in custom UIs.\n   * \n   * @example\n   * Returns:\n   * [\n   *   { id: 'read_unread' },\n   *   { id: 'archive_unarchive' }\n   * ]\n   */\n  public static defaultListItemActions(): CourierInboxListItemAction[] {\n    return defaultListItemActions();\n  }\n\n  // State\n  private _currentFeedId: string = defaultFeeds()[0].feedId;\n  private _feedTabMap: Map<string, string> = new Map();\n\n  /** Returns the current feed type. */\n  get currentFeedId(): string {\n    return this._currentFeedId;\n  }\n\n  /** Returns the current tab ID for the current feed. */\n  private get _currentTabId(): string {\n    return this.getSelectedTabIdForFeed(this._currentFeedId);\n  }\n\n  /** Returns the selected tab ID for a given feed ID. */\n  private getSelectedTabIdForFeed(feedId: string): string {\n    return this._feedTabMap.get(feedId) ?? 'unknown_tab';\n  }\n\n  // Theming\n  // Theme manager instance for handling theming logic\n  private _themeManager: CourierInboxThemeManager;\n\n  /** Returns the current theme object. */\n  get theme() {\n    return this._themeManager.getTheme();\n  }\n\n  /**\n   * Set the light theme for the inbox.\n   * @param theme The light theme object to set.\n   */\n  public setLightTheme(theme: CourierInboxTheme) {\n    this._themeManager.setLightTheme(theme);\n  }\n\n  /**\n   * Set the dark theme for the inbox.\n   * @param theme The dark theme object to set.\n   */\n  public setDarkTheme(theme: CourierInboxTheme) {\n    this._themeManager.setDarkTheme(theme);\n  }\n\n  /**\n   * Set the theme mode (light/dark/system).\n   * @param mode The theme mode to set.\n   */\n  public setMode(mode: CourierComponentThemeMode) {\n    this._themeManager.setMode(mode);\n  }\n\n\n  // Components\n  private _inboxStyle?: HTMLStyleElement;\n  private _list?: CourierInboxList;\n  private _datastoreListener: CourierInboxDataStoreListener | undefined;\n  private _authListener: AuthenticationListener | undefined;\n  private _feeds: CourierInboxFeed[] = defaultFeeds();\n\n  // Header\n  private _header?: CourierInboxHeader;\n  private _headerFactory: ((props: CourierInboxHeaderFactoryProps | undefined | null) => HTMLElement) | undefined | null = undefined;\n  private _actions: CourierInboxHeaderAction[] = CourierInbox.defaultActions();\n\n  // List\n  private _onMessageClick?: (props: CourierInboxListItemFactoryProps) => void;\n  private _onMessageActionClick?: (props: CourierInboxListItemActionFactoryProps) => void;\n  private _onMessageLongPress?: (props: CourierInboxListItemFactoryProps) => void;\n  private _listItemActions: CourierInboxListItemAction[] = CourierInbox.defaultListItemActions();\n\n  // Default props\n  private _defaultProps = {\n    height: 'auto'\n  };\n\n  static get observedAttributes() {\n    return ['height', 'light-theme', 'dark-theme', 'mode', 'feeds', 'message-click', 'message-action-click', 'message-long-press'];\n  }\n\n  constructor(themeManager?: CourierInboxThemeManager) {\n    super();\n    this._themeManager = themeManager ?? new CourierInboxThemeManager(defaultLightTheme);\n  }\n\n  private resetInitialFeedAndTab() {\n    if (!this._feeds.length) {\n      throw new Error('No feeds are available to initialize.');\n    }\n\n    // Clear the feed tab map\n    this._feedTabMap.clear();\n\n    // Set the default (first) tab for each feed in the map\n    for (const feed of this._feeds) {\n      if (!feed.tabs || !feed.tabs.length) {\n        throw new Error(`Feed \"${feed.feedId}\" does not contain any tabs. You must have at least one tab in each feed.`);\n      }\n      // Set the default (first) tab for each feed in the map\n      this._feedTabMap.set(feed.feedId, feed.tabs[0].datasetId);\n    }\n\n    // Optionally set current feed and tab if not already set\n    this._currentFeedId = this._feeds[0].feedId;\n  }\n\n  onComponentMounted() {\n    this.readInitialThemeAttributes();\n    this.attachElements();\n    this.setupThemeSubscription();\n    this.setupAuthListener();\n    this.initializeInboxData();\n  }\n\n  private readInitialThemeAttributes() {\n    const lightTheme = this.getAttribute('light-theme');\n    if (lightTheme) {\n      try {\n        this.setLightTheme(JSON.parse(lightTheme));\n      } catch (error) {\n        Courier.shared.client?.options.logger?.error('Failed to parse light-theme attribute:', error);\n      }\n    }\n\n    const darkTheme = this.getAttribute('dark-theme');\n    if (darkTheme) {\n      try {\n        this.setDarkTheme(JSON.parse(darkTheme));\n      } catch (error) {\n        Courier.shared.client?.options.logger?.error('Failed to parse dark-theme attribute:', error);\n      }\n    }\n\n    const mode = this.getAttribute('mode');\n    if (mode) {\n      this._themeManager.setMode(mode as CourierComponentThemeMode);\n    }\n  }\n\n  private setupThemeSubscription() {\n\n    // Subscribe to theme changes\n    this._themeManager.subscribe((_) => {\n      this.refreshTheme();\n    });\n\n    // Refresh the theme\n    this.refreshTheme();\n  }\n\n  private setupAuthListener() {\n    this._authListener = Courier.shared.addAuthenticationListener(({ userId }) => {\n      if (userId) {\n        this.refresh().catch((err) => {\n          // Inbox fetch can fail (e.g. network). Handle to avoid unhandled rejection.\n          Courier.shared.client?.options.logger?.warn?.('Inbox refresh failed after sign-in', err);\n        });\n      }\n    });\n  }\n\n  private initializeInboxData() {\n\n    // Reset the initial feed and tab\n    this.resetInitialFeedAndTab();\n\n    // Create the datasets from the feeds\n    CourierInboxDatastore.shared.registerFeeds(this._feeds);\n\n    // Create the data store listener\n    this._datastoreListener = new CourierInboxDataStoreListener({\n      onError: (error: Error) => {\n        this._list?.setError(error);\n      },\n      onDataSetChange: (dataset: InboxDataSet) => {\n        if (this._currentTabId === dataset.id) {\n          this._list?.setDataSet(dataset);\n          this.updateHeader();\n        }\n      },\n      onPageAdded: (dataset: InboxDataSet) => {\n        if (this._currentTabId === dataset.id) {\n          this._list?.addPage(dataset);\n          this.updateHeader();\n        }\n      },\n      onMessageAdd: (message: InboxMessage, index: number, datasetId: string) => {\n        if (this._currentTabId === datasetId) {\n          this._list?.addMessage(message, index);\n          this.updateHeader();\n        }\n      },\n      onMessageRemove: (_: InboxMessage, index: number, datasetId: string) => {\n        if (this._currentTabId === datasetId) {\n          this._list?.removeMessage(index);\n          this.updateHeader();\n        }\n      },\n      onMessageUpdate: (message: InboxMessage, index: number, datasetId: string) => {\n        if (this._currentTabId === datasetId) {\n          this._list?.updateMessage(message, index);\n          this.updateHeader();\n        }\n      },\n      onUnreadCountChange: (unreadCount: number, datasetId: string) => {\n        // Always update the tab badges for all tabs\n        this._header?.tabs?.updateTabUnreadCount(datasetId, unreadCount);\n\n        // Only update the main unread count if it's the current tab\n        if (this._currentTabId === datasetId) {\n          this.updateHeader();\n        }\n      },\n      onTotalUnreadCountChange: (_totalUnreadCount: number) => {\n        // Re-render the header so custom headers that depend on total unread count can update\n        this.updateHeader();\n      }\n    });\n\n    // Add the data store listener to the datastore\n    CourierInboxDatastore.shared.addDataStoreListener(this._datastoreListener);\n\n    // Refresh the inbox\n    this.refresh();\n  }\n\n  private attachElements() {\n\n    // Inject style\n    this._inboxStyle = injectGlobalStyle(CourierInbox.id, this.getStyles());\n\n    // Header\n    this._header = new CourierInboxHeader({\n      themeManager: this._themeManager,\n      actions: this._actions,\n      onFeedChange: (feed: CourierInboxFeed) => {\n        this.selectFeed(feed.feedId);\n      },\n      onFeedReselected: (feed: CourierInboxFeed) => {\n        this.selectTab(feed.tabs[0].datasetId);\n        this._list?.scrollToTop();\n        this._header?.tabs?.scrollToStart();\n      },\n      onTabChange: (tab: CourierInboxTab) => {\n        this.selectTab(tab.datasetId);\n      },\n      onTabReselected: (_tab: CourierInboxTab) => {\n        this._list?.scrollToTop();\n      }\n    });\n\n    // Build the element and set the initial feeds\n    this._header?.build(undefined);\n    this._header?.setFeeds(this._feeds);\n    this.appendChild(this._header);\n\n    // Create list and ensure it's properly initialized\n    this._list = new CourierInboxList({\n      themeManager: this._themeManager,\n      listItemActions: this._listItemActions,\n      canClickListItems: false,\n      canLongPressListItems: false,\n      onRefresh: () => {\n        this.refresh();\n      },\n      onPaginationTrigger: async (datasetId: string) => {\n        try {\n          await CourierInboxDatastore.shared.fetchNextPageOfMessages({\n            datasetId: datasetId\n          });\n        } catch (error) {\n          Courier.shared.client?.options.logger?.error('Failed to fetch next page of messages:', error);\n        }\n      },\n      onMessageClick: (message, index) => {\n        CourierInboxDatastore.shared.openMessage({ message });\n        CourierInboxDatastore.shared.clickMessage({ message });\n\n        this.dispatchEvent(new CustomEvent('message-click', {\n          detail: { message, index },\n          bubbles: true,\n          composed: true\n        }));\n\n        this._onMessageClick?.({ message, index });\n      },\n      onMessageActionClick: (message, action, index) => {\n\n        // TODO: Track action click?\n\n        this.dispatchEvent(new CustomEvent('message-action-click', {\n          detail: { message, action, index },\n          bubbles: true,\n          composed: true\n        }));\n\n        this._onMessageActionClick?.({ message, action, index });\n      },\n      onMessageLongPress: (message, index) => {\n        this.dispatchEvent(new CustomEvent('message-long-press', {\n          detail: { message, index },\n          bubbles: true,\n          composed: true\n        }));\n\n        this._onMessageLongPress?.({ message, index });\n      }\n    });\n\n    this.appendChild(this._list);\n\n  }\n\n  onComponentUnmounted() {\n    this._themeManager.cleanup();\n    this._datastoreListener?.remove();\n    this._authListener?.remove();\n    this._inboxStyle?.remove();\n  }\n\n  private refreshTheme() {\n    this._list?.refreshInfoStateThemes();\n    if (this._inboxStyle) {\n      this._inboxStyle.textContent = this.getStyles();\n    }\n  }\n\n  private getStyles(): string {\n    return `\n      ${CourierInbox.id} {\n        display: flex;\n        flex-direction: column;\n        width: 100%;\n        height: ${this._defaultProps.height};\n      }\n\n      ${CourierInbox.id} courier-inbox-list {\n        flex: 1;\n        overflow-y: auto;\n        overflow-x: hidden;\n      }\n    `;\n  }\n\n  /**\n   * Sets a custom header factory for the inbox.\n   * @param factory - A function that returns an HTMLElement to render as the header.\n   */\n  public setHeader(factory: (props: CourierInboxHeaderFactoryProps | undefined | null) => HTMLElement) {\n    this._headerFactory = factory;\n    this.updateHeader();\n  }\n\n  /**\n   * Removes the custom header factory from the inbox, reverting to the default header.\n   */\n  public removeHeader() {\n    this._headerFactory = null;\n    this.updateHeader();\n  }\n\n  /**\n   * Sets a custom loading state factory for the inbox list.\n   * @param factory - A function that returns an HTMLElement to render as the loading state.\n   */\n  public setLoadingState(factory: (props: CourierInboxStateLoadingFactoryProps | undefined | null) => HTMLElement) {\n    this._list?.setLoadingStateFactory(factory);\n  }\n\n  /**\n   * Sets a custom empty state factory for the inbox list.\n   * @param factory - A function that returns an HTMLElement to render as the empty state.\n   */\n  public setEmptyState(factory: (props: CourierInboxStateEmptyFactoryProps | undefined | null) => HTMLElement) {\n    this._list?.setEmptyStateFactory(factory);\n  }\n\n  /**\n   * Sets a custom error state factory for the inbox list.\n   * @param factory - A function that returns an HTMLElement to render as the error state.\n   */\n  public setErrorState(factory: (props: CourierInboxStateErrorFactoryProps | undefined | null) => HTMLElement) {\n    this._list?.setErrorStateFactory(factory);\n  }\n\n  /**\n   * Sets a custom list item factory for the inbox list.\n   * @param factory - A function that returns an HTMLElement to render as a list item.\n   */\n  public setListItem(factory: (props: CourierInboxListItemFactoryProps | undefined | null) => HTMLElement) {\n    this._list?.setListItemFactory(factory);\n  }\n\n  /**\n   * Sets a custom pagination item factory for the inbox list.\n   * @param factory - A function that returns an HTMLElement to render as a pagination item.\n   */\n  public setPaginationItem(factory: (props: CourierInboxPaginationItemFactoryProps | undefined | null) => HTMLElement) {\n    this._list?.setPaginationItemFactory(factory);\n  }\n\n  /**\n   * Registers a handler for message click events.\n   * @param handler - A function to be called when a message is clicked.\n   */\n  public onMessageClick(handler?: (props: CourierInboxListItemFactoryProps) => void) {\n    this._onMessageClick = handler;\n\n    // Tell the list if we can click. This will update styles if needed.\n    this._list?.setCanClickListItems(handler !== undefined);\n  }\n\n  /**\n   * Registers a handler for message action click events.\n   * @param handler - A function to be called when a message action is clicked.\n   */\n  public onMessageActionClick(handler?: (props: CourierInboxListItemActionFactoryProps) => void) {\n    this._onMessageActionClick = handler;\n  }\n\n  /**\n   * Registers a handler for message long press events.\n   * @param handler - A function to be called when a message is long-pressed.\n   */\n  public onMessageLongPress(handler?: (props: CourierInboxListItemFactoryProps) => void) {\n    this._onMessageLongPress = handler;\n\n    // Tell the list if we can long press. This will update styles if needed.\n    this._list?.setCanLongPressListItems(handler !== undefined);\n  }\n\n  private async reloadListForTab() {\n    this._list?.selectDataset(this._currentTabId);\n\n    // Load data for the tab\n    await CourierInboxDatastore.shared.load({\n      canUseCache: true,\n      datasetIds: [this._currentTabId]\n    });\n  }\n\n  /**\n   * Sets the active feed for the inbox.\n   * @param feedId - The feed ID to display.\n   */\n  public selectFeed(feedId: string) {\n    const feed = this._feeds.find(f => f.feedId === feedId);\n    if (!feed) {\n      throw new Error(`Feed \"${feedId}\" does not exist.`);\n    }\n\n    // If reselecting the current feed, reset to first tab and reload\n    if (this._currentFeedId === feedId) {\n      if (!feed.tabs || feed.tabs.length === 0) {\n        throw new Error(`Feed \"${feedId}\" does not contain any tabs. You must have at least one tab in each feed.`);\n      }\n      const firstTabId = feed.tabs[0].datasetId;\n      this._header?.selectFeed(feedId, firstTabId);\n      this.selectTab(firstTabId);\n      return;\n    }\n\n    // Set the current feed and update the header\n    this._currentFeedId = feedId;\n    this._header?.selectFeed(feedId, this._currentTabId);\n    this.selectTab(this._currentTabId);\n  }\n\n  /**\n   * Switches to a tab by updating components and loading data.\n   * @param tabId - The tab ID to switch to.\n   * @param animate - Whether to animate the scroll to top.\n   */\n  public selectTab(tabId: string) {\n    const currentFeed = this._feeds.find(feed => feed.feedId === this._currentFeedId);\n    if (!currentFeed) {\n      throw new Error(`Feed \"${this._currentFeedId}\" does not exist.`);\n    }\n\n    const tabExistsInCurrentFeed = currentFeed.tabs?.some(tab => tab.datasetId === tabId);\n    if (!tabExistsInCurrentFeed) {\n      throw new Error(`Tab \"${tabId}\" does not exist in feed \"${currentFeed.feedId}\".`);\n    }\n\n    // Save the selected tab for the current feed\n    this._feedTabMap.set(this._currentFeedId, tabId);\n\n    // Update components\n    this._header?.tabs?.setSelectedTab(tabId);\n    this.reloadListForTab();\n  }\n\n  /**\n   * Updates unread counts for a list of tabs.\n   * @param tabs - The tabs to update unread counts for.\n   */\n  private updateTabUnreadCounts(tabs: CourierInboxTab[]) {\n    for (const tab of tabs) {\n      const dataset = CourierInboxDatastore.shared.getDatasetById(tab.datasetId);\n      if (dataset) {\n        this._header?.tabs?.updateTabUnreadCount(tab.datasetId, dataset.unreadCount);\n      }\n    }\n  }\n\n  /**\n   * Sets the enabled header actions for the inbox.\n   * Pass an empty array to remove all actions.\n   * @param actions - The header actions to enable (e.g., [{ id: 'readAll', iconSVG: '...', text: '...' }]).\n   */\n  public setActions(actions: CourierInboxHeaderAction[]) {\n    this._actions = actions;\n    this._header?.setActions(this._actions);\n  }\n\n  /**\n   * Sets the enabled list item actions for the inbox.\n   * Pass an empty array to remove all actions.\n   * @param actions - The list item actions to enable (e.g., [{ id: 'read_unread', readIconSVG: '...', unreadIconSVG: '...' }]).\n   */\n  public setListItemActions(actions: CourierInboxListItemAction[]) {\n    this._listItemActions = actions;\n    this._list?.setListItemActions(this._listItemActions);\n  }\n\n  /**\n   * Sets the feeds for the inbox.\n   * @param feeds - The feeds to set for the inbox.\n   */\n  public setFeeds(feeds: CourierInboxFeed[]) {\n    this._feeds = feeds;\n\n    // Reset the initial feed and tab\n    this.resetInitialFeedAndTab();\n\n    // Create datasets from the feeds\n    CourierInboxDatastore.shared.registerFeeds(this._feeds);\n\n    // Update the header with new feeds\n    this._header?.setFeeds(this._feeds);\n\n    // Select the correct feed and tab before updating header to avoid tabs flashing\n    this._header?.selectFeed(this._currentFeedId, this._currentTabId);\n\n    // Update header (now with correct feed/tab selected)\n    this.updateHeader();\n\n    // Reload the list for the current tab\n    this._list?.selectDataset(this._currentTabId);\n    this._list?.scrollToTop(false);\n\n    // Refresh the inbox data\n    this.refresh();\n  }\n\n  /** Get the current set of feeds. */\n  public getFeeds() {\n    return this._feeds;\n  }\n\n  /**\n   * Returns the header feeds in the format expected by header factories.\n   * @public\n   */\n  public getHeaderFeeds(): CourierInboxHeaderFeed[] {\n    return this._feeds.map(feed => ({\n      feedId: feed.feedId,\n      title: feed.title,\n      iconSVG: feed.iconSVG,\n      tabs: feed.tabs.map(tab => ({\n        datasetId: tab.datasetId,\n        title: tab.title,\n        unreadCount: CourierInboxDatastore.shared.getDatasetById(tab.datasetId)?.unreadCount ?? 0,\n        isSelected: tab.datasetId === this._currentTabId,\n        filter: tab.filter\n      })),\n      isSelected: feed.feedId === this._currentFeedId\n    }));\n  }\n\n  private updateHeader() {\n    const tabId = this._currentTabId;\n    if (!tabId) {\n      return;\n    }\n    const props: CourierInboxHeaderFactoryProps = {\n      feeds: this.getHeaderFeeds()\n    };\n\n    switch (this._headerFactory) {\n      case undefined:\n        // Render default header\n        this._header?.render(props);\n        break;\n      case null:\n        // Remove header\n        this._header?.build(null);\n        break;\n      default:\n        // Render custom header\n        const headerElement = this._headerFactory(props);\n        this._header?.build(headerElement);\n        break;\n    }\n\n  }\n\n  private async load(props: { canUseCache: boolean }) {\n\n    // Load the inbox data\n    await CourierInboxDatastore.shared.load(props);\n\n    // Update all tab unread counts immediately after loading data\n    for (const feed of this._feeds) {\n      this.updateTabUnreadCounts(feed.tabs);\n    }\n\n    // Connect to socket for realtime updates (don't wait for this)\n    await CourierInboxDatastore.shared.listenForUpdates();\n  }\n\n  /**\n   * Forces a reload of the inbox data, bypassing the cache.\n   */\n  public async refresh() {\n\n    // Refresh the inbox if the user is already signed in\n    if (!Courier.shared.client?.options.userId) {\n      Courier.shared.client?.options.logger.error('No user signed in. Please call Courier.shared.signIn(...) to load the inbox.')\n      return;\n    }\n\n    // Load the inbox data\n    return this.load({\n      canUseCache: false\n    });\n\n  }\n\n  attributeChangedCallback(name: string, oldValue: string, newValue: string) {\n    if (oldValue === newValue) return;\n    switch (name) {\n      case 'height':\n        const height = newValue || this._defaultProps.height;\n        this.style.height = height;\n        break;\n      case 'message-click':\n        if (newValue) {\n          try {\n            this._onMessageClick = new Function('props', newValue) as (props: CourierInboxListItemFactoryProps) => void;\n          } catch (error) {\n            Courier.shared.client?.options.logger?.error('Failed to parse message-click handler:', error);\n          }\n        } else {\n          this._onMessageClick = undefined;\n        }\n        break;\n      case 'message-action-click':\n        if (newValue) {\n          try {\n            this._onMessageActionClick = new Function('props', newValue) as (props: CourierInboxListItemActionFactoryProps) => void;\n          } catch (error) {\n            Courier.shared.client?.options.logger?.error('Failed to parse message-action-click handler:', error);\n          }\n        } else {\n          this._onMessageActionClick = undefined;\n        }\n        break;\n      case 'message-long-press':\n        if (newValue) {\n          try {\n            this._onMessageLongPress = new Function('props', newValue) as (props: CourierInboxListItemFactoryProps) => void;\n          } catch (error) {\n            Courier.shared.client?.options.logger?.error('Failed to parse message-long-press handler:', error);\n          }\n        } else {\n          this._onMessageLongPress = undefined;\n        }\n        break;\n      case 'feeds':\n        if (newValue) {\n          try {\n            const feeds = JSON.parse(newValue);\n            if (this._datastoreListener) {\n              this.setFeeds(feeds);\n            } else {\n              this._feeds = feeds;\n            }\n          } catch (error) {\n            Courier.shared.client?.options.logger?.error('Failed to parse feeds attribute:', error);\n          }\n        }\n        break;\n      case 'light-theme':\n        if (newValue) {\n          this.setLightTheme(JSON.parse(newValue));\n        }\n        break;\n      case 'dark-theme':\n        if (newValue) {\n          this.setDarkTheme(JSON.parse(newValue));\n        }\n        break;\n      case 'mode':\n        this._themeManager.setMode(newValue as CourierComponentThemeMode);\n        break;\n    }\n  }\n\n}\n\nregisterElement(CourierInbox);\n","import { CourierColors, CourierFactoryElement, CourierIconButton, CourierIconSVGs, injectGlobalStyle, registerElement } from \"@trycourier/courier-ui-core\";\nimport { CourierInboxTheme } from \"../types/courier-inbox-theme\";\nimport { CourierInboxThemeManager, CourierInboxThemeSubscription } from \"../types/courier-inbox-theme-manager\";\n\nexport class CourierInboxMenuButton extends CourierFactoryElement {\n\n  static get id(): string {\n    return 'courier-inbox-menu-button';\n  }\n\n  // Theme\n  private _themeSubscription: CourierInboxThemeSubscription;\n\n  // Components\n  private _style?: HTMLStyleElement;\n  private _container?: HTMLDivElement;\n  private _triggerButton?: CourierIconButton;\n  private _unreadBadge?: HTMLDivElement;\n\n  get theme(): CourierInboxTheme {\n    return this._themeSubscription.manager.getTheme();\n  }\n\n  constructor(themeBus: CourierInboxThemeManager) {\n    super();\n    this._themeSubscription = themeBus.subscribe((_: CourierInboxTheme) => {\n      this.refreshTheme();\n    });\n  }\n\n  onComponentMounted() {\n    this.refreshTheme();\n  }\n\n  onComponentUnmounted() {\n    this._themeSubscription.unsubscribe();\n    this._style?.remove();\n  }\n\n  defaultElement(): HTMLElement {\n\n    // Create trigger button container\n    this._container = document.createElement('div');\n    this._container.className = 'menu-button-container';\n\n    // Create trigger button\n    this._triggerButton = new CourierIconButton(CourierIconSVGs.inbox);\n\n    // Create unread badge (red 4x4 circle)\n    this._unreadBadge = document.createElement('div');\n    this._unreadBadge.id = 'unread-badge';\n    this._unreadBadge.style.display = 'none'; // Hidden by default\n\n    this._container.appendChild(this._triggerButton);\n    this._container.appendChild(this._unreadBadge);\n\n    return this._container;\n  }\n\n  static getStyles(theme: CourierInboxTheme): string {\n    return `\n      ${CourierInboxMenuButton.id} {\n        display: inline-block;\n      }\n\n      ${CourierInboxMenuButton.id} .menu-button-container {\n        position: relative;\n        display: inline-block;\n      }\n        \n      ${CourierInboxMenuButton.id} .menu-button-container #unread-badge {\n        position: absolute;\n        top: 2px;\n        right: 2px;\n        pointer-events: none;\n        width: ${theme.popup?.button?.unreadDotIndicator?.width ?? '8px'};\n        height: ${theme.popup?.button?.unreadDotIndicator?.height ?? '8px'};\n        background: ${theme.popup?.button?.unreadDotIndicator?.backgroundColor ?? 'red'};\n        border-radius: ${theme.popup?.button?.unreadDotIndicator?.borderRadius ?? '50%'};\n        display: none;\n        z-index: 1;\n      }\n    `;\n  }\n\n  public onUnreadCountChange(unreadCount: number): void {\n    if (this._unreadBadge) {\n      this._unreadBadge.style.display = unreadCount > 0 ? 'block' : 'none';\n    }\n    this.refreshTheme();\n  }\n\n  private refreshTheme() {\n    this._style?.remove();\n    this._style = injectGlobalStyle(CourierInboxMenuButton.id, CourierInboxMenuButton.getStyles(this.theme));\n    this._triggerButton?.updateIconColor(this.theme?.popup?.button?.icon?.color ?? CourierColors.black[500]);\n    this._triggerButton?.updateIconSVG(this.theme?.popup?.button?.icon?.svg ?? CourierIconSVGs.inbox);\n    this._triggerButton?.updateBackgroundColor(this.theme?.popup?.button?.backgroundColor ?? 'transparent');\n    this._triggerButton?.updateHoverBackgroundColor(this.theme?.popup?.button?.hoverBackgroundColor ?? CourierColors.black[500_10]);\n    this._triggerButton?.updateActiveBackgroundColor(this.theme?.popup?.button?.activeBackgroundColor ?? CourierColors.black[500_20]);\n  }\n\n}\n\nregisterElement(CourierInboxMenuButton);\n","import { CourierInbox } from \"./courier-inbox\";\nimport { CourierInboxDatastoreEvents } from \"../datastore/datatore-events\";\nimport { CourierInboxDataStoreListener } from \"../datastore/datastore-listener\";\nimport { CourierInboxDatastore } from \"../datastore/inbox-datastore\";\nimport { CourierInboxHeaderFactoryProps, CourierInboxListItemActionFactoryProps, CourierInboxListItemFactoryProps, CourierInboxMenuButtonFactoryProps, CourierInboxPaginationItemFactoryProps, CourierInboxStateEmptyFactoryProps, CourierInboxStateErrorFactoryProps, CourierInboxStateLoadingFactoryProps } from \"../types/factories\";\nimport { CourierInboxFeed } from \"../types/inbox-data-set\";\nimport { CourierInboxMenuButton } from \"./courier-inbox-menu-button\";\nimport { defaultLightTheme } from \"../types/courier-inbox-theme\";\nimport { CourierInboxTheme } from \"../types/courier-inbox-theme\";\nimport { CourierInboxThemeManager } from \"../types/courier-inbox-theme-manager\";\nimport { CourierComponentThemeMode, injectGlobalStyle } from \"@trycourier/courier-ui-core\";\nimport { Courier } from \"@trycourier/courier-js\";\nimport { CourierBaseElement, registerElement } from \"@trycourier/courier-ui-core\";\nimport { CourierInboxHeaderAction, CourierInboxListItemAction } from \"../types/inbox-defaults\";\n\nexport type CourierInboxPopupAlignment = 'top-right' | 'top-left' | 'top-center' | 'bottom-right' | 'bottom-left' | 'bottom-center' | 'center-right' | 'center-left' | 'center-center';\n\nexport class CourierInboxPopupMenu extends CourierBaseElement implements CourierInboxDatastoreEvents {\n\n  static get id(): string {\n    return 'courier-inbox-popup-menu';\n  }\n\n  // State\n  private _width: string = '440px';\n  private _height: string = '440px';\n  private _popupAlignment: CourierInboxPopupAlignment = 'top-left';\n  private _top?: string = undefined;\n  private _right?: string = undefined;\n  private _bottom?: string = undefined;\n  private _left?: string = undefined;\n\n  // Theming\n  private _themeManager = new CourierInboxThemeManager(defaultLightTheme);\n\n  /** Returns the current theme object. */\n  get theme() {\n    return this._themeManager.getTheme();\n  }\n\n  /**\n   * Set the light theme for the popup menu.\n   * @param theme The light theme object to set.\n   */\n  public setLightTheme(theme: CourierInboxTheme) {\n    this._themeManager.setLightTheme(theme);\n  }\n\n  /**\n   * Set the dark theme for the popup menu.\n   * @param theme The dark theme object to set.\n   */\n  public setDarkTheme(theme: CourierInboxTheme) {\n    this._themeManager.setDarkTheme(theme);\n  }\n\n  /**\n   * Set the theme mode (light/dark/system).\n   * @param mode The theme mode to set.\n   */\n  public setMode(mode: CourierComponentThemeMode) {\n    this._themeManager.setMode(mode);\n  }\n\n  // Components\n  private _triggerButton?: CourierInboxMenuButton;\n  private _popup?: HTMLDivElement;\n  private _inbox?: CourierInbox;\n  private _style?: HTMLStyleElement;\n\n  // Listeners\n  private _datastoreListener?: CourierInboxDataStoreListener;\n\n  // State\n  private _totalUnreadCount: number = 0;\n\n  // Feeds (stored from attribute before inner inbox is created)\n  private _feeds?: CourierInboxFeed[];\n\n  // Factories\n  private _popupMenuButtonFactory?: (props: CourierInboxMenuButtonFactoryProps | undefined | null) => HTMLElement;\n\n  static get observedAttributes() {\n    return ['popup-alignment', 'feeds', 'message-click', 'message-action-click', 'message-long-press', 'popup-width', 'popup-height', 'top', 'right', 'bottom', 'left', 'light-theme', 'dark-theme', 'mode'];\n  }\n\n  constructor() {\n    super();\n\n    // Refresh the theme on change\n    this._themeManager.subscribe((_) => {\n      this.refreshTheme();\n    });\n\n  }\n\n  onComponentMounted() {\n    // Read initial theme attributes\n    this.readInitialThemeAttributes();\n\n    // Inject the styles to the head\n    this._style = injectGlobalStyle(CourierInboxPopupMenu.id, CourierInboxPopupMenu.getStyles(this.theme, this._width, this._height));\n\n    // Create trigger button\n    this._triggerButton = new CourierInboxMenuButton(this._themeManager);\n\n    // Create popup container\n    this._popup = document.createElement('div');\n    this._popup.className = 'popup';\n\n    // Create content container\n    this._inbox = new CourierInbox(this._themeManager);\n    this._inbox.setAttribute('height', '100%');\n    if (this._feeds) {\n      this._inbox.setAttribute('feeds', JSON.stringify(this._feeds));\n    }\n\n    this.refreshTheme();\n\n    this.appendChild(this._triggerButton);\n    this.appendChild(this._popup);\n    this._popup.appendChild(this._inbox);\n\n    // Add event listeners\n    this._triggerButton.addEventListener('click', this.togglePopup.bind(this));\n    document.addEventListener('click', this.handleOutsideClick.bind(this));\n\n    // Initialize popup position\n    this.updatePopupPosition();\n\n    // Attach the datastore listener\n    this._datastoreListener = new CourierInboxDataStoreListener(this);\n    CourierInboxDatastore.shared.addDataStoreListener(this._datastoreListener);\n\n    // Initial render so any pre-configured factories (like setMenuButton) are applied\n    this.render();\n  }\n\n  onComponentUnmounted() {\n    this._style?.remove();\n    this._datastoreListener?.remove();\n    this._themeManager.cleanup();\n  }\n\n  private readInitialThemeAttributes() {\n    const lightTheme = this.getAttribute('light-theme');\n    if (lightTheme) {\n      try {\n        this.setLightTheme(JSON.parse(lightTheme));\n      } catch (error) {\n        Courier.shared.client?.options.logger?.error('Failed to parse light-theme attribute:', error);\n      }\n    }\n\n    const darkTheme = this.getAttribute('dark-theme');\n    if (darkTheme) {\n      try {\n        this.setDarkTheme(JSON.parse(darkTheme));\n      } catch (error) {\n        Courier.shared.client?.options.logger?.error('Failed to parse dark-theme attribute:', error);\n      }\n    }\n\n    const mode = this.getAttribute('mode');\n    if (mode) {\n      this._themeManager.setMode(mode as CourierComponentThemeMode);\n    }\n  }\n\n  private refreshTheme() {\n    if (this._style) {\n      this._style.textContent = CourierInboxPopupMenu.getStyles(this.theme, this._width, this._height);\n    }\n  }\n\n  static getStyles(theme: CourierInboxTheme, width: string, height: string): string {\n    const transition = theme.popup?.window?.animation;\n    const initialTransform = transition?.initialTransform ?? 'translate3d(-10px, -10px, 0) scale(0.9)';\n    const visibleTransform = transition?.visibleTransform ?? 'translate3d(0, 0, 0) scale(1)';\n\n    return `\n      ${CourierInboxPopupMenu.id} {\n        display: inline-block;\n        position: relative;\n      }\n\n      ${CourierInboxPopupMenu.id} .popup {\n        display: none;\n        position: absolute;\n        background: ${theme.popup?.window?.backgroundColor ?? 'red'};\n        border-radius: ${theme.popup?.window?.borderRadius ?? '8px'};\n        border: ${theme.popup?.window?.border ?? `1px solid red`};\n        box-shadow: ${theme.popup?.window?.shadow ?? `0px 8px 16px -4px red`};\n        z-index: 1000;\n        width: ${width};\n        height: ${height};\n        overflow: hidden;\n        transform: ${initialTransform};\n        will-change: transform, opacity;\n        transition: ${transition?.transition ?? 'all 0.2s ease'};\n        opacity: 0;\n      }\n\n      ${CourierInboxPopupMenu.id} .popup.displayed {\n        display: block;\n      }\n\n      ${CourierInboxPopupMenu.id} .popup.visible {\n        opacity: 1;\n        transform: ${visibleTransform};\n      }\n\n      ${CourierInboxPopupMenu.id} courier-inbox {\n        height: 100%;\n      }\n    `;\n  }\n\n  attributeChangedCallback(name: string, _: string, newValue: string) {\n    switch (name) {\n      case 'popup-alignment':\n        if (this.isValidPosition(newValue)) {\n          this._popupAlignment = newValue as CourierInboxPopupAlignment;\n          this.updatePopupPosition();\n        }\n        break;\n      case 'popup-width':\n        this._width = newValue;\n        this.setSize(newValue, this._height);\n        break;\n      case 'popup-height':\n        this._height = newValue;\n        this.setSize(this._width, newValue);\n        break;\n      case 'top':\n        this._top = newValue;\n        this.updatePopupPosition();\n        break;\n      case 'right':\n        this._right = newValue;\n        this.updatePopupPosition();\n        break;\n      case 'bottom':\n        this._bottom = newValue;\n        this.updatePopupPosition();\n        break;\n      case 'left':\n        this._left = newValue;\n        this.updatePopupPosition();\n        break;\n      case 'feeds':\n        if (newValue) {\n          try {\n            const feeds = JSON.parse(newValue);\n            this._feeds = feeds;\n            if (this._inbox) {\n              this._inbox.setFeeds(feeds);\n            }\n          } catch (error) {\n            Courier.shared.client?.options.logger?.error('Failed to parse feeds attribute:', error);\n          }\n        }\n        break;\n      case 'light-theme':\n        if (newValue) {\n          this.setLightTheme(JSON.parse(newValue));\n        }\n        break;\n      case 'dark-theme':\n        if (newValue) {\n          this.setDarkTheme(JSON.parse(newValue));\n        }\n        break;\n      case 'mode':\n        this._themeManager.setMode(newValue as CourierComponentThemeMode);\n        break;\n    }\n  }\n\n  /**\n   * Called when the per-dataset unread count changes.\n   * Triggers a render to update the factory with latest feeds data\n   * (which includes per-tab unread counts).\n   */\n  public onUnreadCountChange(_: number): void {\n    this.render();\n  }\n\n  /**\n   * Called when the total unread count across all datasets changes.\n   * Updates the popup trigger button badge.\n   */\n  public onTotalUnreadCountChange(totalUnreadCount: number): void {\n    this._totalUnreadCount = totalUnreadCount;\n    this.render();\n  }\n\n  /**\n   * Set a handler for message click events.\n   * @param handler The function to call when a message is clicked.\n   */\n  public onMessageClick(handler?: (props: CourierInboxListItemFactoryProps) => void) {\n    this._inbox?.onMessageClick((props) => {\n      if (handler) {\n        handler(props);\n      }\n      this.closePopup();\n    });\n  }\n\n  /**\n   * Set a handler for message action click events.\n   * @param handler The function to call when a message action is clicked.\n   */\n  public onMessageActionClick(handler?: (props: CourierInboxListItemActionFactoryProps) => void) {\n    this._inbox?.onMessageActionClick((props) => {\n      if (handler) {\n        handler(props);\n      }\n      this.closePopup();\n    });\n  }\n\n  /**\n   * Set a handler for message long press events.\n   * @param handler The function to call when a message is long pressed.\n   */\n  public onMessageLongPress(handler?: (props: CourierInboxListItemFactoryProps) => void) {\n    this._inbox?.onMessageLongPress((props) => {\n      if (handler) {\n        handler(props);\n      }\n      this.closePopup();\n    });\n  }\n\n  private isValidPosition(value: string): value is CourierInboxPopupAlignment {\n    const validPositions: CourierInboxPopupAlignment[] = [\n      'top-right', 'top-left', 'top-center',\n      'bottom-right', 'bottom-left', 'bottom-center',\n      'center-right', 'center-left', 'center-center'\n    ];\n    return validPositions.includes(value as CourierInboxPopupAlignment);\n  }\n\n  private updatePopupPosition() {\n    if (!this._popup) return;\n\n    // Reset all positions\n    this._popup.style.top = '';\n    this._popup.style.bottom = '';\n    this._popup.style.left = '';\n    this._popup.style.right = '';\n    this._popup.style.margin = '';\n    this._popup.style.transform = '';\n\n    switch (this._popupAlignment) {\n      case 'top-right':\n        this._popup.style.top = this._top ?? '40px';\n        this._popup.style.right = this._right ?? '0px';\n        break;\n      case 'top-left':\n        this._popup.style.top = this._top ?? '40px';\n        this._popup.style.left = this._left ?? '0px';\n        break;\n      case 'top-center':\n        this._popup.style.top = this._top ?? '40px';\n        this._popup.style.left = '50%';\n        this._popup.style.transform = 'translateX(-50%)';\n        break;\n      case 'bottom-right':\n        this._popup.style.bottom = this._bottom ?? '40px';\n        this._popup.style.right = this._right ?? '0px';\n        break;\n      case 'bottom-left':\n        this._popup.style.bottom = this._bottom ?? '40px';\n        this._popup.style.left = this._left ?? '0px';\n        break;\n      case 'bottom-center':\n        this._popup.style.bottom = this._bottom ?? '40px';\n        this._popup.style.left = '50%';\n        this._popup.style.transform = 'translateX(-50%)';\n        break;\n      case 'center-right':\n        this._popup.style.top = '50%';\n        this._popup.style.right = this._right ?? '40px';\n        this._popup.style.transform = 'translateY(-50%)';\n        break;\n      case 'center-left':\n        this._popup.style.top = '50%';\n        this._popup.style.left = this._left ?? '40px';\n        this._popup.style.transform = 'translateY(-50%)';\n        break;\n      case 'center-center':\n        this._popup.style.top = '50%';\n        this._popup.style.left = '50%';\n        this._popup.style.transform = 'translate(-50%, -50%)';\n        break;\n    }\n  }\n\n  /**\n   * Toggle the popup menu open/closed.\n   * @param event The click event that triggered the toggle.\n   */\n  private togglePopup(event: Event) {\n    event.stopPropagation();\n    if (!this._popup) return;\n\n    const isVisible = this._popup.classList.contains('visible');\n    if (isVisible) {\n      this.hidePopup();\n    } else {\n      this.showPopup();\n    }\n  }\n\n  /**\n   * Show the popup menu with transition.\n   */\n  public showPopup() {\n    if (!this._popup) return;\n\n    // Remove visible class first to reset state\n    this._popup.classList.remove('visible');\n\n    // Add displayed class to set display: block (but keep opacity 0 and initial transform)\n    this._popup.classList.add('displayed');\n\n    // Trigger transition on next frame\n    requestAnimationFrame(() => {\n      requestAnimationFrame(() => {\n        if (this._popup) {\n          this._popup.classList.add('visible');\n        }\n      });\n    });\n  }\n\n  /**\n   * Hide the popup menu with transition.\n   */\n  public hidePopup() {\n    if (!this._popup) return;\n\n    // Remove visible class to trigger transition\n    this._popup.classList.remove('visible');\n\n    // If there is no transition, remove the displayed class immediately\n    const style = window.getComputedStyle(this._popup);\n    const durations = style.transitionDuration.split(',').map(d => parseFloat(d) || 0);\n    const hasTransition = durations.some(d => d > 0);\n    if (!hasTransition) {\n      this._popup.classList.remove('displayed');\n      return;\n    }\n\n    // Wait for transition to complete, then remove displayed class\n    const handleTransitionEnd = (e: TransitionEvent) => {\n      if (e.target !== this._popup) return;\n      if (e.propertyName !== 'opacity') return;\n      if (this._popup && !this._popup.classList.contains('visible')) {\n        this._popup.classList.remove('displayed');\n        this._popup.removeEventListener('transitionend', handleTransitionEnd);\n      }\n    };\n\n    this._popup.addEventListener('transitionend', handleTransitionEnd);\n  }\n\n  /**\n   * Close the popup menu.\n   */\n  public closePopup() {\n    this.hidePopup();\n  }\n\n  private handleOutsideClick = (event: MouseEvent) => {\n    if (!this._popup) return;\n\n    // Nodes the click may legally occur inside without closing the popup\n    const SAFE_SELECTORS = [\n      'courier-inbox-option-menu',\n    ];\n\n    // composedPath() gives us every node (even inside shadow DOMs)\n    const clickIsInsideAllowedArea = event\n      .composedPath()\n      .some(node => {\n        if (!(node instanceof HTMLElement)) return false;\n        if (node === this._popup || this._popup!.contains(node)) return true;\n        return SAFE_SELECTORS.some(sel => node.matches(sel));\n      });\n\n    if (clickIsInsideAllowedArea) return;\n\n    // Otherwise, it really was an outside click – hide the popup\n    this.hidePopup();\n  };\n\n  /**\n   * Set the content of the popup inbox.\n   * @param element The HTMLElement to set as the content.\n   */\n  public setContent(element: HTMLElement) {\n    if (!this._inbox) return;\n    this._inbox.innerHTML = '';\n    this._inbox.appendChild(element);\n  }\n\n  /**\n   * Set the size of the popup menu.\n   * @param width The width to set.\n   * @param height The height to set.\n   */\n  public setSize(width: string, height: string) {\n    this._width = width;\n    this._height = height;\n    if (!this._popup) return;\n    this._popup.style.width = width;\n    this._popup.style.height = height;\n  }\n\n  /**\n   * Set the popup alignment/position.\n   * @param position The alignment/position to set.\n   */\n  public setPosition(position: CourierInboxPopupAlignment) {\n    if (this.isValidPosition(position)) {\n      this._popupAlignment = position;\n      this.updatePopupPosition();\n    } else {\n      Courier.shared.client?.options.logger?.error(`Invalid position: ${position}`);\n    }\n  }\n\n  // Factory methods\n  /**\n   * Set a custom header factory for the inbox.\n   * @param factory The factory function for the header.\n   */\n  public setHeader(factory: (props: CourierInboxHeaderFactoryProps | undefined | null) => HTMLElement) {\n    this._inbox?.setHeader(factory);\n  }\n\n  /**\n   * Remove the custom header from the inbox.\n   */\n  public removeHeader() {\n    this._inbox?.removeHeader();\n  }\n\n  /**\n   * Set a custom loading state factory for the inbox.\n   * @param factory The factory function for the loading state.\n   */\n  public setLoadingState(factory: (props: CourierInboxStateLoadingFactoryProps | undefined | null) => HTMLElement) {\n    this._inbox?.setLoadingState(factory);\n  }\n\n  /**\n   * Set a custom empty state factory for the inbox.\n   * @param factory The factory function for the empty state.\n   */\n  public setEmptyState(factory: (props: CourierInboxStateEmptyFactoryProps | undefined | null) => HTMLElement) {\n    this._inbox?.setEmptyState(factory);\n  }\n\n  /**\n   * Set a custom error state factory for the inbox.\n   * @param factory The factory function for the error state.\n   */\n  public setErrorState(factory: (props: CourierInboxStateErrorFactoryProps | undefined | null) => HTMLElement) {\n    this._inbox?.setErrorState(factory);\n  }\n\n  /**\n   * Set a custom list item factory for the inbox.\n   * @param factory The factory function for the list item.\n   */\n  public setListItem(factory: (props: CourierInboxListItemFactoryProps | undefined | null) => HTMLElement) {\n    this._inbox?.setListItem(factory);\n  }\n\n  /**\n   * Set a custom pagination item factory for the inbox.\n   * @param factory The factory function for the pagination item.\n   */\n  public setPaginationItem(factory: (props: CourierInboxPaginationItemFactoryProps | undefined | null) => HTMLElement) {\n    this._inbox?.setPaginationItem(factory);\n  }\n\n  /**\n   * Set a custom menu button factory for the popup trigger.\n   * @param factory The factory function for the menu button.\n   */\n  public setMenuButton(factory: (props: CourierInboxMenuButtonFactoryProps | undefined | null) => HTMLElement) {\n    this._popupMenuButtonFactory = factory;\n    this.render();\n  }\n\n  /**\n   * Sets the active feed for the inbox.\n   * @param feedId The feed ID to display.\n   */\n  public selectFeed(feedId: string) {\n    this._inbox?.selectFeed(feedId);\n  }\n\n  /**\n   * Switches to a tab by updating components and loading data.\n   * @param tabId The tab ID to switch to.\n   */\n  public selectTab(tabId: string) {\n    this._inbox?.selectTab(tabId);\n  }\n\n  /**\n   * Set the feeds for this Inbox, replacing any existing feeds.\n   * @param feeds The list of feeds to set for the Inbox.\n   */\n  public setFeeds(feeds: CourierInboxFeed[]) {\n    this._inbox?.setFeeds(feeds);\n  }\n\n  /**\n   * Get the current set of feeds.\n   */\n  public getFeeds() {\n    return this._inbox?.getFeeds() ?? [];\n  }\n\n  /**\n   * Sets the enabled header actions for the inbox.\n   * @param actions - The header actions to enable (e.g., [{ id: 'readAll', iconSVG: '...', text: '...' }]).\n   */\n  public setActions(actions: CourierInboxHeaderAction[]) {\n    this._inbox?.setActions(actions);\n  }\n\n  /**\n   * Sets the enabled list item actions for the inbox.\n   * @param actions - The list item actions to enable (e.g., [{ id: 'read_unread', readIconSVG: '...', unreadIconSVG: '...' }]).\n   */\n  public setListItemActions(actions: CourierInboxListItemAction[]) {\n    this._inbox?.setListItemActions(actions);\n  }\n\n  /**\n   * Returns the current feed type.\n   */\n  get currentFeedId(): string {\n    return this._inbox?.currentFeedId ?? '';\n  }\n\n  /**\n   * Forces a reload of the inbox data, bypassing the cache.\n   */\n  public async refresh() {\n    return this._inbox?.refresh();\n  }\n\n  private render() {\n    const unreadCount = this._totalUnreadCount;\n    if (!this._triggerButton) return;\n\n    // Get feeds from the inbox component in the format expected by the factory\n    const feeds = this._inbox?.getHeaderFeeds() ?? [];\n\n    switch (this._popupMenuButtonFactory) {\n      case undefined:\n      case null:\n        this._triggerButton.build(undefined);\n        this._triggerButton.onUnreadCountChange(unreadCount);\n        break;\n      default:\n        const customButton = this._popupMenuButtonFactory({\n          totalUnreadCount: unreadCount,\n          feeds: feeds\n        });\n        this._triggerButton.build(customButton);\n        break;\n    }\n  }\n\n}\n\nregisterElement(CourierInboxPopupMenu);","import { InboxDataSet } from \"../types/inbox-data-set\";\nimport { InboxMessage } from \"@trycourier/courier-js\";\n\n/**\n * Event callbacks which may be fully or partially implemented to be called when\n * {@link CourierInboxDatastore} has updates.\n *\n * @public\n */\nexport class CourierInboxDatastoreEvents {\n  /**\n   * Called when the dataset changes.\n   * @public\n   * @param _dataset - The updated inbox dataset\n   */\n  public onDataSetChange?(_dataset: InboxDataSet): void { }\n\n  /**\n   * Called when a new page is added to the dataset.\n   * @public\n   * @param _dataset - The updated inbox dataset with the new page\n   */\n  public onPageAdded?(_dataset: InboxDataSet): void { }\n\n  /**\n   * Called when the unread count changes.\n   * @public\n   * @param _unreadCount - The new unread count\n   * @param _datasetId - The dataset ID that was updated\n   */\n  public onUnreadCountChange?(_unreadCount: number, _datasetId: string): void { }\n\n  /**\n   * Called when the total unread count across all datasets changes.\n   * @public\n   * @param _totalUnreadCount - The new total unread count\n   */\n  public onTotalUnreadCountChange?(_totalUnreadCount: number): void { }\n\n  /**\n   * Called when a new message is added.\n   * @public\n   * @param _message - The added InboxMessage\n   * @param _index - The index where the message was added\n   * @param _datasetId - The dataset ID that was updated\n   */\n  public onMessageAdd?(_message: InboxMessage, _index: number, _datasetId: string): void { }\n\n  /**\n   * Called when a message is removed.\n   * @public\n   * @param _message - The InboxMessage that was removed\n   * @param _index - The index from which the message was removed\n   * @param _datasetId - The dataset ID that was updated\n   */\n  public onMessageRemove?(_message: InboxMessage, _index: number, _datasetId: string): void { }\n\n  /**\n   * Called when a message is updated.\n   * @public\n   * @param _message - The updated InboxMessage\n   * @param _index - The index where the message was updated\n   * @param _datasetId - The dataset ID that was updated\n   */\n  public onMessageUpdate?(_message: InboxMessage, _index: number, _datasetId: string): void { }\n\n  /**\n   * Called when an error occurs in the data store.\n   * @public\n   * @param _error - The error object\n   */\n  public onError?(_error: Error): void { }\n}\n","export * from './components/courier-inbox';\nexport * from './components/courier-inbox-header';\nexport * from './components/courier-inbox-list-item';\nexport * from './components/courier-inbox-popup-menu';\nexport * from './utils/extensions';\nexport * from './types/factories';\nexport * from './types/courier-inbox-theme';\nexport * from './types/courier-inbox-theme-manager';\nexport * from './types/inbox-data-set';\nexport * from './types/inbox-defaults';\nexport * from './datastore/inbox-datastore';\nexport * from './datastore/datastore-listener';\nexport * from './datastore/datatore-events';\n\nimport { Courier } from \"@trycourier/courier-js\";\n\nCourier.shared.courierUserAgentName = \"courier-ui-inbox\";\nCourier.shared.courierUserAgentVersion = __PACKAGE_VERSION__;\n\n// Re-export Courier from courier-js for direct import\nexport { Courier };\n\n// Re-export types from courier-js\nexport type {\n  CourierProps,\n  CourierClientOptions,\n  CourierBrand,\n  CourierApiRegion,\n  CourierApiUrls,\n  CourierUserPreferences,\n  CourierUserPreferencesStatus,\n  CourierUserPreferencesChannel,\n  CourierUserPreferencesPaging,\n  CourierUserPreferencesTopic,\n  CourierUserPreferencesTopicResponse,\n  CourierDevice,\n  CourierToken,\n  CourierGetInboxMessageResponse,\n  CourierGetInboxMessagesResponse,\n  InboxMessage,\n  InboxAction,\n  InboxMessageEventEnvelope,\n} from '@trycourier/courier-js';\n\nexport {\n  DEFAULT_COURIER_API_URLS,\n  EU_COURIER_API_URLS,\n  getCourierApiUrls,\n  getCourierApiUrlsForRegion\n} from '@trycourier/courier-js';\n\n// Re-export types from courier-ui-core\nexport type {\n  CourierComponentThemeMode\n} from '@trycourier/courier-ui-core'\n"],"names":["_a","_b","_c","beforeQualifies","message"],"mappings":"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"}