{"version":3,"file":"acorex-components-conversation.mjs","sources":["../../../../packages/components/conversation/src/lib/services/api/api-types.ts","../../../../packages/components/conversation/src/lib/tokens/conversation-config.interface.ts","../../../../packages/components/conversation/src/lib/tokens/conversation-config.defaults.ts","../../../../packages/components/conversation/src/lib/tokens/conversation.tokens.ts","../../../../packages/components/conversation/src/lib/tokens/conversation-avatar.tokens.ts","../../../../packages/components/conversation/src/lib/tokens/registry-config.tokens.ts","../../../../packages/components/conversation/src/lib/tokens/conversation-features.ts","../../../../packages/components/conversation/src/lib/services/api/conversation-api-logger.service.ts","../../../../packages/components/conversation/src/lib/services/api/conversation-api.abstract.ts","../../../../packages/components/conversation/src/lib/services/api/message-api.abstract.ts","../../../../packages/components/conversation/src/lib/services/api/realtime-api.abstract.ts","../../../../packages/components/conversation/src/lib/services/api/user-api.abstract.ts","../../../../packages/components/conversation/src/lib/services/api/index.ts","../../../../packages/components/conversation/src/lib/services/composer-generation-state.service.ts","../../../../packages/components/conversation/src/lib/models/message-file-type-catalog.ts","../../../../packages/components/conversation/src/lib/utils/conversation-display.utils.ts","../../../../packages/components/conversation/src/lib/utils/message-utils.service.ts","../../../../packages/components/conversation/src/lib/utils/avatar-context.utils.ts","../../../../packages/components/conversation/src/lib/utils/message-payload-normalize.ts","../../../../packages/components/conversation/src/lib/utils/validation.utils.ts","../../../../packages/components/conversation/src/lib/services/conversation-media-send.loader.ts","../../../../packages/components/conversation/src/lib/models/room-preferences.model.ts","../../../../packages/components/conversation/src/lib/utils/room-preferences.utils.ts","../../../../packages/components/conversation/src/lib/services/conversation-state.ts","../../../../packages/components/conversation/src/lib/services/error-handler.service.ts","../../../../packages/components/conversation/src/lib/plugins/composer/composer-actions/conversation-composer-file-types.provider.ts","../../../../packages/components/conversation/src/lib/plugins/composer/composer-actions/composer-file-types.plugin.ts","../../../../packages/components/conversation/src/lib/plugins/composer/components/composer-tabs/composer-tab.builtin.ts","../../../../packages/components/conversation/src/lib/registries/composer-tab.registry.ts","../../../../packages/components/conversation/src/lib/registries/composer-action.registry.ts","../../../../packages/components/conversation/src/lib/registries/base-registry.abstract.ts","../../../../packages/components/conversation/src/lib/registries/conversation-item-action.registry.ts","../../../../packages/components/conversation/src/lib/registries/conversation-tab.registry.ts","../../../../packages/components/conversation/src/lib/registries/info-bar-action.registry.ts","../../../../packages/components/conversation/src/lib/registries/message-action.registry.ts","../../../../packages/components/conversation/src/lib/registries/message-renderer.registry.ts","../../../../packages/components/conversation/src/lib/services/registry.service.ts","../../../../packages/components/conversation/src/lib/services/conversation.service.ts","../../../../packages/components/conversation/src/lib/components/composer/composer-popup.component.ts","../../../../packages/components/conversation/src/lib/components/composer/composer-popup.component.html","../../../../packages/components/conversation/src/lib/plugins/composer/composer-upload.config.ts","../../../../packages/components/conversation/src/lib/utils/message-list-background.patterns.ts","../../../../packages/components/conversation/src/lib/utils/message-list-background.presets.ts","../../../../packages/components/conversation/src/lib/utils/message-list-background.utils.ts","../../../../packages/components/conversation/src/lib/utils/participant-profile.utils.ts","../../../../packages/components/conversation/src/lib/utils/date-utils.service.ts","../../../../packages/components/conversation/src/lib/utils/file-type-message.resolve.ts","../../../../packages/components/conversation/src/lib/plugins/composer/components/shared/persisted-media-url.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/components/audio-renderer/audio.payload.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/components/file-renderer/file.payload.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/components/image-renderer/image.payload.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/components/video-renderer/video.payload.ts","../../../../packages/components/conversation/src/lib/utils/conversation-info-panel.utils.ts","../../../../packages/components/conversation/src/lib/components/message-list/message-list.service.ts","../../../../packages/components/conversation/src/lib/components/shared/registry-component-outlet.component.ts","../../../../packages/components/conversation/src/lib/components/shared/registry-component-outlet.component.html","../../../../packages/components/conversation/src/lib/components/composer/open-composer-action-overlay.ts","../../../../packages/components/conversation/src/lib/components/composer/composer.service.ts","../../../../packages/components/conversation/src/lib/components/composer/composer.component.ts","../../../../packages/components/conversation/src/lib/components/composer/composer.component.html","../../../../packages/components/conversation/src/lib/components/container/conversation-container.component.ts","../../../../packages/components/conversation/src/lib/components/container/conversation-container.component.html","../../../../packages/components/conversation/src/lib/components/container/conversation-container.directive.ts","../../../../packages/components/conversation/src/lib/utils/component-inputs.utils.ts","../../../../packages/components/conversation/src/lib/components/shared/conversation-avatar.component.ts","../../../../packages/components/conversation/src/lib/components/shared/conversation-avatar.component.html","../../../../packages/components/conversation/src/lib/components/info-bar/info-bar.service.ts","../../../../packages/components/conversation/src/lib/components/info-bar/info-bar.component.ts","../../../../packages/components/conversation/src/lib/components/info-bar/info-bar.component.html","../../../../packages/components/conversation/src/lib/components/message-list/forward-message-dialog.component.ts","../../../../packages/components/conversation/src/lib/components/message-list/forward-message-dialog.component.html","../../../../packages/components/conversation/src/lib/directives/infinite-scroll.directive.ts","../../../../packages/components/conversation/src/lib/components/message-list/message-list-empty-default.component.ts","../../../../packages/components/conversation/src/lib/components/message-list/message-list-empty-default.component.html","../../../../packages/components/conversation/src/lib/components/message-list/message-list-no-active-default.component.ts","../../../../packages/components/conversation/src/lib/components/message-list/message-list-no-active-default.component.html","../../../../packages/components/conversation/src/lib/utils/svgs/message-delivery-status-icons.ts","../../../../packages/components/conversation/src/lib/components/message-list/message-delivery-status-icon.component.ts","../../../../packages/components/conversation/src/lib/components/message-list/reaction-picker-placement.ts","../../../../packages/components/conversation/src/lib/components/message-list/message-list.component.ts","../../../../packages/components/conversation/src/lib/components/message-list/message-list.component.html","../../../../packages/components/conversation/src/lib/components/shared/avatar-picker.component.ts","../../../../packages/components/conversation/src/lib/components/shared/avatar-picker.component.html","../../../../packages/components/conversation/src/lib/components/sidebar/conversation-item.component.ts","../../../../packages/components/conversation/src/lib/components/sidebar/conversation-item.component.html","../../../../packages/components/conversation/src/lib/components/sidebar/sidebar.service.ts","../../../../packages/components/conversation/src/lib/components/sidebar/sidebar.component.ts","../../../../packages/components/conversation/src/lib/components/sidebar/sidebar.component.html","../../../../packages/components/conversation/src/lib/components/sidebar/new-conversation-dialog.component.ts","../../../../packages/components/conversation/src/lib/components/sidebar/new-conversation-dialog.component.html","../../../../packages/components/conversation/src/lib/models/conversation-upload.types.ts","../../../../packages/components/conversation/src/lib/models/conversation.model.ts","../../../../packages/components/conversation/src/lib/models/message-payloads.model.ts","../../../../packages/components/conversation/src/lib/models/message.model.ts","../../../../packages/components/conversation/src/lib/models/participant.model.ts","../../../../packages/components/conversation/src/lib/models/user-presence.model.ts","../../../../packages/components/conversation/src/lib/plugins/composer/components/shared/media-formatters.ts","../../../../packages/components/conversation/src/lib/plugins/composer/components/audio-picker/conversation-audio.file-type.ts","../../../../packages/components/conversation/src/lib/plugins/composer/components/audio-picker/audio-composer.payload.ts","../../../../packages/components/conversation/src/lib/plugins/composer/components/picker-header/picker-header.component.ts","../../../../packages/components/conversation/src/lib/plugins/composer/components/picker-header/picker-header.component.html","../../../../packages/components/conversation/src/lib/plugins/composer/components/shared/picker-caption.component.ts","../../../../packages/components/conversation/src/lib/plugins/composer/components/shared/picker-caption.component.html","../../../../packages/components/conversation/src/lib/plugins/composer/components/shared/picker-empty.component.ts","../../../../packages/components/conversation/src/lib/plugins/composer/components/shared/picker-empty.component.html","../../../../packages/components/conversation/src/lib/plugins/composer/components/shared/picker-upload.ts","../../../../packages/components/conversation/src/lib/plugins/composer/components/shared/picker-shell.component.ts","../../../../packages/components/conversation/src/lib/plugins/composer/components/shared/picker-shell.component.html","../../../../packages/components/conversation/src/lib/plugins/composer/components/shared/picker-auto-run.ts","../../../../packages/components/conversation/src/lib/plugins/composer/components/audio-picker/audio-picker.component.ts","../../../../packages/components/conversation/src/lib/plugins/composer/components/audio-picker/audio-picker.component.html","../../../../packages/components/conversation/src/lib/plugins/composer/components/composer-tabs/index.ts","../../../../packages/components/conversation/src/lib/plugins/composer/components/emoji-tab/emoji-tab.component.ts","../../../../packages/components/conversation/src/lib/plugins/composer/components/emoji-tab/emoji-tab.component.html","../../../../packages/components/conversation/src/lib/plugins/composer/components/file-picker/conversation-file.file-type.ts","../../../../packages/components/conversation/src/lib/plugins/composer/components/file-picker/file-composer.payload.ts","../../../../packages/components/conversation/src/lib/plugins/composer/components/shared/picker-file-badge.utils.ts","../../../../packages/components/conversation/src/lib/plugins/composer/components/file-picker/file-picker.component.ts","../../../../packages/components/conversation/src/lib/plugins/composer/components/file-picker/file-picker.component.html","../../../../packages/components/conversation/src/lib/plugins/composer/components/image-picker/conversation-image.file-type.ts","../../../../packages/components/conversation/src/lib/plugins/composer/components/image-picker/image-picker.component.ts","../../../../packages/components/conversation/src/lib/plugins/composer/components/image-picker/image-picker.component.html","../../../../packages/components/conversation/src/lib/plugins/composer/components/picker-footer/picker-footer.component.ts","../../../../packages/components/conversation/src/lib/plugins/composer/components/picker-footer/picker-footer.component.html","../../../../packages/components/conversation/src/lib/plugins/composer/components/location-picker/location-picker.component.ts","../../../../packages/components/conversation/src/lib/plugins/composer/components/location-picker/location-picker.component.html","../../../../packages/components/conversation/src/lib/plugins/composer/components/shared/picker-drag-handlers.ts","../../../../packages/components/conversation/src/lib/plugins/composer/components/shared/picker-toolbar.component.ts","../../../../packages/components/conversation/src/lib/plugins/composer/components/shared/picker-toolbar.component.html","../../../../packages/components/conversation/src/lib/plugins/composer/components/sticker-tab/sticker-tab.component.ts","../../../../packages/components/conversation/src/lib/plugins/composer/components/sticker-tab/sticker-tab.component.html","../../../../packages/components/conversation/src/lib/plugins/composer/components/video-picker/conversation-video.file-type.ts","../../../../packages/components/conversation/src/lib/plugins/composer/components/video-picker/video-composer.payload.ts","../../../../packages/components/conversation/src/lib/plugins/composer/components/video-picker/video-picker.component.ts","../../../../packages/components/conversation/src/lib/plugins/composer/components/video-picker/video-picker.component.html","../../../../packages/components/conversation/src/lib/plugins/composer/components/voice-recorder/conversation-voice.file-type.ts","../../../../packages/components/conversation/src/lib/plugins/composer/components/voice-recorder/voice-composer.payload.ts","../../../../packages/components/conversation/src/lib/plugins/composer/components/voice-recorder/voice-recorder.component.ts","../../../../packages/components/conversation/src/lib/plugins/composer/components/voice-recorder/voice-recorder.component.html","../../../../packages/components/conversation/src/lib/plugins/composer/composer-actions/emoji-action.plugin.ts","../../../../packages/components/conversation/src/lib/plugins/composer/composer-actions/image-action.plugin.ts","../../../../packages/components/conversation/src/lib/plugins/composer/composer-actions/video-action.plugin.ts","../../../../packages/components/conversation/src/lib/plugins/composer/composer-actions/file-action.plugin.ts","../../../../packages/components/conversation/src/lib/plugins/composer/composer-actions/voice-action.plugin.ts","../../../../packages/components/conversation/src/lib/plugins/composer/composer-actions/audio-action.plugin.ts","../../../../packages/components/conversation/src/lib/plugins/composer/composer-actions/location-action.plugin.ts","../../../../packages/components/conversation/src/lib/plugins/composer/composer-actions/send-message-media.ts","../../../../packages/components/conversation/src/lib/plugins/info-bar/components/search.component.ts","../../../../packages/components/conversation/src/lib/plugins/info-bar/components/search.component.html","../../../../packages/components/conversation/src/lib/plugins/info-bar/info-bar-actions/default-actions.plugin.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/components/shared/attachment-uploader-reference.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/components/shared/format-media.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/components/shared/media-url-resolve.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/components/shared/audio-attachment.component.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/components/shared/audio-attachment.component.html","../../../../packages/components/conversation/src/lib/plugins/message-list/components/shared/file-attachment.component.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/components/shared/file-attachment.component.html","../../../../packages/components/conversation/src/lib/plugins/message-list/components/shared/image-attachment.component.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/components/shared/image-attachment.component.html","../../../../packages/components/conversation/src/lib/plugins/message-list/components/shared/media-playback-info-bar-banner.component.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/components/shared/media-playback-info-bar-banner.component.html","../../../../packages/components/conversation/src/lib/plugins/message-list/components/shared/message-renderer-state.helpers.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/components/shared/media-renderer-content-state.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/components/shared/message-renderer-copy-host.component.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/components/shared/message-renderer-state.component.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/components/shared/message-renderer-state.component.html","../../../../packages/components/conversation/src/lib/plugins/message-list/components/shared/playback-banner-sync.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/components/shared/video-attachment.component.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/components/shared/video-attachment.component.html","../../../../packages/components/conversation/src/lib/plugins/message-list/components/audio-renderer/audio-renderer.component.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/components/audio-renderer/audio-renderer.component.html","../../../../packages/components/conversation/src/lib/plugins/message-list/components/fallback-renderer/fallback-renderer.component.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/components/fallback-renderer/fallback-renderer.component.html","../../../../packages/components/conversation/src/lib/plugins/message-list/components/file-renderer/file-renderer.component.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/components/file-renderer/file-renderer.component.html","../../../../packages/components/conversation/src/lib/plugins/message-list/components/image-renderer/image-renderer.component.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/components/image-renderer/image-renderer.component.html","../../../../packages/components/conversation/src/lib/plugins/message-list/components/location-renderer/location-renderer.component.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/components/location-renderer/location-renderer.component.html","../../../../packages/components/conversation/src/lib/plugins/message-list/components/sticker-renderer/sticker-renderer.component.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/components/sticker-renderer/sticker-renderer.component.html","../../../../packages/components/conversation/src/lib/plugins/message-list/components/system-renderer/system-renderer.component.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/components/system-renderer/system-renderer.component.html","../../../../packages/components/conversation/src/lib/utils/sanitizer.service.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/components/text-renderer/text-renderer.component.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/components/text-renderer/text-renderer.component.html","../../../../packages/components/conversation/src/lib/plugins/message-list/components/video-renderer/video-renderer.component.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/components/video-renderer/video-renderer.component.html","../../../../packages/components/conversation/src/lib/plugins/message-list/components/voice-renderer/voice-renderer.component.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/components/voice-renderer/voice-renderer.component.html","../../../../packages/components/conversation/src/lib/plugins/message-list/message-actions/default-actions.plugin.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/message-renderers/text-renderer.plugin.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/message-renderers/image-renderer.plugin.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/message-renderers/video-renderer.plugin.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/message-renderers/audio-renderer.plugin.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/message-renderers/voice-renderer.plugin.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/message-renderers/file-renderer.plugin.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/message-renderers/location-renderer.plugin.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/message-renderers/sticker-renderer.plugin.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/message-renderers/system-renderer.plugin.ts","../../../../packages/components/conversation/src/lib/plugins/message-list/message-renderers/fallback-renderer.plugin.ts","../../../../packages/components/conversation/src/lib/plugins/sidebar/conversation-item-actions/default-actions.plugin.ts","../../../../packages/components/conversation/src/lib/plugins/sidebar/conversation-tabs/default-tabs.plugin.ts","../../../../packages/components/conversation/src/lib/plugins/sidebar/conversation-tabs/index.ts","../../../../packages/components/conversation/src/lib/components/shared/conversation-default-conversation-avatar.component.ts","../../../../packages/components/conversation/src/lib/components/shared/conversation-default-conversation-avatar.component.html","../../../../packages/components/conversation/src/lib/conversation.module.ts","../../../../packages/components/conversation/src/lib/constants/error-messages.constants.ts","../../../../packages/components/conversation/src/lib/constants/index.ts","../../../../packages/components/conversation/src/lib/index.ts","../../../../packages/components/conversation/src/acorex-components-conversation.ts"],"sourcesContent":["/**\r\r\n * Shared API Types\r\r\n * Common types used across all API services\r\r\n */\r\r\n\r\r\n/**\r\r\n * Pagination parameters\r\r\n */\r\r\nexport interface AXConversationPagination {\r\r\n  /** Page number (0-based) */\r\r\n  page: number;\r\r\n\r\r\n  /** Items per page */\r\r\n  pageSize: number;\r\r\n\r\r\n  /** Cursor for cursor-based pagination (optional) */\r\r\n  cursor?: string;\r\r\n\r\r\n  /** Sort field */\r\r\n  sortBy?: string;\r\r\n\r\r\n  /** Sort direction */\r\r\n  sortDirection?: 'asc' | 'desc';\r\r\n}\r\r\n\r\r\n/**\r\r\n * Paginated response\r\r\n */\r\r\nexport interface AXConversationPaginatedResult<T> {\r\r\n  /** Result items */\r\r\n  items: T[];\r\r\n\r\r\n  /** Total count (if available) */\r\r\n  total?: number;\r\r\n\r\r\n  /** Next page cursor (for cursor-based pagination) */\r\r\n  nextCursor?: string;\r\r\n\r\r\n  /** Previous page cursor */\r\r\n  prevCursor?: string;\r\r\n\r\r\n  /** Whether there are more pages */\r\r\n  hasMore: boolean;\r\r\n\r\r\n  /** Current page number */\r\r\n  page?: number;\r\r\n\r\r\n  /** Total pages */\r\r\n  totalPages?: number;\r\r\n}\r\r\n\r\r\n/**\r\r\n * Pagination cursor state for a single list (conversations or messages).\r\r\n */\r\r\nexport interface AXConversationPaginationState {\r\r\n  page: number;\r\r\n  hasMore: boolean;\r\r\n  nextCursor?: string;\r\r\n}\r\r\n\r\r\n/**\r\r\n * Connection status\r\r\n */\r\r\nexport type AXConversationConnectionStatus = 'disconnected' | 'connecting' | 'connected' | 'reconnecting' | 'error';\r\r\n\r\r\n/**\r\r\n * API Error with details\r\r\n */\r\r\nexport interface AXConversationApiError {\r\r\n  /** Error code */\r\r\n  code: string;\r\r\n\r\r\n  /** Error message */\r\r\n  message: string;\r\r\n\r\r\n  /** HTTP status code */\r\r\n  statusCode?: number;\r\r\n\r\r\n  /** Additional details */\r\r\n  details?: unknown;\r\r\n\r\r\n  /** Timestamp */\r\r\n  timestamp?: Date;\r\r\n}\r\r\n\r\r\n/** Re-export presence status from domain models. */\r\r\nexport type { AXConversationPresenceStatus } from '../../models/user-presence.model';\r\r\n","/**\n * Conversation Configuration Interface\n * Centralized configuration values to avoid magic numbers\n */\n\n/**\n * Sidebar conversation tabs layout.\n * - `vertical`: horizontal tab strip above the conversation list.\n * - `horizontal`: vertical tab strip at inline-start beside the list (`ax-tabs` location `start`).\n */\nexport type AXConversationSidebarTabsOrientation = 'vertical' | 'horizontal';\n\n/**\n * Main configuration interface for the conversation component\n */\nexport interface AXConversationConfig {\n  // Pagination\n  /** Number of messages to load per page */\n  messagePageSize?: number;\n\n  /** Number of conversations to load per page */\n  conversationPageSize?: number;\n\n  // Scroll Configuration\n  /** Scroll threshold for detecting scroll events */\n  scrollThreshold?: number;\n\n  /** Infinite scroll threshold */\n  infiniteScrollThreshold?: number;\n\n  // Timeout Durations (milliseconds)\n  /** Typing indicator timeout in milliseconds */\n  typingIndicatorTimeout?: number;\n\n  /** Typing indicator emit throttle in milliseconds while composing (default: 3000) */\n  typingIndicatorThrottle?: number;\n\n  /** How long to show received typing indicators in the UI (default: 4000) */\n  typingDisplayDuration?: number;\n\n  /** Message highlight duration in milliseconds */\n  messageHighlightDuration?: number;\n\n  /** Search debounce delay in milliseconds */\n  debounceSearch?: number;\n\n  // Message Storage Limits\n  /** Maximum messages per conversation */\n  maxMessagesPerConversation?: number;\n\n  /** Maximum total messages in store */\n  maxTotalMessages?: number;\n\n  /** Maximum cached conversations */\n  maxCachedConversations?: number;\n\n  // UI Dimensions\n  /** Minimum sidebar width in pixels */\n  minSidebarWidth?: number;\n\n  /** Maximum sidebar width in pixels */\n  maxSidebarWidth?: number;\n\n  /** Default sidebar width in pixels */\n  defaultSidebarWidth?: number;\n\n  /**\n   * Sidebar conversation tabs layout.\n   * `vertical` places a horizontal tab strip above the list; `horizontal` places a vertical tab strip at inline-start beside the list.\n   */\n  sidebarTabsOrientation?: AXConversationSidebarTabsOrientation;\n\n  // Message Validation\n  /** Maximum message length in characters */\n  maxMessageLength?: number;\n\n  /** Minimum message length in characters */\n  minMessageLength?: number;\n\n  /** Max attachments per message when a composer action omits `maxFiles`. */\n  maxFilesPerMessage?: number;\n\n  // Intersection Observer\n  /** Threshold for marking messages as read (0.0 to 1.0, default: 0.3) */\n  messageReadThreshold?: number;\n\n  /** Debounce window (ms) before flushing batched read-receipt API calls (default: 3000) */\n  messageReadDebounce?: number;\n\n  /**\n   * When true, marks the whole conversation as read once when it is selected (single API call).\n   * Per-message intersection observer still handles new messages received while the chat is open.\n   */\n  markConversationReadOnSelect?: boolean;\n\n  // Message list\n  /**\n   * CSS `background` for the message list (`ax-conversation-message-list` area, all states: loading, empty, messages).\n   * Use full shorthand, or a bare `https://...` / `/path/to.png` (wrapped as `url(...)` with `center/cover`).\n   * Pass a string for the same value in both themes, or `{ light, dark }` for theme-specific backgrounds.\n   * Empty string = Telegram-inspired theme-aware library default (`{ light, dark }`). `transparent` or `none` = flat background.\n   */\n  messageListBackground?: import('../models').AXConversationMessageListBackground;\n\n  /** Optional feature flags to reduce bundle size per app. */\n  features?: import('./conversation-features').AXConversationFeatures;\n\n  /** Log API calls made by AXConversationService to the console (default: false). */\n  debugApiLogging?: boolean;\n}\n","/**\n * Default Configuration Values\n * Centralized defaults to avoid magic numbers throughout the codebase\n */\n\nimport type { AXConversationConfig } from './conversation-config.interface';\n\n/**\n * Default conversation configuration\n * All values are explicitly defined here for easy maintenance and documentation\n */\nexport const AX_DEFAULT_CONVERSATION_CONFIG: Required<AXConversationConfig> = {\n  // Pagination\n  messagePageSize: 30,\n  conversationPageSize: 20,\n\n  // Scroll Configuration\n  scrollThreshold: 100,\n  infiniteScrollThreshold: 200,\n\n  // Timeout Durations (milliseconds)\n  typingIndicatorTimeout: 3000,\n  typingIndicatorThrottle: 3000,\n  typingDisplayDuration: 4000,\n  messageHighlightDuration: 2000,\n  debounceSearch: 300,\n\n  // Message Storage Limits\n  maxMessagesPerConversation: 1000,\n  maxTotalMessages: 10000,\n  maxCachedConversations: 50,\n\n  // UI Dimensions (pixels)\n  minSidebarWidth: 250,\n  maxSidebarWidth: 500,\n  defaultSidebarWidth: 320,\n  sidebarTabsOrientation: 'vertical',\n\n  // Message Validation\n  maxMessageLength: 10000,\n  minMessageLength: 1,\n\n  maxFilesPerMessage: 3,\n\n  // Intersection Observer\n  messageReadThreshold: 0.3,\n  messageReadDebounce: 3000,\n  markConversationReadOnSelect: true,\n\n  // Message list\n  messageListBackground: '',\n\n  features: {\n    composerTabs: [],\n  },\n\n  debugApiLogging: false,\n};\n\n/**\n * Helper function to merge user config with defaults\n * Properly handles array merging to avoid reference issues\n * @param userConfig - User-provided configuration\n * @returns Merged configuration with all required fields\n */\nexport function mergeWithDefaults(userConfig?: Partial<AXConversationConfig>): Required<AXConversationConfig> {\n  if (!userConfig) {\n    return { ...AX_DEFAULT_CONVERSATION_CONFIG };\n  }\n\n  return {\n    ...AX_DEFAULT_CONVERSATION_CONFIG,\n    ...userConfig,\n    features: {\n      ...AX_DEFAULT_CONVERSATION_CONFIG.features,\n      ...userConfig.features,\n      composerTabs: userConfig.features?.composerTabs ?? AX_DEFAULT_CONVERSATION_CONFIG.features.composerTabs,\n    },\n  };\n}\n","/**\n * Dependency Injection Tokens\n * InjectionTokens for configuration and dependencies\n */\n\nimport { InjectionToken } from '@angular/core';\nimport type { AXConversationErrorHandlerConfig } from '../services/error-handler.service';\nimport type { AXConversationConfig } from './conversation-config.interface';\nimport { mergeWithDefaults } from './conversation-config.defaults';\n\n/**\n * Configuration token for conversation component\n * Uses centralized defaults from AX_DEFAULT_CONVERSATION_CONFIG\n */\nexport const AX_CONVERSATION_CONFIG = new InjectionToken<Required<AXConversationConfig>>('AX_CONVERSATION_CONFIG', {\n  providedIn: 'root',\n  factory: () => mergeWithDefaults(),\n});\n\n/**\n * Token for configuring AXConversationErrorHandlerService\n */\nexport const AX_CONVERSATION_ERROR_HANDLER_CONFIG = new InjectionToken<Partial<AXConversationErrorHandlerConfig>>('AX_CONVERSATION_ERROR_HANDLER_CONFIG', {\n  providedIn: 'root',\n  factory: () => ({}),\n});\n","/**\n * Pluggable avatar components for the conversation UI.\n * Register via `provideConversation({ avatarComponents: { user, conversation } })`.\n * When only `user` is registered, a built-in conversation avatar host is wired automatically.\n */\n\nimport { InjectionToken, type InputSignal, type Type } from '@angular/core';\n\n/** Custom user avatar (e.g. platform `axp-user-avatar`). */\nexport interface AXConversationUserAvatarComponent {\n  readonly userId: InputSignal<string>;\n  readonly size: InputSignal<number>;\n  /** Optional resolved display name (e.g. bot/assist peer title). */\n  readonly displayName?: InputSignal<string | undefined>;\n  /** Optional resolved avatar URL when `userId` is not a platform user row. */\n  readonly displayAvatar?: InputSignal<string | undefined>;\n  /** Optional icon class when no avatar image is available. */\n  readonly displayIcon?: InputSignal<string | undefined>;\n}\n\n/** Optional custom group/channel conversation avatar. */\nexport interface AXConversationConversationAvatarComponent {\n  readonly conversationId: InputSignal<string>;\n  readonly size: InputSignal<number>;\n  /** Optional resolved display name for the conversation. */\n  readonly displayName?: InputSignal<string | undefined>;\n  /** Optional resolved avatar URL when no platform conversation row exists. */\n  readonly displayAvatar?: InputSignal<string | undefined>;\n  /** Optional icon class when no avatar image is available. */\n  readonly displayIcon?: InputSignal<string | undefined>;\n}\n\nexport type AXConversationAvatarKind = 'user' | 'conversation' | 'auto';\n\nexport const AX_CONVERSATION_USER_AVATAR_COMPONENT = new InjectionToken<\n  Type<AXConversationUserAvatarComponent>\n>('AX_CONVERSATION_USER_AVATAR_COMPONENT');\n\nexport const AX_CONVERSATION_CONVERSATION_AVATAR_COMPONENT = new InjectionToken<\n  Type<AXConversationConversationAvatarComponent>\n>('AX_CONVERSATION_CONVERSATION_AVATAR_COMPONENT');\n\nexport interface AXConversationAvatarComponents {\n  user?: Type<AXConversationUserAvatarComponent>;\n  conversation?: Type<AXConversationConversationAvatarComponent>;\n}\n","/**\n * Registry Configuration Tokens\n * Injection tokens for configuring default registry values\n */\n\nimport { InjectionToken } from '@angular/core';\nimport type { AXConversationComposerAction } from '../registries/composer-action.registry';\nimport type { AXConversationComposerTab } from '../registries/composer-tab.registry';\nimport type { AXConversationItemAction } from '../registries/conversation-item-action.registry';\nimport type { AXConversationTab } from '../registries/conversation-tab.registry';\nimport type { AXConversationInfoBarAction } from '../registries/info-bar-action.registry';\nimport type { AXConversationMessageAction } from '../registries/message-action.registry';\nimport type { AXConversationMessageRenderer } from '../registries/message-renderer.registry';\n\n/**\n * Additional message renderers configuration\n * Provide this token to add custom message renderers in addition to built-in ones\n * Note: Built-in renderers (text, system, fallback) are registered by default; other types are provided via plugins/constants.\n */\nexport const AX_CONVERSATION_DEFAULT_MESSAGE_RENDERERS = new InjectionToken<AXConversationMessageRenderer[]>('AX_CONVERSATION_DEFAULT_MESSAGE_RENDERERS', {\n  providedIn: 'root',\n  factory: () => [],\n});\n\n/**\n * Default message actions configuration\n * Provide this token to override default message actions\n */\nexport const AX_CONVERSATION_DEFAULT_MESSAGE_ACTIONS = new InjectionToken<AXConversationMessageAction[]>('AX_CONVERSATION_DEFAULT_MESSAGE_ACTIONS', {\n  providedIn: 'root',\n  factory: () => [],\n});\n\n/**\n * Default composer tabs configuration\n * Provide this token to override default composer tabs (emoji, stickers, etc.)\n */\nexport const AX_CONVERSATION_DEFAULT_COMPOSER_TABS = new InjectionToken<AXConversationComposerTab[]>('AX_CONVERSATION_DEFAULT_COMPOSER_TABS', {\n  providedIn: 'root',\n  factory: () => [],\n});\n\n/**\n * Default composer actions configuration\n * Provide this token to override default composer actions (attach, voice, etc.)\n */\nexport const AX_CONVERSATION_DEFAULT_COMPOSER_ACTIONS = new InjectionToken<AXConversationComposerAction[]>('AX_CONVERSATION_DEFAULT_COMPOSER_ACTIONS', {\n  providedIn: 'root',\n  factory: () => [],\n});\n\n/**\n * Default conversation tabs configuration\n * Provide this token to override default conversation tabs (all, private, groups, etc.)\n */\nexport const AX_CONVERSATION_DEFAULT_CONVERSATION_TABS = new InjectionToken<AXConversationTab[]>('AX_CONVERSATION_DEFAULT_CONVERSATION_TABS', {\n  providedIn: 'root',\n  factory: () => [],\n});\n\n/**\n * Default info bar actions configuration\n * Provide this token to override default info bar actions (mute, archive, block, etc.)\n */\nexport const AX_CONVERSATION_DEFAULT_INFO_BAR_ACTIONS = new InjectionToken<AXConversationInfoBarAction[]>('AX_CONVERSATION_DEFAULT_INFO_BAR_ACTIONS', {\n  providedIn: 'root',\n  factory: () => [],\n});\n\n/**\n * Default conversation item actions configuration\n * Provide this token to override default conversation item actions (mute, delete, archive, etc.)\n */\nexport const AX_CONVERSATION_DEFAULT_CONVERSATION_ITEM_ACTIONS = new InjectionToken<AXConversationItemAction[]>(\n  'AX_CONVERSATION_DEFAULT_CONVERSATION_ITEM_ACTIONS',\n  {\n    providedIn: 'root',\n    factory: () => [],\n  },\n);\n\n/**\n * Registry configuration interface\n */\nexport interface AXConversationRegistryConfiguration {\n  /**\n   * Additional message renderers to register (built-in renderers are automatic).\n   * Each {@link AXConversationMessageRenderer} may include optional `composerActions` for co-located send UX.\n   */\n  messageRenderers?: AXConversationMessageRenderer[];\n\n  /** Message actions to register by default */\n  messageActions?: AXConversationMessageAction[];\n\n  /** Composer tabs to register by default */\n  composerTabs?: AXConversationComposerTab[];\n\n  /** Composer actions to register by default */\n  composerActions?: AXConversationComposerAction[];\n\n  /** Conversation tabs to register by default */\n  conversationTabs?: AXConversationTab[];\n\n  /** Info bar actions to register by default */\n  infoBarActions?: AXConversationInfoBarAction[];\n\n  /** Conversation item actions to register by default */\n  conversationItemActions?: AXConversationItemAction[];\n}\n\n/**\n * Complete registry configuration token\n * Provide this for comprehensive registry configuration\n */\nexport const AX_CONVERSATION_REGISTRY_CONFIG = new InjectionToken<AXConversationRegistryConfiguration>('AX_CONVERSATION_REGISTRY_CONFIG', {\n  providedIn: 'root',\n  factory: () => ({}),\n});\n","/**\n * Conversation feature flags for configurable bundle size.\n */\nexport type AXConversationComposerTabFeature = 'emoji' | 'sticker';\n\nexport interface AXConversationFeatures {\n  /** Enabled built-in composer popup tabs (`emoji`, `sticker`). Defaults to none when omitted. */\n  composerTabs?: AXConversationComposerTabFeature[];\n}\n\nexport function resolveConversationComposerTabs(\n  features?: AXConversationFeatures,\n): readonly AXConversationComposerTabFeature[] {\n  return features?.composerTabs ?? [];\n}\n\nexport function isComposerTabEnabled(\n  tab: AXConversationComposerTabFeature,\n  features?: AXConversationFeatures,\n): boolean {\n  return resolveConversationComposerTabs(features).includes(tab);\n}\n","/**\n * API call logger for AXConversationService.\n * Enabled via `debugApiLogging` in conversation config.\n */\n\nimport { inject, Injectable } from '@angular/core';\nimport { AX_CONVERSATION_CONFIG } from '../../tokens';\n\nconst loggerFn = console.log;\n\nexport type AXConversationApiName = 'userApi' | 'conversationApi' | 'messageApi' | 'realtimeApi';\n\nexport interface AXConversationApiLogEntry {\n  /** Public method on AXConversationService that triggered the API call. */\n  serviceMethod: string;\n  /** Injected API instance name. */\n  api: AXConversationApiName;\n  /** Method invoked on the API instance. */\n  apiMethod: string;\n  /** Positional arguments passed to the API method. */\n  context: unknown[];\n}\n\n@Injectable()\nexport class AXConversationApiLoggerService {\n  private readonly config = inject(AX_CONVERSATION_CONFIG);\n\n  log(entry: AXConversationApiLogEntry): void {\n    if (!this.config.debugApiLogging) {\n      return;\n    }\n\n    loggerFn('[AXConversation API]', entry);\n  }\n}\n","/**\n * Abstract Conversation Management API\n * Handle conversation CRUD operations, participants, and settings\n */\n\nimport type { AXConversation, AXConversationType, AXConversationParticipant, AXConversationParticipantRole } from '../../models';\nimport type { AXConversationApiError, AXConversationPaginatedResult, AXConversationPagination } from './api-types';\n\n/**\n * Conversation creation data\n */\nexport interface AXConversationCreateData {\n  /** Conversation type */\n  type: AXConversationType;\n  /** Participant user IDs */\n  participantIds: string[];\n  /** User who creates the conversation */\n  creatorId?: string;\n  /** Conversation title (for groups/channels) */\n  title?: string;\n  /** Conversation description */\n  description?: string;\n  /** Avatar URL */\n  avatar?: string;\n  /**\n   * Font Awesome icon class(es) for this conversation when no image avatar is used.\n   * Implementations should treat empty/whitespace `avatar` values as absent and use this icon fallback.\n   */\n  icon?: string;\n  /** Custom metadata */\n  metadata?: Record<string, unknown>;\n  /**\n   * When `true`, create a new private chat even if one already exists with the same participants.\n   * Defaults to `false` for private conversations.\n   */\n  forceCreate?: boolean;\n}\n\n/**\n * Conversation update data\n */\nexport interface AXConversationUpdateData {\n  /** Conversation title */\n  title?: string;\n  /** Conversation description */\n  description?: string;\n  /** Avatar URL */\n  avatar?: string;\n  /**\n   * Font Awesome icon class(es) for this conversation when no image avatar is used.\n   * Implementations should treat empty/whitespace `avatar` values as absent and use this icon fallback.\n   */\n  icon?: string;\n  /** Custom metadata */\n  metadata?: Record<string, unknown>;\n}\n\n/**\n * Conversation filter options\n */\nexport interface AXConversationFilters {\n  /** Filter by type */\n  type?: AXConversationType;\n  /** Filter by unread */\n  unread?: boolean;\n  /** Filter by archived */\n  archived?: boolean;\n  /** Filter by pinned */\n  pinned?: boolean;\n  /** Search query */\n  searchQuery?: string;\n  /** Filter by tags */\n  tags?: string[];\n  /** Custom filters */\n  custom?: Record<string, unknown>;\n}\n\n/**\n * @deprecated Use {@link AXConversationRoomPreferences} on the user API instead.\n */\nexport type AXConversationSettingsUpdate = import('../../models').AXConversationRoomPreferences;\n\n/**\n * Participant update data\n */\nexport interface AXConversationParticipantUpdate {\n  /** User ID */\n  userId: string;\n  /** New role */\n  role?: AXConversationParticipantRole;\n}\n\n/**\n * Abstract Conversation Management API\n *\n * Implement this abstract class to handle conversation operations.\n *\n * @example\n * ```typescript\n * @Injectable()\n * export class MyConversationApi extends AXConversationManagementApi {\n *   constructor(private http: HttpClient) {\n *     super();\n *   }\n *\n *   async createConversation(data: AXConversationCreateData): Promise<AXConversation> {\n *     const response = await this.http.post('/api/conversations', data).toPromise();\n *     return response;\n *   }\n *\n *   // ... implement other methods\n * }\n * ```\n */\nexport abstract class AXConversationApi {\n  // =====================\n  // Conversation CRUD\n  // =====================\n\n  /**\n   * Create a new conversation\n   *\n   * @param data - Conversation creation data\n   * @returns Created conversation\n   * @throws {AXConversationApiError} If creation fails\n   */\n  abstract createConversation(data: AXConversationCreateData): Promise<AXConversation>;\n\n  /**\n   * Get conversation by ID\n   *\n   * @param conversationId - Conversation ID\n   * @returns Conversation details\n   * @throws {AXConversationApiError} If conversation not found\n   */\n  abstract getConversation(conversationId: string): Promise<AXConversation>;\n\n  /**\n   * Get conversations list with pagination\n   *\n   * @param pagination - Pagination parameters\n   * @param filters - Optional filters\n   * @returns Paginated conversation list\n   * @throws {AXConversationApiError} If request fails\n   */\n  abstract getConversations(\n    pagination: AXConversationPagination,\n    filters?: AXConversationFilters,\n  ): Promise<AXConversationPaginatedResult<AXConversation>>;\n\n  /**\n   * Update conversation details\n   *\n   * @param conversationId - Conversation ID\n   * @param updates - Update data\n   * @returns Updated conversation\n   * @throws {AXConversationApiError} If update fails\n   */\n  abstract updateConversation(conversationId: string, updates: AXConversationUpdateData): Promise<AXConversation>;\n\n  /**\n   * Delete conversation\n   *\n   * @param conversationId - Conversation ID\n   * @throws {AXConversationApiError} If deletion fails\n   */\n  abstract deleteConversation(conversationId: string): Promise<boolean>;\n\n  // =====================\n  // Conversation Actions\n  // =====================\n\n  /**\n   * Archive conversation\n   *\n   * @param conversationId - Conversation ID\n   * @throws {AXConversationApiError} If archiving fails\n   */\n  abstract archiveConversation(conversationId: string): Promise<void>;\n\n  /**\n   * Unarchive conversation\n   *\n   * @param conversationId - Conversation ID\n   * @throws {AXConversationApiError} If unarchiving fails\n   */\n  abstract unarchiveConversation(conversationId: string): Promise<void>;\n\n  /**\n   * Pin conversation\n   *\n   * @param conversationId - Conversation ID\n   * @throws {AXConversationApiError} If pinning fails\n   */\n  abstract pinConversation(conversationId: string): Promise<void>;\n\n  /**\n   * Unpin conversation\n   *\n   * @param conversationId - Conversation ID\n   * @throws {AXConversationApiError} If unpinning fails\n   */\n  abstract unpinConversation(conversationId: string): Promise<void>;\n\n  /**\n   * Mark conversation as read\n   *\n   * @param conversationId - Conversation ID\n   * @throws {AXConversationApiError} If marking fails\n   */\n  abstract markConversationAsRead(conversationId: string): Promise<void>;\n\n  // =====================\n  // Search & Filter\n  // =====================\n\n  /**\n   * Search conversations\n   *\n   * @param query - Search query\n   * @returns Matching conversations\n   * @throws {AXConversationApiError} If search fails\n   */\n  abstract searchConversations(query: string): Promise<AXConversation[]>;\n\n  /**\n   * Filter conversations\n   *\n   * @param filters - Filter options\n   * @param pagination - Pagination parameters\n   * @returns Filtered conversations\n   * @throws {AXConversationApiError} If filtering fails\n   */\n  abstract filterConversations(\n    filters: AXConversationFilters,\n    pagination?: AXConversationPagination,\n  ): Promise<AXConversationPaginatedResult<AXConversation>>;\n\n  // =====================\n  // Participant Management\n  // =====================\n\n  /**\n   * Get conversation participants\n   *\n   * @param conversationId - Conversation ID\n   * @returns List of participants\n   * @throws {AXConversationApiError} If request fails\n   */\n  abstract getParticipants(conversationId: string): Promise<AXConversationParticipant[]>;\n\n  /**\n   * Add participants to conversation\n   *\n   * @param conversationId - Conversation ID\n   * @param userIds - User IDs to add\n   * @returns Updated conversation\n   * @throws {AXConversationApiError} If adding fails\n   */\n  abstract addParticipants(conversationId: string, userIds: string[]): Promise<AXConversation>;\n\n  /**\n   * Remove participant from conversation\n   *\n   * @param conversationId - Conversation ID\n   * @param userId - User ID to remove\n   * @returns Updated conversation\n   * @throws {AXConversationApiError} If removal fails\n   */\n  abstract removeParticipant(conversationId: string, userId: string): Promise<AXConversation>;\n\n  /**\n   * Leave conversation (remove self)\n   *\n   * @param conversationId - Conversation ID\n   * @throws {AXConversationApiError} If leaving fails\n   */\n  abstract leaveConversation(conversationId: string): Promise<void>;\n\n  /**\n   * Update participant role\n   *\n   * @param conversationId - Conversation ID\n   * @param update - Participant update data\n   * @returns Updated conversation\n   * @throws {AXConversationApiError} If update fails\n   */\n  abstract updateParticipant(conversationId: string, update: AXConversationParticipantUpdate): Promise<AXConversation>;\n\n  // =====================\n  // Media & Files\n  // =====================\n\n  /**\n   * Upload conversation avatar\n   *\n   * @param conversationId - Conversation ID\n   * @param file - Avatar image file\n   * @returns Avatar URL\n   * @throws {AXConversationApiError} If upload fails\n   */\n  abstract uploadConversationAvatar(conversationId: string, file: File): Promise<string>;\n\n  /**\n   * Get conversation media gallery\n   *\n   * @param conversationId - Conversation ID\n   * @param pagination - Pagination parameters\n   * @returns Paginated media items\n   * @throws {AXConversationApiError} If request fails\n   */\n  abstract getConversationMedia(conversationId: string, pagination?: AXConversationPagination): Promise<AXConversationPaginatedResult<unknown>>;\n\n  // =====================\n  // Conversation Metadata & Tags\n  // =====================\n\n  /**\n   * Add tags to conversation\n   *\n   * @param conversationId - Conversation ID\n   * @param tags - Tags to add\n   * @throws {AXConversationApiError} If adding fails\n   */\n  abstract addConversationTags(conversationId: string, tags: string[]): Promise<void>;\n\n  /**\n   * Remove tags from conversation\n   *\n   * @param conversationId - Conversation ID\n   * @param tags - Tags to remove\n   * @throws {AXConversationApiError} If removal fails\n   */\n  abstract removeConversationTags(conversationId: string, tags: string[]): Promise<void>;\n\n  /**\n   * Get conversation tags\n   *\n   * @param conversationId - Conversation ID\n   * @returns Array of tags\n   * @throws {AXConversationApiError} If request fails\n   */\n  abstract getConversationTags(conversationId: string): Promise<string[]>;\n\n  // =====================\n  // Draft Management\n  // =====================\n\n  /**\n   * Save draft message for conversation\n   *\n   * @param conversationId - Conversation ID\n   * @param draft - Draft text\n   * @throws {AXConversationApiError} If saving fails\n   */\n  abstract saveDraft(conversationId: string, draft: string): Promise<void>;\n\n  /**\n   * Get draft message for conversation\n   *\n   * @param conversationId - Conversation ID\n   * @returns Draft text or null\n   * @throws {AXConversationApiError} If request fails\n   */\n  abstract getDraft(conversationId: string): Promise<string | null>;\n\n  /**\n   * Clear draft message for conversation\n   *\n   * @param conversationId - Conversation ID\n   * @throws {AXConversationApiError} If clearing fails\n   */\n  abstract clearDraft(conversationId: string): Promise<void>;\n\n  // =====================\n  // Error Handling Helper\n  // =====================\n\n  /**\n   * Create an API error\n   * Helper method for consistent error creation\n   *\n   * @param code - Error code\n   * @param message - Error message\n   * @param statusCode - HTTP status code\n   * @param details - Additional details\n   * @returns API error object\n   */\n  protected createError(code: string, message: string, statusCode?: number, details?: unknown): AXConversationApiError {\n    return {\n      code,\n      message,\n      statusCode,\n      details,\n      timestamp: new Date(),\n    };\n  }\n}\n","/**\n * Abstract Message Management API\n * Handle message CRUD operations, reactions, and interactions\n */\n\nimport type { AXConversationMessage, AXConversationMessagePayload, AXConversationSendMessageCommand } from '../../models';\nimport type { AXConversationApiError, AXConversationPaginatedResult, AXConversationPagination } from './api-types';\n\n/**\n * Message search filters\n */\nexport interface AXConversationMessageSearchFilters {\n  /** Search query */\n  query: string;\n  /** Filter by sender ID */\n  senderId?: string;\n  /** Filter by message type */\n  type?: string;\n  /** Date range start */\n  dateFrom?: Date;\n  /** Date range end */\n  dateTo?: Date;\n  /** Include only messages with media */\n  mediaOnly?: boolean;\n}\n\n/**\n * Message forward data\n */\nexport interface AXConversationMessageForwardData {\n  /** Message ID to forward */\n  messageId: string;\n  /** Target conversation IDs */\n  conversationIds: string[];\n  /** Optional caption */\n  caption?: string;\n}\n\n/**\n * Read receipt information\n */\nexport interface AXConversationReadReceipt {\n  /** User ID */\n  userId: string;\n  /** User name */\n  userName: string;\n  /** Read timestamp */\n  readAt: Date;\n}\n\n/**\n * Pinned message information\n */\nexport interface AXConversationPinnedMessage {\n  /** Message ID */\n  messageId: string;\n  /** Pinned by user ID */\n  pinnedBy: string;\n  /** Pinned timestamp */\n  pinnedAt: Date;\n}\n\n/**\n * Abstract Message Management API\n *\n * Implement this abstract class to handle message operations.\n *\n * @example\n * ```typescript\n * @Injectable()\n * export class MyMessageApi extends AXConversationMessageApi {\n *   constructor(private http: HttpClient) {\n *     super();\n *   }\n *\n *   async sendMessage(command: AXConversationSendMessageCommand): Promise<AXConversationMessage> {\n *     const response = await this.http.post('/api/messages', command).toPromise();\n *     return response;\n *   }\n *\n *   // ... implement other methods\n * }\n * ```\n */\nexport abstract class AXConversationMessageApi {\n  // =====================\n  // Message CRUD\n  // =====================\n\n  /**\n   * Send a new message\n   *\n   * @param command - Message send command\n   * @returns Sent message with server-generated ID\n   * @throws {AXConversationApiError} If send fails\n   */\n  abstract sendMessage(command: AXConversationSendMessageCommand): Promise<AXConversationMessage>;\n\n  /**\n   * Get message by ID\n   *\n   * @param messageId - Message ID\n   * @returns Message details\n   * @throws {AXConversationApiError} If message not found\n   */\n  abstract getMessage(messageId: string): Promise<AXConversationMessage>;\n\n  /**\n   * Get messages for a conversation\n   *\n   * @param conversationId - Conversation ID\n   * @param pagination - Pagination parameters\n   * @returns Paginated message list\n   * @throws {AXConversationApiError} If request fails\n   */\n  abstract getMessages(conversationId: string, pagination: AXConversationPagination): Promise<AXConversationPaginatedResult<AXConversationMessage>>;\n\n  /**\n   * Edit an existing message\n   *\n   * @param messageId - Message ID to edit\n   * @param payload - New message payload\n   * @returns Updated message\n   * @throws {AXConversationApiError} If edit fails or message not found\n   */\n  abstract editMessage(messageId: string, payload: AXConversationMessagePayload): Promise<AXConversationMessage>;\n\n  /**\n   * Delete a message\n   *\n   * @param messageId - Message ID to delete\n   * @param forEveryone - Delete for all participants (vs just for current user)\n   * @throws {AXConversationApiError} If deletion fails\n   */\n  abstract deleteMessage(messageId: string, forEveryone?: boolean): Promise<void>;\n\n  /**\n   * Delete multiple messages\n   *\n   * @param messageIds - Array of message IDs to delete\n   * @param forEveryone - Delete for all participants\n   * @throws {AXConversationApiError} If deletion fails\n   */\n  abstract deleteMessages(messageIds: string[], forEveryone?: boolean): Promise<void>;\n\n  // =====================\n  // Message Search\n  // =====================\n\n  /**\n   * Search messages in a conversation\n   *\n   * @param conversationId - Conversation ID\n   * @param filters - Search filters\n   * @param pagination - Pagination parameters\n   * @returns Matching messages\n   * @throws {AXConversationApiError} If search fails\n   */\n  abstract searchMessages(\n    conversationId: string,\n    filters: AXConversationMessageSearchFilters,\n    pagination?: AXConversationPagination,\n  ): Promise<AXConversationPaginatedResult<AXConversationMessage>>;\n\n  /**\n   * Search messages across all conversations\n   *\n   * @param filters - Search filters\n   * @param pagination - Pagination parameters\n   * @returns Matching messages\n   * @throws {AXConversationApiError} If search fails\n   */\n  abstract searchAllMessages(\n    filters: AXConversationMessageSearchFilters,\n    pagination?: AXConversationPagination,\n  ): Promise<AXConversationPaginatedResult<AXConversationMessage>>;\n\n  // =====================\n  // Reactions\n  // =====================\n\n  /**\n   * Add a reaction to a message\n   *\n   * @param messageId - Message ID\n   * @param emoji - Emoji reaction\n   * @throws {AXConversationApiError} If reaction fails\n   */\n  abstract addReaction(messageId: string, emoji: string): Promise<void>;\n\n  /**\n   * Remove a reaction from a message\n   *\n   * @param messageId - Message ID\n   * @param emoji - Emoji reaction to remove\n   * @throws {AXConversationApiError} If removal fails\n   */\n  abstract removeReaction(messageId: string, emoji: string): Promise<void>;\n\n  /**\n   * Get available reaction emojis\n   *\n   * @returns Array of available emoji reactions\n   * @throws {AXConversationApiError} If fetching fails\n   */\n  abstract getAvailableReactions(): Promise<string[]>;\n\n  // =====================\n  // Read Receipts\n  // =====================\n\n  /**\n   * Mark messages as read\n   *\n   * @param conversationId - Conversation ID\n   * @param messageIds - Array of message IDs to mark as read\n   * @throws {AXConversationApiError} If marking fails\n   */\n  abstract markAsRead(conversationId: string, messageIds: string[]): Promise<void>;\n\n  /**\n   * Mark conversation as unread\n   *\n   * @param conversationId - Conversation ID\n   * @throws {AXConversationApiError} If marking fails\n   */\n  abstract markAsUnread(conversationId: string): Promise<void>;\n\n  /**\n   * Get read receipts for a message\n   *\n   * @param messageId - Message ID\n   * @returns Array of read receipts\n   * @throws {AXConversationApiError} If request fails\n   */\n  abstract getReadReceipts(messageId: string): Promise<AXConversationReadReceipt[]>;\n\n  // =====================\n  // Message Actions\n  // =====================\n\n  /**\n   * Forward message to other conversations\n   *\n   * @param data - Forward data\n   * @returns Array of forwarded messages\n   * @throws {AXConversationApiError} If forwarding fails\n   */\n  abstract forwardMessage(data: AXConversationMessageForwardData): Promise<AXConversationMessage[]>;\n\n  /**\n   * Pin message in conversation\n   *\n   * @param conversationId - Conversation ID\n   * @param messageId - Message ID to pin\n   * @throws {AXConversationApiError} If pinning fails\n   */\n  abstract pinMessage(conversationId: string, messageId: string): Promise<void>;\n\n  /**\n   * Unpin message from conversation\n   *\n   * @param conversationId - Conversation ID\n   * @param messageId - Message ID to unpin\n   * @throws {AXConversationApiError} If unpinning fails\n   */\n  abstract unpinMessage(conversationId: string, messageId: string): Promise<void>;\n\n  /**\n   * Get pinned messages in conversation\n   *\n   * @param conversationId - Conversation ID\n   * @returns Array of pinned messages\n   * @throws {AXConversationApiError} If request fails\n   */\n  abstract getPinnedMessages(conversationId: string): Promise<AXConversationPinnedMessage[]>;\n\n  // =====================\n  // Message Threads (Replies)\n  // =====================\n\n  /**\n   * Get replies to a message\n   *\n   * @param messageId - Original message ID\n   * @param pagination - Pagination parameters\n   * @returns Paginated replies\n   * @throws {AXConversationApiError} If request fails\n   */\n  abstract getMessageReplies(messageId: string, pagination?: AXConversationPagination): Promise<AXConversationPaginatedResult<AXConversationMessage>>;\n\n  /**\n   * Get reply count for a message\n   *\n   * @param messageId - Original message ID\n   * @returns Number of replies\n   * @throws {AXConversationApiError} If fetching fails\n   */\n  abstract getReplyCount(messageId: string): Promise<number>;\n\n  /**\n   * Get forward count for a message\n   *\n   * @param messageId - Original message ID\n   * @returns Number of times forwarded\n   * @throws {AXConversationApiError} If fetching fails\n   */\n  abstract getForwardCount(messageId: string): Promise<number>;\n\n  // =====================\n  // Typing Indicators\n  // =====================\n\n  /**\n   * Send typing indicator\n   *\n   * @param conversationId - Conversation ID\n   * @throws {AXConversationApiError} If sending fails\n   */\n  abstract sendTypingIndicator(conversationId: string): Promise<void>;\n\n  /**\n   * Stop typing indicator\n   *\n   * @param conversationId - Conversation ID\n   * @throws {AXConversationApiError} If stopping fails\n   */\n  abstract stopTypingIndicator(conversationId: string): Promise<void>;\n\n  // =====================\n  // Message Metadata\n  // =====================\n\n  /**\n   * Update message metadata\n   *\n   * @param messageId - Message ID\n   * @param metadata - Metadata to update\n   * @throws {AXConversationApiError} If update fails\n   */\n  abstract updateMessageMetadata(messageId: string, metadata: Record<string, unknown>): Promise<void>;\n\n  /**\n   * Get message metadata\n   *\n   * @param messageId - Message ID\n   * @returns Message metadata\n   * @throws {AXConversationApiError} If request fails\n   */\n  abstract getMessageMetadata(messageId: string): Promise<Record<string, unknown>>;\n\n  // =====================\n  // Message Status\n  // =====================\n\n  /**\n   * Update message status\n   *\n   * @param messageId - Message ID\n   * @param status - New status\n   * @throws {AXConversationApiError} If update fails\n   */\n  abstract updateMessageStatus(messageId: string, status: 'sending' | 'sent' | 'delivered' | 'read' | 'failed'): Promise<void>;\n\n  /**\n   * Get message delivery status\n   *\n   * @param messageId - Message ID\n   * @returns Delivery status information\n   * @throws {AXConversationApiError} If request fails\n   */\n  abstract getMessageDeliveryStatus(messageId: string): Promise<{\n    delivered: number;\n    read: number;\n    total: number;\n  }>;\n\n  // =====================\n  // Bulk Operations\n  // =====================\n\n  /**\n   * Mark multiple messages as read\n   *\n   * @param messageIds - Array of message IDs\n   * @throws {AXConversationApiError} If marking fails\n   */\n  abstract markMessagesAsRead(messageIds: string[]): Promise<void>;\n\n  /**\n   * Delete multiple messages in bulk\n   *\n   * @param conversationId - Conversation ID\n   * @param messageIds - Array of message IDs\n   * @param forEveryone - Delete for all participants\n   * @throws {AXConversationApiError} If deletion fails\n   */\n  abstract bulkDeleteMessages(conversationId: string, messageIds: string[], forEveryone?: boolean): Promise<void>;\n\n  // =====================\n  // Message Export\n  // =====================\n\n  /**\n   * Export conversation messages\n   *\n   * @param conversationId - Conversation ID\n   * @param format - Export format (json, csv, txt)\n   * @returns Export data or download URL\n   * @throws {AXConversationApiError} If export fails\n   */\n  abstract exportMessages(conversationId: string, format: 'json' | 'csv' | 'txt'): Promise<string | Blob>;\n\n  // =====================\n  // Error Handling Helper\n  // =====================\n\n  /**\n   * Create an API error\n   * Helper method for consistent error creation\n   *\n   * @param code - Error code\n   * @param message - Error message\n   * @param statusCode - HTTP status code\n   * @param details - Additional details\n   * @returns API error object\n   */\n  protected createError(code: string, message: string, statusCode?: number, details?: unknown): AXConversationApiError {\n    return {\n      code,\n      message,\n      statusCode,\n      details,\n      timestamp: new Date(),\n    };\n  }\n}\n","/**\n * Abstract Real-time Events API\n * Handle WebSocket/SSE event subscriptions for conversation domain updates\n */\n\nimport { Observable } from 'rxjs';\nimport type {\n  AXConversation,\n  AXConversationMessage,\n  AXConversationPresenceUpdate,\n  AXConversationTypingIndicator,\n} from '../../models';\n\n/**\n * Abstract Real-time Events API\n *\n * Implement this abstract class to expose domain event streams from your WebSocket/SSE layer.\n * Connection lifecycle is owned by the implementation — this contract only covers subscriptions.\n *\n * Covered domains: message CRUD, conversation (room) CRUD, typing indicators, and presence.\n * Message updates include edits, reactions, delivery/read status, and other message field changes.\n *\n * @example\n * ```typescript\n * @Injectable()\n * export class MyRealtimeApi extends AXConversationRealtimeApi {\n *   private readonly messageCreated$ = new Subject<AXConversationMessage>();\n *\n *   constructor(private readonly socket: MyChatSocketService) {\n *     super();\n *     this.socket.on('message.created', (message) => this.messageCreated$.next(message));\n *   }\n *\n *   subscribeToMessages(conversationId: string): Observable<AXConversationMessage> {\n *     return this.messageCreated$.pipe(\n *       filter((message) => !conversationId || message.conversationId === conversationId),\n *     );\n *   }\n *\n *   // ... implement other methods\n * }\n * ```\n */\nexport abstract class AXConversationRealtimeApi {\n  // =====================\n  // Message Events\n  // =====================\n\n  /**\n   * Subscribe to new messages in a conversation\n   *\n   * @param conversationId - Conversation ID (empty string for all conversations)\n   * @returns Observable stream of new messages\n   */\n  abstract subscribeToMessages(conversationId: string): Observable<AXConversationMessage>;\n\n  /**\n   * Subscribe to message updates (edits, reactions, status changes, metadata, etc.)\n   *\n   * @param conversationId - Optional conversation ID to filter\n   * @returns Observable stream of updated messages\n   */\n  abstract subscribeToMessageUpdates(conversationId?: string): Observable<AXConversationMessage>;\n\n  /**\n   * Subscribe to message deletions\n   *\n   * @param conversationId - Optional conversation ID to filter\n   * @returns Observable stream of deleted message IDs\n   */\n  abstract subscribeToMessageDeletions(conversationId?: string): Observable<string>;\n\n  /**\n   * Subscribe to message status changes\n   * Fires when message status changes (sending -> sent -> delivered -> read)\n   *\n   * @param conversationId - Optional conversation ID to filter\n   * @returns Observable stream of message status updates\n   */\n  abstract subscribeToMessageStatusChanges(conversationId?: string): Observable<{\n    messageId: string;\n    status: 'sending' | 'sent' | 'delivered' | 'read' | 'failed';\n    timestamp: Date;\n  }>;\n\n  /**\n   * Subscribe to read receipt updates\n   * Fires when someone reads messages\n   *\n   * @param conversationId - Optional conversation ID to filter\n   * @returns Observable stream of message IDs that were read\n   */\n  abstract subscribeToReadReceipts(conversationId?: string): Observable<{\n    messageId: string;\n    userId: string;\n    readAt: Date;\n  }>;\n\n  // =====================\n  // Conversation Events\n  // =====================\n\n  /**\n   * Subscribe to conversation updates\n   * Fires when conversation details change (title, avatar, participants, last message, etc.)\n   *\n   * @returns Observable stream of updated conversations\n   */\n  abstract subscribeToConversationUpdates(): Observable<AXConversation>;\n\n  /**\n   * Subscribe to conversation creation\n   * Fires when user is added to a new conversation\n   *\n   * @returns Observable stream of new conversations\n   */\n  abstract subscribeToConversationCreated(): Observable<AXConversation>;\n\n  /**\n   * Subscribe to conversation deletion\n   * Fires when a conversation is deleted\n   *\n   * @returns Observable stream of deleted conversation IDs\n   */\n  abstract subscribeToConversationDeleted(): Observable<string>;\n\n  // =====================\n  // Typing Indicators\n  // =====================\n\n  /**\n   * Subscribe to typing indicators\n   *\n   * @param conversationId - Conversation ID (empty string for all conversations)\n   * @returns Observable stream of typing indicators\n   */\n  abstract subscribeToTypingIndicators(conversationId: string): Observable<AXConversationTypingIndicator>;\n\n  // =====================\n  // Presence Updates\n  // =====================\n\n  /**\n   * Subscribe to presence updates (online/offline status)\n   *\n   * @param userIds - Optional array of user IDs to filter (empty for all users)\n   * @returns Observable stream of presence updates\n   */\n  abstract subscribeToPresenceUpdates(userIds?: string[]): Observable<AXConversationPresenceUpdate>;\n}\n","/**\n * Abstract User Management API\n * Handle user profile management and user operations for conversations\n */\n\nimport type {\n  AXConversationParticipant,\n  AXConversationPresenceUpdate,\n  AXConversationRoomPreferences,\n  AXConversationRoomPreferencesMap,\n  AXConversationUser,\n  AXConversationUserProfile,\n} from '../../models';\nimport type {\n  AXConversationApiError,\n  AXConversationPaginatedResult,\n  AXConversationPagination,\n  AXConversationPresenceStatus,\n} from './api-types';\n\n/**\n * User profile update data\n */\nexport interface AXConversationUserProfileUpdate {\n  /** Display name */\n  name?: string;\n  /** Avatar URL */\n  avatar?: string;\n  /** Short line under the name in lists (e.g. job title) */\n  description?: string;\n  /** Extended profile fields */\n  profile?: Partial<AXConversationUserProfile>;\n  /** @deprecated Prefer `profile.bio` */\n  bio?: string;\n  /** @deprecated Prefer `profile.phone` */\n  phone?: string;\n  /** @deprecated Prefer `profile.email` */\n  email?: string;\n  /** Custom fields */\n  custom?: Record<string, unknown>;\n}\n\n/**\n * User search filters\n */\nexport interface AXConversationUserSearchFilters {\n  /** Search query */\n  query?: string;\n  /** Filter by online status */\n  onlineOnly?: boolean;\n  /** Exclude blocked users */\n  excludeBlocked?: boolean;\n  /** Limit results */\n  limit?: number;\n}\n\n/**\n * Block/Report reason\n */\nexport interface AXConversationBlockReportReason {\n  /** Reason code */\n  code: string;\n  /** Description */\n  description?: string;\n}\n\n/**\n * Abstract User Management API\n *\n * Implement this abstract class to handle user management for conversations.\n *\n * @example\n * ```typescript\n * @Injectable()\n * export class MyUserApi extends AXConversationUserApi {\n *   constructor(private http: HttpClient) {\n *     super();\n *   }\n *\n *   async getCurrentUser(): Promise<AXConversationParticipant> {\n *     const response = await this.http.get('/api/users/me').toPromise();\n *     return response;\n *   }\n *\n *   // ... implement other methods\n * }\n * ```\n */\nexport abstract class AXConversationUserApi {\n\n  // =====================\n  // User Profile\n  // =====================\n\n  /**\n   * Get current authenticated user\n   *\n   * @returns Current user information\n   * @throws {AXConversationApiError} If user is not authenticated\n   */\n  abstract getCurrentUser(): Promise<AXConversationUser>;\n\n  /**\n   * Update current user profile\n   *\n   * @param updates - Profile updates\n   * @returns Updated user information\n   * @throws {AXConversationApiError} If update fails\n   */\n  abstract updateProfile(updates: AXConversationUserProfileUpdate): Promise<AXConversationUser>;\n\n  /**\n   * Upload user avatar\n   *\n   * @param file - Avatar image file\n   * @returns Avatar URL\n   * @throws {AXConversationApiError} If upload fails\n   */\n  abstract uploadAvatar(file: File): Promise<string>;\n\n  // =====================\n  // User Discovery\n  // =====================\n\n  /**\n   * Get available users for conversation creation\n   *\n   * @param pagination - Pagination parameters\n   * @param filters - Search filters\n   * @returns Paginated list of users\n   * @throws {AXConversationApiError} If request fails\n   */\n  abstract getUsers(\n    pagination?: AXConversationPagination,\n    filters?: AXConversationUserSearchFilters,\n  ): Promise<AXConversationPaginatedResult<AXConversationParticipant>>;\n\n  /**\n   * Search users by query\n   *\n   * @param query - Search query\n   * @returns Matching users\n   * @throws {AXConversationApiError} If search fails\n   */\n  abstract searchUsers(query: string): Promise<AXConversationParticipant[]>;\n\n  /**\n   * Get user by ID\n   *\n   * @param userId - User ID\n   * @returns User information\n   * @throws {AXConversationApiError} If user not found\n   */\n  abstract getUserById(userId: string): Promise<AXConversationParticipant>;\n\n  /**\n   * Get multiple users by IDs\n   *\n   * @param userIds - Array of user IDs\n   * @returns Array of users\n   * @throws {AXConversationApiError} If request fails\n   */\n  abstract getUsersByIds(userIds: string[]): Promise<AXConversationParticipant[]>;\n\n  // =====================\n  // Presence Management\n  // =====================\n\n  /**\n   * Get user presence status\n   *\n   * @param userId - User ID\n   * @returns Presence information\n   * @throws {AXConversationApiError} If request fails\n   */\n  abstract getUserPresence(userId: string): Promise<AXConversationPresenceUpdate>;\n\n  /**\n   * Get presence for multiple users (bulk hydration).\n   */\n  abstract getUsersPresence(userIds: string[]): Promise<AXConversationPresenceUpdate[]>;\n\n  /**\n   * Update current user presence\n   *\n   * @param status - Presence status\n   * @param statusText - Optional status text\n   * @throws {AXConversationApiError} If update fails\n   */\n  abstract updatePresence(status: AXConversationPresenceStatus, statusText?: string): Promise<void>;\n\n  // =====================\n  // User Blocking & Reporting\n  // =====================\n\n  /**\n   * Block a user\n   *\n   * @param userId - User ID to block\n   * @param reason - Optional reason\n   * @throws {AXConversationApiError} If blocking fails\n   */\n  abstract blockUser(userId: string, reason?: AXConversationBlockReportReason): Promise<void>;\n\n  /**\n   * Unblock a user\n   *\n   * @param userId - User ID to unblock\n   * @throws {AXConversationApiError} If unblocking fails\n   */\n  abstract unblockUser(userId: string): Promise<void>;\n\n  /**\n   * Get list of blocked users\n   *\n   * @returns Array of blocked user IDs\n   * @throws {AXConversationApiError} If request fails\n   */\n  abstract getBlockedUsers(): Promise<string[]>;\n\n  /**\n   * Report a user\n   *\n   * @param userId - User ID to report\n   * @param reason - Report reason\n   * @throws {AXConversationApiError} If reporting fails\n   */\n  abstract reportUser(userId: string, reason: AXConversationBlockReportReason): Promise<void>;\n\n  // =====================\n  // User Settings & Preferences\n  // =====================\n\n  /**\n   * Get user settings\n   *\n   * @returns User settings\n   * @throws {AXConversationApiError} If request fails\n   */\n  abstract getUserSettings(): Promise<Record<string, unknown>>;\n\n  /**\n   * Update user settings\n   *\n   * @param settings - Settings to update\n   * @throws {AXConversationApiError} If update fails\n   */\n  abstract updateUserSettings(settings: Record<string, unknown>): Promise<void>;\n\n  // =====================\n  // Per-conversation user preferences (mute, notifications, etc.)\n  // =====================\n\n  /**\n   * Get all conversation preferences for the current user.\n   */\n  abstract getConversationPreferences(): Promise<AXConversationRoomPreferencesMap>;\n\n  /**\n   * Get preferences for a single conversation.\n   */\n  abstract getConversationPreferencesForRoom(conversationId: string): Promise<AXConversationRoomPreferences>;\n\n  /**\n   * Update preferences for a conversation (current user's view).\n   */\n  abstract updateConversationPreferences(\n    conversationId: string,\n    preferences: Partial<AXConversationRoomPreferences>,\n  ): Promise<AXConversationRoomPreferences>;\n\n  // =====================\n  // Error Handling Helper\n  // =====================\n\n  /**\n   * Create an API error\n   * Helper method for consistent error creation\n   *\n   * @param code - Error code\n   * @param message - Error message\n   * @param statusCode - HTTP status code\n   * @param details - Additional details\n   * @returns API error object\n   */\n  protected createError(code: string, message: string, statusCode?: number, details?: unknown): AXConversationApiError {\n    return {\n      code,\n      message,\n      statusCode,\n      details,\n      timestamp: new Date(),\n    };\n  }\n}\n","/**\n * API Services\n * Export all abstract API classes and types\n */\n\n// Shared types\nexport * from './api-types';\n\n// API logger\nexport * from './conversation-api-logger.service';\n\n// API abstracts\nexport * from './conversation-api.abstract';\nexport * from './message-api.abstract';\nexport * from './realtime-api.abstract';\nexport * from './user-api.abstract';\n","/**\n * Tracks composer primary-button generation state (e.g. AI response in progress).\n * Shared by ConversationService, ComposerService, and app-level Message APIs.\n */\nimport { computed, Injectable, signal } from '@angular/core';\nimport { Subject } from 'rxjs';\n\nexport type AXConversationComposerGenerationPhase = 'idle' | 'generating' | 'stopping';\n\n@Injectable()\nexport class AXConversationComposerGenerationStateService {\n  private readonly _phase = signal<AXConversationComposerGenerationPhase>('idle');\n  private readonly _cancelled$ = new Subject<void>();\n\n  /** Current generation lifecycle phase. */\n  readonly phase = this._phase.asReadonly();\n\n  /** Whether a background generation (e.g. AI response) is in progress. */\n  readonly isGenerating = computed(() => this._phase() === 'generating');\n\n  /** Whether generation is being cancelled (spinner / locked until API finishes). */\n  readonly isStopping = computed(() => this._phase() === 'stopping');\n\n  /** Whether generation or stop-cleanup is in progress. */\n  readonly isBusy = computed(() => this._phase() !== 'idle');\n\n  /** Emits when the user presses the composer cancel/stop button. */\n  readonly onCancelled = this._cancelled$.asObservable();\n\n  setGenerating(value: boolean): void {\n    this._phase.set(value ? 'generating' : 'idle');\n  }\n\n  /** User requested cancel — enters `stopping` until {@link setGenerating}(false) is called. */\n  cancel(): void {\n    if (this._phase() !== 'generating') {\n      return;\n    }\n    this._phase.set('stopping');\n    this._cancelled$.next();\n  }\n}\n","import type { AXConversationMessageType } from './message.model';\n\n/** Lightweight catalog ids — safe to import from plugin definitions without pulling pickers. */\nexport const AX_CONVERSATION_IMAGE_CATALOG = 'conversation-image' as const;\nexport const AX_CONVERSATION_VIDEO_CATALOG = 'conversation-video' as const;\nexport const AX_CONVERSATION_AUDIO_CATALOG = 'conversation-audio' as const;\nexport const AX_CONVERSATION_FILE_CATALOG = 'conversation-file' as const;\nexport const AX_CONVERSATION_VOICE_CATALOG = 'conversation-voice' as const;\n\n/** Catalog names for conversation media message types (no picker module imports). */\nexport const AX_CONVERSATION_MESSAGE_TYPE_FILE_TYPE: Partial<Record<AXConversationMessageType, string>> = {\n  image: AX_CONVERSATION_IMAGE_CATALOG,\n  video: AX_CONVERSATION_VIDEO_CATALOG,\n  audio: AX_CONVERSATION_AUDIO_CATALOG,\n  file: AX_CONVERSATION_FILE_CATALOG,\n  voice: AX_CONVERSATION_VOICE_CATALOG,\n  sticker: AX_CONVERSATION_IMAGE_CATALOG,\n};\n\n/** Resolves {@link AXConversationMessage.fileType} from command or message type. */\nexport function resolveConversationMessageFileType(type: AXConversationMessageType, fileType?: string): string | undefined {\n  return fileType ?? AX_CONVERSATION_MESSAGE_TYPE_FILE_TYPE[type];\n}\n","import type { AXConversation } from '../models/conversation.model';\nimport type { AXConversationParticipant } from '../models/participant.model';\nimport {\n  AX_CONVERSATION_PEER_AVATAR_TYPES,\n  resolveConversationPeerParticipant,\n} from './avatar-context.utils';\n\nconst AX_CONVERSATION_GENERIC_PRIVATE_TITLES = new Set(['', 'new chat', 'new conversation']);\n\n/** Default Font Awesome icon for group conversations without a custom avatar image. */\nexport const AX_CONVERSATION_DEFAULT_GROUP_ICON = 'fa-light fa-users';\n\n/** Default Font Awesome icon for private/bot conversations without a custom avatar image. */\nexport const AX_CONVERSATION_DEFAULT_USER_ICON = 'fa-light fa-user';\n\n/** True when the stored title is a placeholder, not a user-defined name. */\nexport function isGenericPrivateConversationTitle(title: string | undefined): boolean {\n  return AX_CONVERSATION_GENERIC_PRIVATE_TITLES.has((title ?? '').trim().toLowerCase());\n}\n\n/**\n * Find an existing private 1:1 conversation between the current user and a peer.\n * Matches conversations with exactly those two participants.\n */\nexport function findExistingPrivateConversation(\n  conversations: AXConversation[],\n  currentUserId: string,\n  peerUserId: string,\n): AXConversation | undefined {\n  return conversations.find((conversation) => {\n    if (conversation.type !== 'private') {\n      return false;\n    }\n\n    const participantIds = new Set(conversation.participants.map((participant) => participant.id));\n    return participantIds.size === 2 && participantIds.has(currentUserId) && participantIds.has(peerUserId);\n  });\n}\n\n/** Other participant in a private 1v1 chat (excludes the current viewer). */\nexport function resolvePrivatePeerParticipant(\n  conversation: AXConversation,\n  currentUserId?: string,\n): AXConversationParticipant | undefined {\n  if (conversation.type !== 'private') {\n    return undefined;\n  }\n\n  return resolveConversationPeerParticipant(conversation, currentUserId);\n}\n\n/**\n * Resolves the display title for the current viewer.\n * Private and bot peer-scoped chats show the other participant's name when no custom title is set.\n */\nexport function resolveConversationTitleForViewer(\n  conversation: AXConversation,\n  currentUserId?: string,\n): string {\n  if (!AX_CONVERSATION_PEER_AVATAR_TYPES.has(conversation.type)) {\n    return conversation.title;\n  }\n\n  const peer = resolveConversationPeerParticipant(conversation, currentUserId);\n  if (peer?.name) {\n    return peer.name;\n  }\n\n  if (conversation.type === 'private' && isGenericPrivateConversationTitle(conversation.title)) {\n    return conversation.title || 'New Chat';\n  }\n\n  return conversation.title;\n}\n\n/**\n * Returns a viewer-scoped copy of a conversation with dynamic peer title/avatar/icon.\n * Does not mutate the source object.\n */\nexport function resolveConversationForViewer(\n  conversation: AXConversation,\n  currentUserId?: string,\n): AXConversation {\n  if (!AX_CONVERSATION_PEER_AVATAR_TYPES.has(conversation.type) || !currentUserId) {\n    return conversation;\n  }\n\n  const peer = resolveConversationPeerParticipant(conversation, currentUserId);\n  if (!peer) {\n    return conversation;\n  }\n\n  const title = resolveConversationTitleForViewer(conversation, currentUserId);\n  const avatar = conversation.avatar ?? peer.avatar;\n  const icon = conversation.icon ?? peer.icon;\n\n  if (\n    title === conversation.title &&\n    avatar === conversation.avatar &&\n    icon === conversation.icon\n  ) {\n    return conversation;\n  }\n\n  return {\n    ...conversation,\n    title,\n    avatar,\n    icon,\n  };\n}\n\n/** Whether message reactions are enabled for a conversation. Defaults to `true` when omitted. */\nexport function isConversationReactionsEnabled(conversation?: AXConversation | null): boolean {\n  const value = conversation?.metadata?.reactionsEnabled;\n  return value !== false;\n}\n","/**\n * Message Utilities Service\n * Helper functions for message formatting and display\n */\n\nimport { translateSync } from '@acorex/core/translation';\nimport type { AXConversation, AXConversationMessage, AXConversationPresenceStatus, AXConversationUserPresence } from '../models';\nimport { resolveConversationPeerUserId } from './avatar-context.utils';\n\nexport class AXConversationMessageUtilsService {\n  static getInitials(name: string): string {\n    const parts = name.trim().split(/\\s+/).filter(Boolean);\n    if (parts.length === 0) return '?';\n    if (parts.length === 1) return parts[0].charAt(0).toUpperCase();\n    return (parts[0].charAt(0) + parts[parts.length - 1].charAt(0)).toUpperCase();\n  }\n\n  static getMessageText(message: AXConversationMessage): string {\n    const payload = message.payload;\n    if (!payload) return '';\n\n    if (payload.type === 'text' && 'text' in payload && typeof payload.text === 'string') {\n      return payload.text;\n    }\n\n    if ('caption' in payload && typeof payload.caption === 'string') {\n      return payload.caption;\n    }\n\n    return '';\n  }\n\n  static getPreviewText(message: AXConversationMessage, maxLength?: number): { value: string; type: string; icon: string } {\n    const type = message.type;\n    let text = AXConversationMessageUtilsService.getMessageText(message);\n    if (maxLength && text.length > maxLength) {\n      text = text.substring(0, maxLength) + '...';\n    }\n\n    switch (type) {\n      case 'image':\n        return { value: text, type: 'image', icon: 'fa-light fa-image' };\n      case 'video':\n        return { value: text, type: 'video', icon: 'fa-light fa-video' };\n      case 'audio':\n      case 'voice':\n        return { value: text, type: type, icon: 'fa-light fa-microphone' };\n      case 'file':\n        return { value: text, type: 'file', icon: 'fa-light fa-file' };\n      case 'location':\n        return { value: text, type: 'location', icon: 'fa-light fa-location-dot' };\n      case 'sticker':\n        return { value: text, type: 'sticker', icon: 'fa-light fa-note-sticky' };\n      default:\n        return { value: text, type: 'text', icon: 'fa-light fa-message' };\n    }\n  }\n\n  static isOwnMessage(message: AXConversationMessage, currentUserId: string): boolean {\n    return message.senderId === currentUserId;\n  }\n\n  static getSenderName(message: AXConversationMessage, conversation: AXConversation): string {\n    const participant = conversation.participants.find((p) => p.id === message.senderId);\n    return participant?.name ?? translateSync('@acorex:chat.fallbacks.unknown-user');\n  }\n\n  static getSenderAvatar(message: AXConversationMessage, conversation: AXConversation): string | undefined {\n    return conversation.participants.find((p) => p.id === message.senderId)?.avatar;\n  }\n\n  static getSenderAvatarIcon(message: AXConversationMessage, conversation: AXConversation): string | undefined {\n    return conversation.participants.find((p) => p.id === message.senderId)?.icon;\n  }\n\n  static getConversationAvatar(conversation: AXConversation): string | undefined {\n    const avatar = conversation.avatar?.trim();\n    return avatar && avatar.length > 0 ? avatar : undefined;\n  }\n\n  static getConversationAvatarIcon(conversation: AXConversation): string | undefined {\n    const icon = conversation.icon?.trim();\n    return icon && icon.length > 0 ? icon : undefined;\n  }\n\n  static getConversationStatus(\n    conversation: AXConversation,\n    presence?: AXConversationUserPresence,\n  ): AXConversationPresenceStatus | undefined {\n    if (conversation.type !== 'private') {\n      return undefined;\n    }\n    return presence?.status;\n  }\n\n  static shouldGroupMessages(message: AXConversationMessage, previousMessage?: AXConversationMessage): boolean {\n    if (!previousMessage) return false;\n    if (message.senderId !== previousMessage.senderId) return false;\n\n    const timeDiff = message.timestamp.getTime() - previousMessage.timestamp.getTime();\n    return timeDiff < 5 * 60 * 1000;\n  }\n\n  static getUserPresenceStatus(presence?: AXConversationUserPresence): AXConversationPresenceStatus | undefined {\n    return presence?.status;\n  }\n\n  static getTypingText(conversation: AXConversation, typingUserIds: string[]): string {\n    if (typingUserIds.length === 0) return '';\n\n    if (conversation.type === 'private') {\n      return translateSync('@acorex:chat.status.typing');\n    }\n\n    const firstUser = conversation.participants.find((p) => p.id === typingUserIds[0]);\n    if (typingUserIds.length === 1) {\n      return translateSync('@acorex:chat.status.user-is-typing', {\n        params: { userName: firstUser?.name || translateSync('@acorex:chat.fallbacks.someone') },\n      });\n    }\n\n    return translateSync('@acorex:chat.status.people-typing', { params: { count: typingUserIds.length } });\n  }\n\n  static formatLastSeen(date: Date): string {\n    const now = new Date();\n    const diff = now.getTime() - date.getTime();\n    const seconds = Math.floor(diff / 1000);\n\n    if (seconds < 60) return translateSync('@acorex:chat.time.just-now');\n    if (seconds < 3600) return translateSync('@acorex:chat.time.minutes-ago', { params: { count: Math.floor(seconds / 60) } });\n    if (seconds < 86400) return translateSync('@acorex:chat.time.hours-ago', { params: { count: Math.floor(seconds / 3600) } });\n    if (seconds < 604800) return translateSync('@acorex:chat.time.days-ago', { params: { count: Math.floor(seconds / 86400) } });\n\n    return date.toLocaleDateString();\n  }\n\n  static getPrivateChatSubtitle(\n    conversation: AXConversation,\n    presence?: AXConversationUserPresence,\n    currentUserId?: string,\n  ): string {\n    const peerPresence = presence;\n\n    if (peerPresence?.status === 'online') {\n      return translateSync('@acorex:chat.status.online');\n    }\n    if (peerPresence?.lastSeen) {\n      return translateSync('@acorex:chat.status.last-seen', {\n        params: { value: AXConversationMessageUtilsService.formatLastSeen(peerPresence.lastSeen) },\n      });\n    }\n    return translateSync('@acorex:chat.status.offline');\n  }\n\n  static getConversationSubtitle(\n    conversation: AXConversation,\n    options?: {\n      typingUserIds?: string[];\n      peerPresence?: AXConversationUserPresence;\n      currentUserId?: string;\n    },\n  ): string {\n    const typingUserIds = options?.typingUserIds ?? [];\n    if (typingUserIds.length > 0) {\n      return AXConversationMessageUtilsService.getTypingText(conversation, typingUserIds);\n    }\n\n    switch (conversation.type) {\n      case 'private':\n        return AXConversationMessageUtilsService.getPrivateChatSubtitle(\n          conversation,\n          options?.peerPresence,\n          options?.currentUserId,\n        );\n\n      case 'group':\n        return translateSync('@acorex:chat.members.count', { params: { count: conversation.participants.length } });\n\n      case 'channel':\n        return translateSync('@acorex:chat.members.subscribers-count', { params: { count: conversation.participants.length } });\n\n      case 'bot':\n        return translateSync('@acorex:chat.bot');\n\n      default:\n        return '';\n    }\n  }\n}\n","import type { AXConversation, AXConversationType } from '../models/conversation.model';\nimport type { AXConversationMessage } from '../models/message.model';\nimport type { AXConversationParticipant } from '../models/participant.model';\nimport { resolveConversationTitleForViewer } from './conversation-display.utils';\nimport { AXConversationMessageUtilsService } from './message-utils.service';\n\nexport interface AXConversationAvatarDisplay {\n  name: string;\n  avatar?: string;\n  icon?: string;\n}\n\n/** Conversation types that resolve a single peer participant for viewer-scoped avatar/title. */\nexport const AX_CONVERSATION_PEER_AVATAR_TYPES: ReadonlySet<AXConversationType> = new Set([\n  'private',\n  'bot',\n]);\n\nfunction normalizeOptionalMediaValue(value: unknown): string | undefined {\n  if (typeof value !== 'string') {\n    return undefined;\n  }\n  const normalized = value.trim();\n  return normalized.length > 0 ? normalized : undefined;\n}\n\n/**\n * Other participant in a peer-scoped conversation (excludes the current viewer).\n * Applies to private 1:1 and bot assist chats with exactly one non-viewer participant.\n */\nexport function resolveConversationPeerUserId(\n  conversation: AXConversation,\n  currentUserId?: string,\n): string | undefined {\n  if (!AX_CONVERSATION_PEER_AVATAR_TYPES.has(conversation.type)) {\n    return undefined;\n  }\n\n  const currentId = currentUserId ?? 'current-user';\n  const peers = conversation.participants.filter((participant) => participant.id !== currentId);\n  if (peers.length !== 1) {\n    return undefined;\n  }\n\n  return peers[0].id;\n}\n\n/** Other participant in a private chat (excludes the current user). */\nexport function resolvePrivatePeerUserId(\n  conversation: AXConversation,\n  currentUserId?: string,\n): string | undefined {\n  if (conversation.type !== 'private') {\n    return undefined;\n  }\n\n  return resolveConversationPeerUserId(conversation, currentUserId);\n}\n\n/** Peer participant for private and bot conversations. */\nexport function resolveConversationPeerParticipant(\n  conversation: AXConversation,\n  currentUserId?: string,\n): AXConversationParticipant | undefined {\n  const peerId = resolveConversationPeerUserId(conversation, currentUserId);\n  if (!peerId) {\n    return undefined;\n  }\n\n  return conversation.participants.find((participant) => participant.id === peerId);\n}\n\n/** Whether `auto` kind should render a registered user avatar for this conversation. */\nexport function shouldUseUserAvatarForConversation(\n  conversation: AXConversation,\n  currentUserId?: string,\n): boolean {\n  return !!resolveConversationPeerUserId(conversation, currentUserId);\n}\n\nexport function resolveUserAvatarDisplay(\n  userId: string,\n  conversation: AXConversation | undefined,\n  message?: AXConversationMessage,\n): AXConversationAvatarDisplay {\n  if (message && conversation) {\n    return {\n      name: AXConversationMessageUtilsService.getSenderName(message, conversation),\n      avatar: AXConversationMessageUtilsService.getSenderAvatar(message, conversation),\n      icon: AXConversationMessageUtilsService.getSenderAvatarIcon(message, conversation),\n    };\n  }\n\n  const participant = conversation?.participants.find((p) => p.id === userId);\n  return {\n    name: participant?.name ?? userId,\n    avatar: participant?.avatar,\n    icon: participant?.icon,\n  };\n}\n\nexport function resolveConversationAvatarDisplay(\n  conversation: AXConversation,\n  currentUserId?: string,\n): AXConversationAvatarDisplay {\n  const title =\n    currentUserId !== undefined\n      ? resolveConversationTitleForViewer(conversation, currentUserId)\n      : conversation.title;\n\n  const peer = resolveConversationPeerParticipant(conversation, currentUserId);\n  const conversationAvatar = AXConversationMessageUtilsService.getConversationAvatar(conversation);\n  const conversationIcon = AXConversationMessageUtilsService.getConversationAvatarIcon(conversation);\n  const peerAvatar = normalizeOptionalMediaValue(peer?.avatar);\n  const peerIcon = normalizeOptionalMediaValue(peer?.icon);\n\n  return {\n    name: title,\n    avatar: conversationAvatar ?? peerAvatar,\n    icon: conversationIcon ?? (conversationAvatar ? undefined : peerIcon),\n  };\n}\n","import type { AXConversationMessagePayload } from '../models';\n\ntype AXConversationMediaPayloadType = 'image' | 'video' | 'audio' | 'file';\ntype AXConversationMediaNormalizer = (payload: AXConversationMessagePayload) => AXConversationMessagePayload;\n\nconst AX_CONVERSATION_MEDIA_TYPES = new Set<AXConversationMediaPayloadType>(['image', 'video', 'audio', 'file']);\n\nconst normalizers: Partial<Record<AXConversationMediaPayloadType, AXConversationMediaNormalizer>> = {};\nconst loading = new Map<AXConversationMediaPayloadType, Promise<void>>();\n\nfunction isMediaPayloadType(type: string): type is AXConversationMediaPayloadType {\n  return AX_CONVERSATION_MEDIA_TYPES.has(type as AXConversationMediaPayloadType);\n}\n\nasync function loadNormalizer(type: AXConversationMediaPayloadType): Promise<void> {\n  if (normalizers[type]) {\n    return;\n  }\n\n  const pending = loading.get(type);\n  if (pending) {\n    await pending;\n    return;\n  }\n\n  const promise = (async () => {\n    switch (type) {\n      case 'image': {\n        const mod = await import('../plugins/message-list/components/image-renderer/image.payload');\n        normalizers.image = mod.normalizeImagePayload as AXConversationMediaNormalizer;\n        break;\n      }\n      case 'video': {\n        const mod = await import('../plugins/message-list/components/video-renderer/video.payload');\n        normalizers.video = mod.normalizeVideoPayload as AXConversationMediaNormalizer;\n        break;\n      }\n      case 'audio': {\n        const mod = await import('../plugins/message-list/components/audio-renderer/audio.payload');\n        normalizers.audio = mod.normalizeAudioPayload as AXConversationMediaNormalizer;\n        break;\n      }\n      case 'file': {\n        const mod = await import('../plugins/message-list/components/file-renderer/file.payload');\n        normalizers.file = mod.normalizeFilePayload as AXConversationMediaNormalizer;\n        break;\n      }\n    }\n  })();\n\n  loading.set(type, promise);\n  await promise;\n}\n\n/** Normalize payload; loads media normalizers on demand. */\nexport async function normalizeMessagePayloadAsync(payload: AXConversationMessagePayload): Promise<AXConversationMessagePayload> {\n  if (!isMediaPayloadType(payload.type)) {\n    return payload;\n  }\n  await loadNormalizer(payload.type);\n  const normalize = normalizers[payload.type];\n  return normalize ? normalize(payload) : payload;\n}\n\n/**\n * Sync normalize — uses cached normalizers when available.\n * Media payloads pass through until a normalizer chunk has loaded (renderers normalize on display).\n */\nexport function normalizeMessagePayload(payload: AXConversationMessagePayload): AXConversationMessagePayload {\n  if (!isMediaPayloadType(payload.type)) {\n    return payload;\n  }\n  const normalize = normalizers[payload.type];\n  if (normalize) {\n    return normalize(payload);\n  }\n  void loadNormalizer(payload.type);\n  return payload;\n}\n","/**\n * Validation Utilities\n * Centralized validation functions for messages and user input\n */\n\nimport type { AXConversationMessagePayload, AXConversationMessageType } from '../models';\nimport type { AXConversationConfig } from '../tokens';\nimport { normalizeMessagePayloadAsync } from '../utils/message-payload-normalize';\n\n/**\n * Validation result interface\n */\nexport interface AXConversationValidationResult {\n  /** Whether validation passed */\n  valid: boolean;\n  /** Error message if validation failed */\n  error?: string;\n  /** Error code for programmatic handling */\n  errorCode?: string;\n}\n\n/**\n * Validate message text content\n * @param text - Text to validate\n * @param config - Configuration for validation rules\n * @returns Validation result\n */\nexport function validateMessageText(text: string | undefined, config: AXConversationConfig): AXConversationValidationResult {\n  // Check for empty text\n  if (!text || text.trim().length === 0) {\n    return {\n      valid: false,\n      error: 'Message text cannot be empty',\n      errorCode: 'EMPTY_MESSAGE',\n    };\n  }\n\n  // Check minimum length\n  const minLength = config.minMessageLength ?? 1;\n  if (text.trim().length < minLength) {\n    return {\n      valid: false,\n      error: `Message must be at least ${minLength} character(s)`,\n      errorCode: 'MESSAGE_TOO_SHORT',\n    };\n  }\n\n  // Check maximum length\n  const maxLength = config.maxMessageLength ?? 10000;\n  if (text.length > maxLength) {\n    return {\n      valid: false,\n      error: `Message exceeds ${maxLength} character limit`,\n      errorCode: 'MESSAGE_TOO_LONG',\n    };\n  }\n\n  return { valid: true };\n}\n\n/**\n * Validate conversation ID\n * @param conversationId - Conversation ID to validate\n * @returns Validation result\n */\nexport function validateConversationId(conversationId: string | undefined): AXConversationValidationResult {\n  if (!conversationId || typeof conversationId !== 'string' || conversationId.trim().length === 0) {\n    return {\n      valid: false,\n      error: 'Conversation ID is required',\n      errorCode: 'MISSING_CONVERSATION_ID',\n    };\n  }\n\n  // Check for reasonable length\n  if (conversationId.length > 255) {\n    return {\n      valid: false,\n      error: 'Conversation ID is too long',\n      errorCode: 'MISSING_CONVERSATION_ID',\n    };\n  }\n\n  return { valid: true };\n}\n\n/**\n * Validate message type\n * @param type - Message type to validate\n * @returns Validation result\n */\nexport function validateMessageType(type: AXConversationMessageType | undefined): AXConversationValidationResult {\n  if (!type || type.trim().length === 0) {\n    return {\n      valid: false,\n      error: 'Message type is required',\n      errorCode: 'MISSING_MESSAGE_TYPE',\n    };\n  }\n\n  return { valid: true };\n}\n\nfunction validateMediaItems(\n  items: { url?: string; mediaId?: string }[] | undefined,\n  label: string,\n): AXConversationValidationResult {\n  if (!Array.isArray(items) || items.length === 0) {\n    return {\n      valid: false,\n      error: `${label} message must include at least one attachment`,\n      errorCode: 'INVALID_MEDIA_PAYLOAD',\n    };\n  }\n  for (const item of items) {\n    const ok =\n      (typeof item.url === 'string' && item.url.length > 0) ||\n      (typeof item.mediaId === 'string' && item.mediaId.length > 0);\n    if (!ok) {\n      return {\n        valid: false,\n        error: `Each ${label.toLowerCase()} attachment must have a url or mediaId`,\n        errorCode: 'INVALID_MEDIA_PAYLOAD',\n      };\n    }\n  }\n  return { valid: true };\n}\n\n/**\n * Validate message payload\n * @param payload - Message payload to validate\n * @param type - Message type\n * @returns Validation result\n */\nexport async function validateMessagePayload(\n  payload: AXConversationMessagePayload | undefined,\n  type: AXConversationMessageType,\n): Promise<AXConversationValidationResult> {\n  if (!payload) {\n    return {\n      valid: false,\n      error: 'Message payload is required',\n      errorCode: 'MISSING_PAYLOAD',\n    };\n  }\n\n  const normalized =\n    type === 'image' || type === 'video' || type === 'audio' || type === 'file'\n      ? await normalizeMessagePayloadAsync(payload)\n      : payload;\n\n  // Type-specific validation\n  switch (type) {\n    case 'text':\n      if (!('text' in payload) || typeof payload.text !== 'string') {\n        return {\n          valid: false,\n          error: 'Text message must have a text property',\n          errorCode: 'INVALID_TEXT_PAYLOAD',\n        };\n      }\n      break;\n\n    case 'image':\n      return validateMediaItems(\n        (normalized as { images?: { url?: string; mediaId?: string }[] }).images,\n        'Image',\n      );\n    case 'video':\n      return validateMediaItems(\n        (normalized as { videos?: { url?: string; mediaId?: string }[] }).videos,\n        'Video',\n      );\n    case 'audio':\n      return validateMediaItems(\n        (normalized as { audios?: { url?: string; mediaId?: string }[] }).audios,\n        'Audio',\n      );\n    case 'file':\n      return validateMediaItems(\n        (normalized as { files?: { url?: string; mediaId?: string }[] }).files,\n        'File',\n      );\n    case 'voice':\n    case 'sticker': {\n      const media = payload as { url?: string; mediaId?: string };\n      const hasUrl = typeof media.url === 'string' && media.url.length > 0;\n      const hasMediaId = typeof media.mediaId === 'string' && media.mediaId.length > 0;\n      if (!hasUrl && !hasMediaId) {\n        return {\n          valid: false,\n          error: `${type} message must have a url or mediaId`,\n          errorCode: 'INVALID_MEDIA_PAYLOAD',\n        };\n      }\n      break;\n    }\n\n    case 'location':\n      if (\n        !('latitude' in payload) ||\n        !('longitude' in payload) ||\n        typeof payload.latitude !== 'number' ||\n        typeof payload.longitude !== 'number'\n      ) {\n        return {\n          valid: false,\n          error: 'Location message must have latitude and longitude properties',\n          errorCode: 'INVALID_LOCATION_PAYLOAD',\n        };\n      }\n      break;\n  }\n\n  return { valid: true };\n}\n\n/**\n * Validate user ID\n * @param userId - User ID to validate\n * @returns Validation result\n */\nexport function validateUserId(userId: string | undefined): AXConversationValidationResult {\n  if (!userId || typeof userId !== 'string' || userId.trim().length === 0) {\n    return {\n      valid: false,\n      error: 'User ID is required',\n      errorCode: 'MISSING_USER_ID',\n    };\n  }\n\n  // Check for reasonable length (prevent extremely long IDs)\n  if (userId.length > 255) {\n    return {\n      valid: false,\n      error: 'User ID is too long',\n      errorCode: 'INVALID_USER_ID',\n    };\n  }\n\n  return { valid: true };\n}\n\n/**\n * Validate array of user IDs\n * @param userIds - Array of user IDs to validate\n * @param minCount - Minimum number of users required\n * @param maxCount - Maximum number of users allowed\n * @returns Validation result\n */\nexport function validateUserIds(userIds: string[] | undefined, minCount = 1, maxCount?: number): AXConversationValidationResult {\n  if (!userIds || !Array.isArray(userIds)) {\n    return {\n      valid: false,\n      error: 'User IDs must be an array',\n      errorCode: 'INVALID_USER_IDS',\n    };\n  }\n\n  if (userIds.length < minCount) {\n    return {\n      valid: false,\n      error: `At least ${minCount} user(s) required`,\n      errorCode: 'TOO_FEW_USERS',\n    };\n  }\n\n  if (maxCount && userIds.length > maxCount) {\n    return {\n      valid: false,\n      error: `Maximum ${maxCount} user(s) allowed`,\n      errorCode: 'TOO_MANY_USERS',\n    };\n  }\n\n  // Check for empty or invalid IDs\n  const invalidIds = userIds.filter((id) => !id || id.trim().length === 0);\n  if (invalidIds.length > 0) {\n    return {\n      valid: false,\n      error: 'All user IDs must be non-empty strings',\n      errorCode: 'INVALID_USER_ID',\n    };\n  }\n\n  return { valid: true };\n}\n\n/**\n * Validate email address\n * @param email - Email to validate\n * @returns Validation result\n */\nexport function validateEmail(email: string | undefined): AXConversationValidationResult {\n  if (!email || email.trim().length === 0) {\n    return {\n      valid: false,\n      error: 'Email is required',\n      errorCode: 'MISSING_EMAIL',\n    };\n  }\n\n  // Trim whitespace\n  const trimmedEmail = email.trim();\n\n  // Check length constraints\n  if (trimmedEmail.length > 254) {\n    return {\n      valid: false,\n      error: 'Email is too long',\n      errorCode: 'INVALID_EMAIL',\n    };\n  }\n\n  // Enhanced email regex with better validation\n  const emailRegex =\n    /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;\n  if (!emailRegex.test(trimmedEmail)) {\n    return {\n      valid: false,\n      error: 'Invalid email format',\n      errorCode: 'INVALID_EMAIL',\n    };\n  }\n\n  return { valid: true };\n}\n\n/**\n * Validate URL\n * @param url - URL to validate\n * @returns Validation result\n */\nexport function validateUrl(url: string | undefined): AXConversationValidationResult {\n  if (!url || url.trim().length === 0) {\n    return {\n      valid: false,\n      error: 'URL is required',\n      errorCode: 'MISSING_URL',\n    };\n  }\n\n  const trimmedUrl = url.trim();\n\n  // Check for common URL issues\n  if (trimmedUrl.length > 2048) {\n    return {\n      valid: false,\n      error: 'URL is too long',\n      errorCode: 'INVALID_URL',\n    };\n  }\n\n  try {\n    const urlObj = new URL(trimmedUrl);\n\n    // Validate protocol\n    if (!['http:', 'https:', 'ftp:', 'ftps:'].includes(urlObj.protocol)) {\n      return {\n        valid: false,\n        error: 'Invalid URL protocol',\n        errorCode: 'INVALID_URL',\n      };\n    }\n\n    return { valid: true };\n  } catch {\n    return {\n      valid: false,\n      error: 'Invalid URL format',\n      errorCode: 'INVALID_URL',\n    };\n  }\n}\n\n// =====================\n// Helper Functions\n// =====================\n\n/**\n * Sanitize user input to prevent XSS\n * Note: Angular provides built-in sanitization, but this is an additional layer\n * @param input - User input to sanitize\n * @returns Sanitized input\n */\nexport function sanitizeInput(input: string): string {\n  if (!input) return '';\n\n  return input\n    .replace(/&/g, '&amp;')\n    .replace(/</g, '&lt;')\n    .replace(/>/g, '&gt;')\n    .replace(/\"/g, '&quot;')\n    .replace(/'/g, '&#x27;')\n    .replace(/\\//g, '&#x2F;')\n    .replace(/`/g, '&#x60;')\n    .replace(/=/g, '&#x3D;');\n}\n\n/**\n * Validate latitude coordinate\n * @param latitude - Latitude to validate\n * @returns Validation result\n */\nexport function validateLatitude(latitude: number | undefined | null): AXConversationValidationResult {\n  if (latitude === undefined || latitude === null || typeof latitude !== 'number' || isNaN(latitude)) {\n    return {\n      valid: false,\n      error: 'Latitude is required',\n      errorCode: 'MISSING_LATITUDE',\n    };\n  }\n\n  if (latitude < -90 || latitude > 90) {\n    return {\n      valid: false,\n      error: 'Latitude must be between -90 and 90',\n      errorCode: 'INVALID_LATITUDE',\n    };\n  }\n\n  return { valid: true };\n}\n\n/**\n * Validate longitude coordinate\n * @param longitude - Longitude to validate\n * @returns Validation result\n */\nexport function validateLongitude(longitude: number | undefined | null): AXConversationValidationResult {\n  if (longitude === undefined || longitude === null || typeof longitude !== 'number' || isNaN(longitude)) {\n    return {\n      valid: false,\n      error: 'Longitude is required',\n      errorCode: 'MISSING_LONGITUDE',\n    };\n  }\n\n  if (longitude < -180 || longitude > 180) {\n    return {\n      valid: false,\n      error: 'Longitude must be between -180 and 180',\n      errorCode: 'INVALID_LONGITUDE',\n    };\n  }\n\n  return { valid: true };\n}\n","import type { AXUploadResult } from '@acorex/cdk/uploader';\nimport type { AXFileService } from '@acorex/core/file';\nimport type { AXConversationMessagePayload, AXConversationMessageType } from '../models';\nimport type { AXConversationUploaderReference } from '../models/conversation-upload.types';\n\ntype AXConversationSendMessageMediaModule = typeof import('../plugins/composer/composer-actions/send-message-media');\n\nlet modulePromise: Promise<AXConversationSendMessageMediaModule> | null = null;\n\nfunction loadSendMessageMedia(): Promise<AXConversationSendMessageMediaModule> {\n  modulePromise ??= import('../plugins/composer/composer-actions/send-message-media');\n  return modulePromise;\n}\n\nexport async function applyLocalPreview(\n  type: AXConversationMessageType,\n  payload: AXConversationMessagePayload,\n  localUrl: string,\n  mimeType = 'application/octet-stream',\n): Promise<AXConversationMessagePayload> {\n  const mod = await loadSendMessageMedia();\n  return mod.applyLocalPreview(type, payload, localUrl, mimeType);\n}\n\nexport async function createLocalPreviewUrl(\n  fileService: AXFileService,\n  platformId: object,\n  source: File | Blob,\n  messageType: AXConversationMessageType,\n): Promise<string | undefined> {\n  const mod = await loadSendMessageMedia();\n  return mod.createLocalPreviewUrl(fileService, platformId, source, messageType);\n}\n\nexport async function mergeUploadResult(\n  type: AXConversationMessageType,\n  payload: AXConversationMessagePayload,\n  result: AXUploadResult,\n): Promise<AXConversationMessagePayload> {\n  const mod = await loadSendMessageMedia();\n  return mod.mergeUploadResult(type, payload, result);\n}\n\nexport async function revokeObjectUrl(platformId: object, url: string): Promise<void> {\n  const mod = await loadSendMessageMedia();\n  mod.revokeObjectUrl(platformId, url);\n}\n\nexport async function toUploaderReference(payload: AXConversationMessagePayload): Promise<AXConversationUploaderReference> {\n  const mod = await loadSendMessageMedia();\n  return mod.toUploaderReference(payload);\n}\n","/**\n * Per-user preferences for a specific conversation (mute, notifications, etc.).\n * Stored on the user account, keyed by conversation ID — not on the room entity.\n */\n\nexport interface AXConversationRoomPreferences {\n  /** Muted until timestamp */\n  mutedUntil?: Date;\n\n  /** Show notifications for this conversation */\n  notifications: boolean;\n\n  /** Custom notification sound */\n  notificationSound?: string;\n\n  /** Show message preview in notifications */\n  showPreview: boolean;\n\n  /** Custom settings */\n  custom?: Record<string, unknown>;\n}\n\nexport const AX_CONVERSATION_DEFAULT_ROOM_PREFERENCES: AXConversationRoomPreferences = {\n  notifications: true,\n  showPreview: true,\n};\n\n/** Map of conversation ID → user-specific room preferences. */\nexport type AXConversationRoomPreferencesMap = Record<string, AXConversationRoomPreferences>;\n","import type { AXConversationRoomPreferences } from '../models';\nimport { AX_CONVERSATION_DEFAULT_ROOM_PREFERENCES } from '../models/room-preferences.model';\n\nexport function mergeRoomPreferences(\n  preferences?: Partial<AXConversationRoomPreferences> | null,\n): AXConversationRoomPreferences {\n  return {\n    ...AX_CONVERSATION_DEFAULT_ROOM_PREFERENCES,\n    ...preferences,\n    notifications: preferences?.notifications ?? AX_CONVERSATION_DEFAULT_ROOM_PREFERENCES.notifications,\n    showPreview: preferences?.showPreview ?? AX_CONVERSATION_DEFAULT_ROOM_PREFERENCES.showPreview,\n  };\n}\n","/**\n * In-memory conversation and message graph (signal-based).\n * Plain class — not DI-registered; instantiated by `AXConversationService`.\n */\n\nimport { computed, signal } from '@angular/core';\nimport type {\n  AXConversation,\n  AXConversationMessage,\n  AXConversationPresenceUpdate,\n  AXConversationRoomPreferences,\n  AXConversationRoomPreferencesMap,\n  AXConversationUserPresence,\n} from '../models';\nimport { AX_CONVERSATION_DEFAULT_ROOM_PREFERENCES } from '../models/room-preferences.model';\nimport { normalizeMessagePayload } from '../utils/message-payload-normalize';\nimport { mergeRoomPreferences } from '../utils/room-preferences.utils';\nimport type { AXConversationConfig } from '../tokens';\n\nfunction withNormalizedPayload(message: AXConversationMessage): AXConversationMessage {\n  const timestamp =\n    message.timestamp instanceof Date ? message.timestamp : new Date(message.timestamp as string | number);\n  return { ...message, timestamp, payload: normalizeMessagePayload(message.payload) };\n}\n\nexport class AXConversationState {\n  private readonly _conversations = signal<Map<string, AXConversation>>(new Map());\n  private readonly _messages = signal<Map<string, AXConversationMessage>>(new Map());\n  private readonly _conversationMessages = signal<Map<string, string[]>>(new Map());\n  private readonly _userPresence = signal<Map<string, AXConversationUserPresence>>(new Map());\n  private readonly _typingExpiry = signal<Map<string, Map<string, number>>>(new Map());\n  private readonly _roomPreferences = signal<Map<string, AXConversationRoomPreferences>>(new Map());\n  private readonly _presenceTimeTick = signal(0);\n  private readonly _typingRevision = signal(0);\n  private readonly _inboxRevision = signal(0);\n\n  readonly conversations = computed(() => {\n    this._inboxRevision();\n    return Array.from(this._conversations().values());\n  });\n\n  readonly userPresenceMap = computed(() => this._userPresence());\n\n  readonly presenceTimeTick = this._presenceTimeTick.asReadonly();\n\n  readonly typingRevision = computed(() => {\n    this._typingRevision();\n    return this._typingExpiry();\n  });\n\n  private bumpInboxRevision(): void {\n    this._inboxRevision.update((revision) => revision + 1);\n  }\n\n  private bumpTypingRevision(): void {\n    this._typingRevision.update((revision) => revision + 1);\n  }\n\n  constructor(private readonly config: Required<AXConversationConfig>) {}\n\n  bumpPresenceTimeTick(): void {\n    this._presenceTimeTick.update((tick) => tick + 1);\n  }\n\n  setConversations(conversations: AXConversation[]): void {\n    const convMap = new Map<string, AXConversation>();\n    conversations.forEach((conv) => convMap.set(conv.id, conv));\n    this._conversations.set(convMap);\n    this.bumpInboxRevision();\n  }\n\n  addConversations(conversations: AXConversation[]): void {\n    this._conversations.update((existingConversations) => {\n      const newConversations = new Map(existingConversations);\n      conversations.forEach((conv) => newConversations.set(conv.id, conv));\n\n      const maxCached = this.config.maxCachedConversations;\n      if (newConversations.size > maxCached) {\n        const sorted = Array.from(newConversations.values()).sort(\n          (a, b) => (b.lastMessageAt?.getTime() ?? 0) - (a.lastMessageAt?.getTime() ?? 0),\n        );\n        const toKeep = sorted.slice(0, maxCached);\n        const cleanedMap = new Map<string, AXConversation>();\n        toKeep.forEach((conv) => cleanedMap.set(conv.id, conv));\n        return cleanedMap;\n      }\n\n      return newConversations;\n    });\n    this.bumpInboxRevision();\n  }\n\n  setConversation(conversation: AXConversation): void {\n    this._conversations.update((conversations) => {\n      const newConversations = new Map(conversations);\n      newConversations.set(conversation.id, conversation);\n      return newConversations;\n    });\n    this.bumpInboxRevision();\n  }\n\n  getConversation(conversationId: string): AXConversation | undefined {\n    return this._conversations().get(conversationId);\n  }\n\n  updateConversation(conversationId: string, updates: Partial<AXConversation>): void {\n    const conversation = this._conversations().get(conversationId);\n    if (!conversation) return;\n\n    this.setConversation({ ...conversation, ...updates });\n  }\n\n  deleteConversation(conversationId: string): void {\n    this._conversations.update((conversations) => {\n      const newConversations = new Map(conversations);\n      newConversations.delete(conversationId);\n      return newConversations;\n    });\n    this.bumpInboxRevision();\n\n    const messageIds = this._conversationMessages().get(conversationId) || [];\n    this._messages.update((messages) => {\n      const newMessages = new Map(messages);\n      messageIds.forEach((id) => newMessages.delete(id));\n      return newMessages;\n    });\n\n    this._conversationMessages.update((map) => {\n      const newMap = new Map(map);\n      newMap.delete(conversationId);\n      return newMap;\n    });\n\n    this._typingExpiry.update((map) => {\n      const next = new Map(map);\n      next.delete(conversationId);\n      return next;\n    });\n    this.bumpTypingRevision();\n  }\n\n  updateLastMessage(message: AXConversationMessage): void {\n    this.updateConversation(message.conversationId, {\n      lastMessage: message,\n      lastMessageAt: message.timestamp,\n      updatedAt: message.timestamp,\n    });\n  }\n\n  incrementUnreadCount(conversationId: string): void {\n    const conversation = this._conversations().get(conversationId);\n    if (!conversation) return;\n    this.updateConversation(conversationId, { unreadCount: conversation.unreadCount + 1 });\n  }\n\n  resetUnreadCount(conversationId: string): void {\n    this.updateConversation(conversationId, { unreadCount: 0 });\n  }\n\n  updateTitle(conversationId: string, title: string): void {\n    this.updateConversation(conversationId, { title, updatedAt: new Date() });\n  }\n\n  updateMetadata(conversationId: string, metadata: Record<string, unknown>): void {\n    const conversation = this._conversations().get(conversationId);\n    if (!conversation) return;\n\n    this.updateConversation(conversationId, {\n      metadata: { ...conversation.metadata, ...metadata },\n      updatedAt: new Date(),\n    });\n  }\n\n  updateUserPresence(update: AXConversationPresenceUpdate): void {\n    const lastSeen =\n      update.lastSeen instanceof Date\n        ? update.lastSeen\n        : update.lastSeen\n          ? new Date(update.lastSeen as string | number)\n          : undefined;\n\n    this._userPresence.update((map) => {\n      const next = new Map(map);\n      next.set(update.userId, {\n        userId: update.userId,\n        status: update.status,\n        lastSeen,\n        statusText: update.statusText,\n        updatedAt: new Date(),\n      });\n      return next;\n    });\n  }\n\n  bulkSetUserPresence(updates: AXConversationPresenceUpdate[]): void {\n    if (updates.length === 0) return;\n\n    this._userPresence.update((map) => {\n      const next = new Map(map);\n      for (const update of updates) {\n        const lastSeen =\n          update.lastSeen instanceof Date\n            ? update.lastSeen\n            : update.lastSeen\n              ? new Date(update.lastSeen as string | number)\n              : undefined;\n        next.set(update.userId, {\n          userId: update.userId,\n          status: update.status,\n          lastSeen,\n          statusText: update.statusText,\n          updatedAt: new Date(),\n        });\n      }\n      return next;\n    });\n  }\n\n  getUserPresence(userId: string): AXConversationUserPresence | undefined {\n    return this._userPresence().get(userId);\n  }\n\n  setTypingActive(conversationId: string, userId: string, displayDurationMs: number): void {\n    const expiresAt = Date.now() + displayDurationMs;\n\n    this._typingExpiry.update((map) => {\n      const next = new Map(map);\n      const room = new Map(next.get(conversationId) ?? []);\n      room.set(userId, expiresAt);\n      next.set(conversationId, room);\n      return next;\n    });\n    this.bumpTypingRevision();\n  }\n\n  clearTypingUser(conversationId: string, userId: string): void {\n    this._typingExpiry.update((map) => {\n      const room = map.get(conversationId);\n      if (!room?.has(userId)) {\n        return map;\n      }\n      const next = new Map(map);\n      const nextRoom = new Map(room);\n      nextRoom.delete(userId);\n      if (nextRoom.size === 0) {\n        next.delete(conversationId);\n      } else {\n        next.set(conversationId, nextRoom);\n      }\n      return next;\n    });\n    this.bumpTypingRevision();\n  }\n\n  getActiveTypingUserIds(conversationId: string): string[] {\n    const now = Date.now();\n    const room = this._typingExpiry().get(conversationId);\n    if (!room) return [];\n\n    const active: string[] = [];\n    for (const [userId, expiresAt] of room) {\n      if (expiresAt > now) {\n        active.push(userId);\n      }\n    }\n    return active;\n  }\n\n  isAnyoneTyping(conversationId: string): boolean {\n    return this.getActiveTypingUserIds(conversationId).length > 0;\n  }\n\n  pruneExpiredTyping(): void {\n    const now = Date.now();\n    let changed = false;\n\n    this._typingExpiry.update((map) => {\n      const next = new Map<string, Map<string, number>>();\n      for (const [conversationId, room] of map) {\n        const activeRoom = new Map<string, number>();\n        for (const [userId, expiresAt] of room) {\n          if (expiresAt > now) {\n            activeRoom.set(userId, expiresAt);\n          } else {\n            changed = true;\n          }\n        }\n        if (activeRoom.size > 0) {\n          next.set(conversationId, activeRoom);\n        } else if (room.size > 0) {\n          changed = true;\n        }\n      }\n      return changed ? next : map;\n    });\n\n    if (changed) {\n      this.bumpTypingRevision();\n    }\n  }\n\n  setRoomPreferencesBulk(preferences: AXConversationRoomPreferencesMap): void {\n    this._roomPreferences.update(() => {\n      const next = new Map<string, AXConversationRoomPreferences>();\n      for (const [conversationId, prefs] of Object.entries(preferences)) {\n        next.set(conversationId, mergeRoomPreferences(prefs));\n      }\n      return next;\n    });\n  }\n\n  getRoomPreferences(conversationId: string): AXConversationRoomPreferences {\n    return this._roomPreferences().get(conversationId) ?? { ...AX_CONVERSATION_DEFAULT_ROOM_PREFERENCES };\n  }\n\n  updateRoomPreferences(conversationId: string, updates: Partial<AXConversationRoomPreferences>): void {\n    this._roomPreferences.update((map) => {\n      const next = new Map(map);\n      const current = next.get(conversationId) ?? { ...AX_CONVERSATION_DEFAULT_ROOM_PREFERENCES };\n      next.set(conversationId, mergeRoomPreferences({ ...current, ...updates }));\n      return next;\n    });\n  }\n\n  addMessage(message: AXConversationMessage): void {\n    const normalized = withNormalizedPayload(message);\n\n    this._messages.update((messages) => {\n      const newMessages = new Map(messages);\n      newMessages.set(normalized.id, normalized);\n      return newMessages;\n    });\n\n    this._conversationMessages.update((map) => {\n      const newMap = new Map(map);\n      const existing = newMap.get(normalized.conversationId) || [];\n\n      if (existing.includes(normalized.id)) {\n        return newMap;\n      }\n\n      const updated = [...existing, normalized.id].sort((a, b) => {\n        const msgA = this._messages().get(a);\n        const msgB = this._messages().get(b);\n        if (!msgA || !msgB) return 0;\n        return msgA.timestamp.getTime() - msgB.timestamp.getTime();\n      });\n      newMap.set(normalized.conversationId, updated);\n      return newMap;\n    });\n  }\n\n  setConversationMessages(conversationId: string, messages: AXConversationMessage[]): void {\n    const sorted = [...messages]\n      .map(withNormalizedPayload)\n      .sort((a, b) => a.timestamp.getTime() - b.timestamp.getTime());\n    const sortedIds = sorted.map((m) => m.id);\n\n    this._messages.update((msgs) => {\n      const newMessages = new Map(msgs);\n      const previousIds = this._conversationMessages().get(conversationId) || [];\n      for (const id of previousIds) {\n        newMessages.delete(id);\n      }\n      for (const msg of sorted) {\n        newMessages.set(msg.id, msg);\n      }\n      return newMessages;\n    });\n\n    this._conversationMessages.update((map) => {\n      const newMap = new Map(map);\n      newMap.set(conversationId, sortedIds);\n      return newMap;\n    });\n\n    this.cleanupOldMessages();\n  }\n\n  addMessages(messages: AXConversationMessage[]): void {\n    if (messages.length === 0) return;\n\n    const normalized = messages.map(withNormalizedPayload);\n\n    this._messages.update((msgs) => {\n      const newMessages = new Map(msgs);\n      normalized.forEach((msg) => newMessages.set(msg.id, msg));\n      return newMessages;\n    });\n\n    const conversationGroups = new Map<string, string[]>();\n    normalized.forEach((msg) => {\n      const existing = conversationGroups.get(msg.conversationId) || [];\n      existing.push(msg.id);\n      conversationGroups.set(msg.conversationId, existing);\n    });\n\n    this._conversationMessages.update((map) => {\n      const newMap = new Map(map);\n\n      for (const [conversationId, newMsgIds] of conversationGroups) {\n        const existing = newMap.get(conversationId) || [];\n        const idSet = new Set(existing);\n        const merged = [...existing];\n        for (const id of newMsgIds) {\n          if (!idSet.has(id)) {\n            merged.push(id);\n            idSet.add(id);\n          }\n        }\n\n        const sorted = merged.sort((a, b) => {\n          const msgA = this._messages().get(a);\n          const msgB = this._messages().get(b);\n          if (!msgA || !msgB) return 0;\n          return msgA.timestamp.getTime() - msgB.timestamp.getTime();\n        });\n\n        newMap.set(conversationId, sorted);\n      }\n\n      return newMap;\n    });\n\n    this.cleanupOldMessages();\n    this.cleanupConversationMessages();\n  }\n\n  getMessage(messageId: string): AXConversationMessage | undefined {\n    return this._messages().get(messageId);\n  }\n\n  getConversationMessages(conversationId: string): AXConversationMessage[] {\n    const messageIds = this._conversationMessages().get(conversationId) || [];\n    return messageIds.map((id) => this._messages().get(id)).filter((msg): msg is AXConversationMessage => msg !== undefined);\n  }\n\n  updateMessage(messageId: string, updates: Partial<AXConversationMessage>): void {\n    const message = this._messages().get(messageId);\n    if (!message) return;\n\n    const merged = { ...message, ...updates };\n    if (updates.payload) {\n      merged.payload = normalizeMessagePayload(merged.payload);\n    }\n    this.addMessage(merged);\n  }\n\n  deleteMessage(messageId: string): void {\n    const message = this._messages().get(messageId);\n    if (!message) return;\n\n    this._messages.update((messages) => {\n      const newMessages = new Map(messages);\n      newMessages.delete(messageId);\n      return newMessages;\n    });\n\n    this._conversationMessages.update((map) => {\n      const newMap = new Map(map);\n      const existing = newMap.get(message.conversationId);\n      if (existing) {\n        newMap.set(\n          message.conversationId,\n          existing.filter((id) => id !== messageId),\n        );\n      }\n      return newMap;\n    });\n  }\n\n  private cleanupOldMessages(): void {\n    const totalMessages = this._messages().size;\n\n    if (totalMessages > this.config.maxTotalMessages) {\n      const allMessages = Array.from(this._messages().values()).sort(\n        (a, b) => b.timestamp.getTime() - a.timestamp.getTime(),\n      );\n\n      const toKeep = allMessages.slice(0, this.config.maxTotalMessages);\n      const toKeepIds = new Set(toKeep.map((m) => m.id));\n\n      this._messages.update(() => {\n        const newMessages = new Map<string, AXConversationMessage>();\n        toKeep.forEach((msg) => newMessages.set(msg.id, msg));\n        return newMessages;\n      });\n\n      this._conversationMessages.update((map) => {\n        const newMap = new Map(map);\n        for (const [convId, messageIds] of newMap) {\n          const filteredIds = messageIds.filter((id) => toKeepIds.has(id));\n          newMap.set(convId, filteredIds);\n        }\n        return newMap;\n      });\n    }\n  }\n\n  private cleanupConversationMessages(): void {\n    const maxMessages = this.config.maxMessagesPerConversation;\n    const idsToRemove: string[] = [];\n\n    this._conversationMessages.update((map) => {\n      const newMap = new Map(map);\n\n      for (const [convId, messageIds] of newMap) {\n        if (messageIds.length > maxMessages) {\n          idsToRemove.push(...messageIds.slice(0, messageIds.length - maxMessages));\n          newMap.set(convId, messageIds.slice(-maxMessages));\n        }\n      }\n\n      return newMap;\n    });\n\n    if (idsToRemove.length > 0) {\n      this._messages.update((messages) => {\n        const newMessages = new Map(messages);\n        idsToRemove.forEach((id) => newMessages.delete(id));\n        return newMessages;\n      });\n    }\n  }\n}\n","/**\n * Error Handler Service\n * Centralized error handling and logging\n */\n\nimport { inject, Injectable } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { AX_CONVERSATION_ERROR_HANDLER_CONFIG } from '../tokens';\nimport { AXConversationApiError } from './api';\n\n/**\n * Error severity levels\n */\nexport type AXConversationErrorSeverity = 'info' | 'warning' | 'error' | 'critical';\n\n/**\n * Conversation error event\n */\nexport interface AXConversationError {\n  /** Error code */\n  code: string;\n\n  /** Error message */\n  message: string;\n\n  /** Severity level */\n  severity: AXConversationErrorSeverity;\n\n  /** Source operation */\n  operation: string;\n\n  /** Original error */\n  originalError?: unknown;\n\n  /** HTTP status code (if applicable) */\n  statusCode?: number;\n\n  /** Additional context */\n  context?: Record<string, unknown>;\n\n  /** Timestamp */\n  timestamp: Date;\n\n  /** Whether error was handled */\n  handled: boolean;\n\n  /** Recovery suggestions */\n  recoverySuggestions?: string[];\n}\n\n/**\n * Error Handler Configuration\n */\nexport interface AXConversationErrorHandlerConfig {\n  /** Log errors to console */\n  logToConsole?: boolean;\n\n  /** Show user-friendly error messages */\n  showUserMessages?: boolean;\n\n  /** Retry failed operations automatically */\n  autoRetry?: boolean;\n\n  /** Number of retry attempts */\n  maxRetries?: number;\n\n  /** Custom error handler */\n  customHandler?: (error: AXConversationError) => void;\n}\n\n/**\n * Error Handler Service\n */\n@Injectable({\n  providedIn: 'root',\n})\nexport class AXConversationErrorHandlerService {\n  private readonly injectedConfig = inject(AX_CONVERSATION_ERROR_HANDLER_CONFIG);\n  private readonly _errors$ = new Subject<AXConversationError>();\n  private readonly _config: AXConversationErrorHandlerConfig = {\n    logToConsole: true,\n    showUserMessages: true,\n    autoRetry: false,\n    maxRetries: 3,\n  };\n\n  /** Error stream */\n  readonly errors$ = this._errors$.asObservable();\n\n  constructor() {\n    this.configure(this.injectedConfig);\n  }\n\n  /**\n   * Configure error handler\n   */\n  configure(config: Partial<AXConversationErrorHandlerConfig>): void {\n    Object.assign(this._config, config);\n  }\n\n  /**\n   * Handle an error\n   */\n  handle(error: unknown, operation: string, context?: Record<string, unknown>): AXConversationError {\n    const conversationError = this.normalizeError(error, operation, context);\n    this.publish(conversationError);\n    return conversationError;\n  }\n\n  /**\n   * Handle API error (same pipeline as {@link handle}, for typed API failures)\n   */\n  handleApiError(apiError: AXConversationApiError, operation: string, context?: Record<string, unknown>): AXConversationError {\n    const conversationError = this.conversationErrorFromApi(apiError, operation, context);\n    this.publish(conversationError);\n    return conversationError;\n  }\n\n  private publish(conversationError: AXConversationError): void {\n    this._errors$.next(conversationError);\n    if (this._config.logToConsole) {\n      this.logError(conversationError);\n    }\n    if (this._config.customHandler) {\n      this._config.customHandler(conversationError);\n    }\n  }\n\n  /**\n   * Normalize any error to conversation error format (does not publish — use {@link handle})\n   */\n  private normalizeError(error: unknown, operation: string, context?: Record<string, unknown>): AXConversationError {\n    if (this.isApiError(error)) {\n      return this.conversationErrorFromApi(error, operation, context);\n    }\n\n    const errorObj = error as Record<string, unknown>;\n    const message =\n      (typeof errorObj['message'] === 'string' && errorObj['message']) ||\n      (error instanceof Error ? error.message : String(error)) ||\n      'An unknown error occurred';\n    const code = (typeof errorObj['code'] === 'string' && errorObj['code']) || 'UNKNOWN_ERROR';\n    const statusCodeRaw = errorObj['statusCode'] ?? errorObj['status'];\n    const statusCode = typeof statusCodeRaw === 'number' ? statusCodeRaw : undefined;\n\n    return {\n      code,\n      message,\n      severity: 'error',\n      operation,\n      originalError: error,\n      statusCode,\n      context,\n      timestamp: new Date(),\n      handled: false,\n      recoverySuggestions: this.getDefaultRecoverySuggestions(code),\n    };\n  }\n\n  private conversationErrorFromApi(\n    apiError: AXConversationApiError,\n    operation: string,\n    context?: Record<string, unknown>,\n  ): AXConversationError {\n    return {\n      code: apiError.code,\n      message: apiError.message,\n      severity: this.determineSeverity(apiError.statusCode),\n      operation,\n      originalError: apiError,\n      statusCode: apiError.statusCode,\n      context,\n      timestamp: apiError.timestamp ?? new Date(),\n      handled: false,\n      recoverySuggestions: this.getRecoverySuggestions(apiError),\n    };\n  }\n\n  private isApiError(error: unknown): error is AXConversationApiError {\n    return (\n      typeof error === 'object' &&\n      error !== null &&\n      'code' in error &&\n      'message' in error &&\n      typeof (error as AXConversationApiError).code === 'string' &&\n      typeof (error as AXConversationApiError).message === 'string'\n    );\n  }\n\n  /**\n   * Determine severity based on status code\n   */\n  private determineSeverity(statusCode?: number): AXConversationErrorSeverity {\n    if (!statusCode) return 'error';\n\n    if (statusCode >= 500) return 'critical';\n    if (statusCode >= 400) return 'error';\n    if (statusCode >= 300) return 'warning';\n    return 'info';\n  }\n\n  /**\n   * Get recovery suggestions based on error\n   */\n  private getRecoverySuggestions(error: AXConversationApiError): string[] {\n    const suggestions: string[] = [];\n\n    if (error.statusCode === 401 || error.code === 'UNAUTHORIZED') {\n      suggestions.push('Please log in again');\n      suggestions.push('Check if your session has expired');\n    } else if (error.statusCode === 403 || error.code === 'FORBIDDEN') {\n      suggestions.push('You do not have permission for this action');\n      suggestions.push('Ask your administrator for access');\n    } else if (error.statusCode === 404 || error.code === 'NOT_FOUND') {\n      suggestions.push('The requested resource was not found');\n      suggestions.push('It may have been deleted or moved');\n    } else if (error.statusCode === 429 || error.code === 'RATE_LIMIT_EXCEEDED') {\n      suggestions.push('Too many requests. Please wait and try again');\n    } else if (error.statusCode && error.statusCode >= 500) {\n      suggestions.push('Server error occurred');\n      suggestions.push('Please try again later');\n      suggestions.push('If the problem persists, reach out to support');\n    } else if (error.code === 'NETWORK_ERROR') {\n      suggestions.push('Check your internet connection');\n      suggestions.push('Try refreshing the page');\n    }\n\n    return suggestions;\n  }\n\n  /**\n   * Get default recovery suggestions\n   */\n  private getDefaultRecoverySuggestions(code: string): string[] {\n    const suggestions: string[] = [];\n\n    if (code.includes('NETWORK') || code.includes('CONNECTION')) {\n      suggestions.push('Check your internet connection');\n      suggestions.push('Try refreshing the page');\n    } else if (code.includes('TIMEOUT')) {\n      suggestions.push('The operation took too long');\n      suggestions.push('Please try again');\n    } else {\n      suggestions.push('Please try again');\n      suggestions.push('If the problem persists, reach out to support');\n    }\n\n    return suggestions;\n  }\n\n  /**\n   * Log error to console\n   */\n  private logError(error: AXConversationError): void {\n    const isError = error.severity === 'critical' || error.severity === 'error';\n    const header = `[Conversation ${error.severity.toUpperCase()}] ${error.operation}:`;\n    if (isError) {\n      console.error(header, error.message, error.context || '');\n    } else {\n      console.warn(header, error.message, error.context || '');\n    }\n\n    if (error.originalError && error.severity !== 'info') {\n      console.error('Original error:', error.originalError);\n    }\n\n    if (error.recoverySuggestions && error.recoverySuggestions.length > 0) {\n      console.info('Recovery suggestions:', error.recoverySuggestions);\n    }\n  }\n\n  /**\n   * Get user-friendly error message\n   */\n  getUserFriendlyMessage(error: AXConversationError): string {\n    // Map technical errors to user-friendly messages\n    const messageMap: Record<string, string> = {\n      NETWORK_ERROR: 'Unable to connect. Please check your internet connection.',\n      UNAUTHORIZED: 'You are not authorized. Please log in again.',\n      FORBIDDEN: 'You do not have permission to perform this action.',\n      NOT_FOUND: 'The requested item could not be found.',\n      RATE_LIMIT_EXCEEDED: 'Too many requests. Please slow down.',\n      VALIDATION_ERROR: 'The provided data is invalid.',\n      SERVER_ERROR: 'A server error occurred. Please try again later.',\n      TIMEOUT: 'The operation timed out. Please try again.',\n    };\n\n    return messageMap[error.code] || error.message || 'An unexpected error occurred.';\n  }\n\n  /**\n   * Check if error is retryable\n   */\n  isRetryable(error: AXConversationError): boolean {\n    const retryableCodes = ['NETWORK_ERROR', 'TIMEOUT', 'RATE_LIMIT_EXCEEDED', 'SERVER_ERROR'];\n    const retryableStatusCodes = [408, 429, 500, 502, 503, 504];\n\n    return (\n      retryableCodes.includes(error.code) ||\n      (error.statusCode !== undefined && retryableStatusCodes.includes(error.statusCode))\n    );\n  }\n\n  /**\n   * Execute an operation with automatic retry logic\n   * @param operation - The async operation to execute\n   * @param operationName - Name of the operation for error tracking\n   * @param context - Additional context for error handling\n   * @returns Promise resolving to the operation result\n   * @throws {AXConversationError} If all retries fail\n   */\n  async executeWithRetry<T>(\n    operation: () => Promise<T>,\n    operationName: string,\n    context?: Record<string, unknown>,\n  ): Promise<T> {\n    if (!this._config.autoRetry) {\n      // If auto-retry is disabled, just execute once\n      return operation();\n    }\n\n    const maxRetries = this._config.maxRetries ?? 3;\n    let lastError: unknown;\n\n    for (let attempt = 0; attempt <= maxRetries; attempt++) {\n      try {\n        return await operation();\n      } catch (error) {\n        lastError = error;\n        const conversationError = this.handle(error, operationName, { ...context, attempt });\n\n        // Don't retry if error is not retryable or if this was the last attempt\n        if (!this.isRetryable(conversationError) || attempt >= maxRetries) {\n          throw conversationError;\n        }\n\n        // Exponential backoff: 1s, 2s, 4s, 8s...\n        const delayMs = Math.pow(2, attempt) * 1000;\n        await this.delay(delayMs);\n      }\n    }\n\n    throw this.handle(lastError, operationName, context);\n  }\n\n  /**\n   * Delay helper for retry backoff\n   * @param ms - Milliseconds to delay\n   */\n  private delay(ms: number): Promise<void> {\n    return new Promise((resolve) => setTimeout(resolve, ms));\n  }\n}\n","import type { AXFileType } from '@acorex/core/file';\nimport { AXFileTypeInfoProvider, type AXFileTypeRegistryService } from '@acorex/core/file';\nimport { Injectable } from '@angular/core';\nimport {\n  AX_CONVERSATION_AUDIO_CATALOG,\n  AX_CONVERSATION_FILE_CATALOG,\n  AX_CONVERSATION_IMAGE_CATALOG,\n  AX_CONVERSATION_VIDEO_CATALOG,\n  AX_CONVERSATION_VOICE_CATALOG,\n} from '../../../models/message-file-type-catalog';\n\ntype AXConversationFileCatalogLoader = () => Promise<AXFileType>;\n\nconst AX_CONVERSATION_FILE_CATALOG_LOADERS: Record<string, AXConversationFileCatalogLoader> = {\n  [AX_CONVERSATION_IMAGE_CATALOG]: async () => {\n    const mod = await import('../components/image-picker/conversation-image.file-type');\n    return mod.createConversationImageFileType();\n  },\n  [AX_CONVERSATION_VIDEO_CATALOG]: async () => {\n    const mod = await import('../components/video-picker/conversation-video.file-type');\n    return mod.createConversationVideoFileType();\n  },\n  [AX_CONVERSATION_AUDIO_CATALOG]: async () => {\n    const mod = await import('../components/audio-picker/conversation-audio.file-type');\n    return mod.createConversationAudioFileType();\n  },\n  [AX_CONVERSATION_FILE_CATALOG]: async () => {\n    const mod = await import('../components/file-picker/conversation-file.file-type');\n    return mod.createConversationFileFileType();\n  },\n  [AX_CONVERSATION_VOICE_CATALOG]: async () => {\n    const mod = await import('../components/voice-recorder/conversation-voice.file-type');\n    return mod.createConversationVoiceFileType();\n  },\n};\n\nasync function loadConversationFileTypes(catalogNames: string[]): Promise<AXFileType[]> {\n  const uniqueCatalogs = [...new Set(catalogNames.filter(Boolean))];\n  if (!uniqueCatalogs.length) {\n    return [];\n  }\n\n  const types: AXFileType[] = [];\n\n  for (const catalogName of uniqueCatalogs) {\n    const loader = AX_CONVERSATION_FILE_CATALOG_LOADERS[catalogName];\n    if (loader) {\n      types.push(await loader());\n    }\n  }\n\n  return types;\n}\n\n/** Ensure a built-in conversation catalog is registered before pre-overlay file selection. */\nexport async function ensureConversationFileCatalogRegistered(\n  registry: AXFileTypeRegistryService,\n  catalogName: string,\n): Promise<void> {\n  if (await registry.get(catalogName)) {\n    return;\n  }\n\n  const loader = AX_CONVERSATION_FILE_CATALOG_LOADERS[catalogName];\n  if (!loader) {\n    return;\n  }\n\n  registry.registerTypes([await loader()]);\n}\n\n/** Built-in conversation catalogs (lazy-loaded on first registry resolve). */\nconst AX_CONVERSATION_BUILTIN_FILE_CATALOGS = [\n  AX_CONVERSATION_IMAGE_CATALOG,\n  AX_CONVERSATION_VIDEO_CATALOG,\n  AX_CONVERSATION_AUDIO_CATALOG,\n  AX_CONVERSATION_FILE_CATALOG,\n  AX_CONVERSATION_VOICE_CATALOG,\n] as const;\n\n/**\n * Lazy-loads conversation file catalogs for the root file-type registry.\n * Must not inject {@link AXConversationComposerActionRegistry} — that registry\n * depends on {@link AXFileTypeRegistryService}, which would create a circular DI cycle.\n */\n@Injectable()\nexport class AXConversationComposerFileTypesProvider extends AXFileTypeInfoProvider {\n  async items(): Promise<AXFileType[]> {\n    return loadConversationFileTypes([...AX_CONVERSATION_BUILTIN_FILE_CATALOGS]);\n  }\n}\n","import { provideFileTypeInfoProvider, provideFileValidationRules } from '@acorex/core/file';\nimport { InjectionToken, type Provider } from '@angular/core';\nimport { AXConversationComposerFileTypesProvider } from './conversation-composer-file-types.provider';\n\n/** Ensures built-in conversation catalogs exist on the root file-type registry. */\nexport const AX_CONVERSATION_FILE_TYPES_READY = new InjectionToken<boolean>('AX_CONVERSATION_FILE_TYPES_READY');\n\n/** Registers validation rules and lazy conversation file-type catalogs for composer actions. */\nexport function provideConversationComposerFileTypes(): Provider[] {\n  return [\n    provideFileValidationRules(),\n    provideFileTypeInfoProvider(AXConversationComposerFileTypesProvider),\n    {\n      provide: AX_CONVERSATION_FILE_TYPES_READY,\n      useValue: true,\n    },\n  ];\n}\n","import type { Type } from '@angular/core';\nimport type { AXConversationComposerTabFeature } from '../../../../tokens/conversation-features';\nimport type { AXConversationComposerTab } from '../../../../registries/composer-tab.registry';\n\nexport const AX_CONVERSATION_COMPOSER_EMOJI_TAB: AXConversationComposerTab = {\n  id: 'emoji',\n  title: '@acorex:chat.tabs.emoji',\n  icon: 'fa-light fa-face-smile',\n  priority: 100,\n  componentLoader: () => import('../emoji-tab').then((m) => m.AXConversationEmojiTabComponent as Type<unknown>),\n  enabled: true,\n};\n\nexport const AX_CONVERSATION_COMPOSER_STICKER_TAB: AXConversationComposerTab = {\n  id: 'sticker',\n  title: '@acorex:chat.tabs.stickers',\n  icon: 'fa-light fa-note-sticky',\n  priority: 90,\n  componentLoader: () => import('../sticker-tab').then((m) => m.AXConversationStickerTabComponent as Type<unknown>),\n  enabled: true,\n};\n\n/** Built-in composer popup tabs keyed by {@link AXConversationComposerTabFeature}. */\nexport const AX_CONVERSATION_BUILTIN_COMPOSER_TABS: Record<\n  AXConversationComposerTabFeature,\n  AXConversationComposerTab\n> = {\n  emoji: AX_CONVERSATION_COMPOSER_EMOJI_TAB,\n  sticker: AX_CONVERSATION_COMPOSER_STICKER_TAB,\n};\n","/**\n * Composer Tab Registry\n * Register custom tabs for the composer popup (emoji, stickers, GIFs, etc.)\n */\n\nimport { computed, inject, Injectable, signal, Type } from '@angular/core';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { Observable } from 'rxjs';\nimport { AX_CONVERSATION_BUILTIN_COMPOSER_TABS } from '../plugins/composer/components/composer-tabs/composer-tab.builtin';\nimport { AX_CONVERSATION_CONFIG, AX_CONVERSATION_DEFAULT_COMPOSER_TABS, AX_CONVERSATION_REGISTRY_CONFIG } from '../tokens';\nimport { resolveConversationComposerTabs } from '../tokens/conversation-features';\nimport type { AXConversationRegistryItem } from './base-registry.abstract';\n\n/**\n * Composer tab registration\n */\nexport interface AXConversationComposerTab extends AXConversationRegistryItem {\n  /** Display title */\n  title: string;\n\n  /** Icon name/class */\n  icon?: string;\n\n  /** Angular component for tab content */\n  component?: Type<unknown>;\n\n  /** Lazy loader for tab content */\n  componentLoader?: () => Promise<Type<unknown>>;\n\n  /** Default data provider (optional) */\n  dataProvider?: () => Observable<unknown>;\n\n  /** Custom class for styling */\n  className?: string;\n\n  /** Badge text/count */\n  badge?: string | number;\n}\n\n/**\n * Composer Tab Registry Service\n */\n@Injectable()\nexport class AXConversationComposerTabRegistry {\n  private readonly _tabs = signal<AXConversationComposerTab[]>([]);\n  private readonly translation = inject(AXTranslationService);\n\n  constructor() {\n    const conversationConfig = inject(AX_CONVERSATION_CONFIG, { optional: true });\n\n    for (const tabId of resolveConversationComposerTabs(conversationConfig?.features)) {\n      const builtIn = AX_CONVERSATION_BUILTIN_COMPOSER_TABS[tabId];\n      if (builtIn) {\n        this.register(builtIn);\n      }\n    }\n\n    inject(AX_CONVERSATION_DEFAULT_COMPOSER_TABS, { optional: true })?.forEach((tab) => this.register(tab));\n\n    const registryConfig = inject(AX_CONVERSATION_REGISTRY_CONFIG, { optional: true });\n    registryConfig?.composerTabs?.forEach((tab) => this.register(tab));\n  }\n\n  /** All registered tabs */\n  readonly tabs = this._tabs.asReadonly();\n\n  /** Enabled tabs sorted by priority */\n  readonly enabledTabs = computed(() =>\n    [...this._tabs()].filter((tab) => tab.enabled !== false).sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0)),\n  );\n\n  /** Whether the composer popup has any tabs to show. */\n  readonly hasEnabledTabs = computed(() => this.enabledTabs().length > 0);\n\n  /**\n   * Register a composer tab\n   */\n  register(tab: AXConversationComposerTab): void {\n    // Validate tab\n    if (!tab.id) {\n      throw new Error('Composer tab must have an id');\n    }\n    if (!tab.title) {\n      throw new Error('Composer tab must have a title');\n    }\n    if (!tab.component && !tab.componentLoader) {\n      throw new Error('Composer tab must have a component or componentLoader');\n    }\n\n    // Check for duplicates\n    const existing = this._tabs().find((t) => t.id === tab.id);\n    if (existing) {\n      console.warn(`Composer tab \"${tab.id}\" is already registered. Replacing...`);\n      this.unregister(tab.id);\n    }\n\n    // Add to registry\n    this._tabs.update((tabs) => [...tabs, tab]);\n  }\n\n  /**\n   * Unregister a composer tab\n   */\n  unregister(id: string): void {\n    this._tabs.update((tabs) => tabs.filter((t) => t.id !== id));\n  }\n\n  /**\n   * Get tab by ID\n   */\n  getTabById(id: string): AXConversationComposerTab | undefined {\n    return this._tabs().find((t) => t.id === id);\n  }\n\n  getTabTitle(tab: AXConversationComposerTab): string {\n    return this.translation.translateSync(tab.title);\n  }\n\n  /**\n   * Enable/disable a tab\n   */\n  setEnabled(id: string, enabled: boolean): void {\n    this._tabs.update((tabs) => tabs.map((tab) => (tab.id === id ? { ...tab, enabled } : tab)));\n  }\n\n  /**\n   * Update tab badge\n   */\n  setBadge(id: string, badge: string | number | undefined): void {\n    this._tabs.update((tabs) => tabs.map((tab) => (tab.id === id ? { ...tab, badge } : tab)));\n  }\n\n  /**\n   * Clear all tabs\n   */\n  clear(): void {\n    this._tabs.set([]);\n  }\n}\n","/**\n * Composer Action Registry\n * Register custom action buttons for the composer (attach, voice, location, etc.)\n */\n\nimport { AXFileTypeRegistryService, provideFileValidationRules } from '@acorex/core/file';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport {\n  computed,\n  inject,\n  Injectable,\n  Injector,\n  Provider,\n  runInInjectionContext,\n  signal,\n  Type,\n  type InputSignal,\n} from '@angular/core';\nimport { AXConversationComposerService } from '../components/composer/composer.service';\nimport type { AXConversation } from '../models';\nimport {\n  AX_CONVERSATION_FILE_TYPES_READY,\n  provideConversationComposerFileTypes,\n} from '../plugins/composer/composer-actions/composer-file-types.plugin';\nimport { ensureConversationFileCatalogRegistered } from '../plugins/composer/composer-actions/conversation-composer-file-types.provider';\nimport { AX_CONVERSATION_DEFAULT_COMPOSER_ACTIONS, AX_CONVERSATION_REGISTRY_CONFIG } from '../tokens';\nimport type { AXConversationRegistryItem } from './base-registry.abstract';\nimport { AXConversationComposerTabRegistry } from './composer-tab.registry';\n\n/**\n * Composer context provided to actions\n */\nexport interface AXConversationComposerActionContext {\n  /** Current draft text */\n  draftText: string;\n\n  /** Conversation ID */\n  conversationId: string;\n\n  /** Whether editing a message */\n  isEditing: boolean;\n\n  /** Message being edited (if any) */\n  editingMessageId?: string;\n\n  /** Whether replying to a message */\n  isReplying: boolean;\n\n  /** Message being replied to (if any) */\n  replyingToMessageId?: string;\n\n  /** Whether a background generation (e.g. AI response) is in progress */\n  isGenerating?: boolean;\n\n  /** Whether cancel cleanup is in progress */\n  isStopping?: boolean;\n\n  /** Custom context data */\n  custom?: Record<string, unknown>;\n}\n\n/**\n * Contract for components used as {@link AXConversationComposerAction.component}.\n * Composer shell passes at least `{ conversation, service }`.\n */\nexport interface AXConversationComposerActionComponent {\n  readonly conversation: InputSignal<AXConversation>;\n  readonly service?: InputSignal<AXConversationComposerService | undefined>;\n  /** Max files per message; falls back to {@link AXConversationConfig.maxFilesPerMessage}. */\n  readonly maxFiles?: InputSignal<number | undefined>;\n  /** Pre-fill picker when opened from message-list drag-and-drop. */\n  readonly initialFiles?: InputSignal<File[]>;\n  /** Set by {@link AXPopupService} when the picker is shown in a popup. */\n  readonly __popup__?: InputSignal<import('@acorex/components/popup').AXPopupRef | undefined>;\n  /** Set by {@link AXActionSheetService} when the picker is shown in an action sheet. */\n  readonly __actionSheet__?: InputSignal<import('@acorex/components/action-sheet').AXActionSheetRef | undefined>;\n  /**\n   * When true (from action {@link AXConversationComposerAction.autoRun}), runs {@link activate}\n   * once after the component is mounted.\n   */\n  readonly autoRun?: InputSignal<boolean>;\n  /** Primary action when opened from the composer (record, browse files, etc.). */\n  activate?(): void | Promise<void>;\n  /** Cancel in-flight uploads when the picker is closed or replaced. */\n  abortInProgressUploads?(): void;\n}\n\n/**\n * Composer action registration\n */\nexport interface AXConversationComposerAction extends Omit<AXConversationRegistryItem, 'enabled'> {\n  /** Display label (for accessibility) */\n  label: string;\n\n  /** Icon name/class */\n  icon: string;\n\n  /** Position: start or end of the composer */\n  position: 'start' | 'end';\n\n  /** Location: inline (show as button) or menu (show in attachment popup menu) */\n  location?: 'inline' | 'menu';\n\n  /**\n   * Primary end action (e.g. voice record). Only one action may be default.\n   * Renders as the circular send-style button and morphs into send when the draft has content.\n   */\n  default?: boolean;\n\n  /** Visibility condition */\n  visible: (context: AXConversationComposerActionContext) => boolean;\n\n  /** Enabled condition */\n  enabled?: (context: AXConversationComposerActionContext) => boolean;\n\n  /**\n   * Component to show when action is activated\n   * If provided, clicking the action will show this component in full-width mode\n   */\n  component?: Type<AXConversationComposerActionComponent>;\n\n  /** Lazy loader for the action component */\n  componentLoader?: () => Promise<Type<AXConversationComposerActionComponent>>;\n\n  /**\n   * Whether this action is toggleable (shows/hides component)\n   */\n  toggleable?: boolean;\n\n  /**\n   * When true, runs {@link AXConversationComposerActionComponent.activate} in\n   * {@link afterNextRender} after the upload panel is mounted.\n   */\n  autoRun?: boolean;\n\n  /** Action handler (optional if component is provided) */\n  handler?: (context: AXConversationComposerActionContext) => void | Promise<void>;\n\n  /** Tooltip text */\n  tooltip?: string;\n\n  /** Keyboard shortcut */\n  shortcut?: string;\n\n  /** Custom class for styling */\n  className?: string;\n\n  /** Badge text/count */\n  badge?: string | number;\n\n  /** File catalog for this action's picker; built-ins use {@link provideConversationComposerFileTypes}. */\n  fileType?: string;\n\n  /** Max files per message; falls back to {@link AXConversationConfig.maxFilesPerMessage}. */\n  maxFiles?: number;\n}\n\n/** Validation rules and built-in conversation file types. */\nexport function provideConversationFileCatalog(_extraActions?: readonly AXConversationComposerAction[]): Provider[] {\n  return [provideFileValidationRules(), ...provideConversationComposerFileTypes()];\n}\n\n/**\n * Composer Action Registry Service\n */\n@Injectable()\nexport class AXConversationComposerActionRegistry {\n  private readonly _actions = signal<AXConversationComposerAction[]>([]);\n  private readonly translation = inject(AXTranslationService);\n  private readonly injector = inject(Injector);\n  private readonly composerTabRegistry = inject(AXConversationComposerTabRegistry);\n\n  constructor() {\n    inject(AX_CONVERSATION_FILE_TYPES_READY);\n\n    // Register default actions from individual token\n    inject(AX_CONVERSATION_DEFAULT_COMPOSER_ACTIONS, { optional: true })?.forEach((action) => this.register(action));\n\n    // Register actions from AX_CONVERSATION_REGISTRY_CONFIG\n    const config = inject(AX_CONVERSATION_REGISTRY_CONFIG, { optional: true });\n    config?.composerActions?.forEach((action) => this.register(action));\n  }\n\n  /** All registered actions */\n  readonly actions = this._actions.asReadonly();\n\n  /** Start-side actions sorted by priority */\n  readonly startActions = computed(() =>\n    [...this._actions()]\n      .filter((action) => action.position === 'start')\n      .sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0)),\n  );\n\n  /** End-side actions sorted by priority */\n  readonly endActions = computed(() =>\n    [...this._actions()]\n      .filter((action) => action.position === 'end')\n      .sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0)),\n  );\n\n  /** Start-side inline actions (location = 'inline' or undefined) */\n  readonly startInlineActions = computed(() => this.startActions().filter((action) => action.location !== 'menu'));\n\n  /** Start-side menu actions (location = 'menu') — shown in the attachment popup */\n  readonly startMenuActions = computed(() => this.startActions().filter((action) => action.location === 'menu'));\n\n  /** End-side inline actions inside the input pill (excludes default action) */\n  readonly endInlineActions = computed(() =>\n    this.endActions().filter((action) => action.location !== 'menu' && !action.default),\n  );\n\n  /** End-side menu actions (location = 'menu') */\n  readonly endMenuActions = computed(() => this.endActions().filter((action) => action.location === 'menu'));\n\n  /** The single default end action (voice/send morph button) */\n  readonly defaultAction = computed(() => this.endActions().find((action) => action.default));\n\n  /**\n   * Register a composer action\n   */\n  register(action: AXConversationComposerAction): void {\n    // Validate action\n    if (!action.id) {\n      throw new Error('Composer action must have an id');\n    }\n    if (!action.label) {\n      throw new Error('Composer action must have a label');\n    }\n    if (!action.icon) {\n      throw new Error('Composer action must have an icon');\n    }\n    if (!action.handler && !action.component && !action.componentLoader) {\n      throw new Error('Composer action must have either a handler, a component, or a componentLoader');\n    }\n\n    // Check for duplicates\n    const existing = this._actions().find((a) => a.id === action.id);\n    if (existing) {\n      console.warn(`Composer action \"${action.id}\" is already registered. Replacing...`);\n      this.unregister(action.id);\n    }\n\n    // Only one action may be default\n    if (action.default) {\n      this._actions.update((actions) =>\n        actions.map((a) => (a.default && a.id !== action.id ? { ...a, default: undefined } : a)),\n      );\n    }\n\n    // Add to registry\n    this._actions.update((actions) => [...actions, action]);\n\n    if (action.fileType) {\n      this.fileTypeRegistry().invalidateCache();\n      void this.ensureFileTypeExists(action.fileType);\n    }\n  }\n\n  /** Resolved lazily to avoid a DI cycle with {@link AXConversationComposerFileTypesProvider}. */\n  private fileTypeRegistry(): AXFileTypeRegistryService {\n    return this.injector.get(AXFileTypeRegistryService);\n  }\n\n  private async ensureFileTypeExists(fileType: string): Promise<void> {\n    const registry = this.fileTypeRegistry();\n    await ensureConversationFileCatalogRegistered(registry, fileType);\n    const match = await registry.get(fileType);\n    if (!match) {\n      console.warn(\n        `[AXConversationComposerActionRegistry] Unknown fileType \"${fileType}\". ` +\n          'Register its AXFileTypeInfoProvider in app providers before using this action.',\n      );\n    }\n  }\n\n  /**\n   * Unregister a composer action\n   */\n  unregister(id: string): void {\n    this._actions.update((actions) => actions.filter((a) => a.id !== id));\n  }\n\n  /**\n   * Get visible actions for a position\n   */\n  getVisibleActions(\n    position: 'start' | 'end',\n    context: AXConversationComposerActionContext,\n  ): AXConversationComposerAction[] {\n    const actions = position === 'start' ? this.startActions() : this.endActions();\n    const hasComposerTabs = this.composerTabRegistry.hasEnabledTabs();\n    return actions.filter((action) => {\n      if (action.id === 'emoji' && !hasComposerTabs) {\n        return false;\n      }\n      return runInInjectionContext(this.injector, () => action.visible(context));\n    });\n  }\n\n  /**\n   * Get enabled actions for a position\n   */\n  getEnabledActions(\n    position: 'start' | 'end',\n    context: AXConversationComposerActionContext,\n  ): AXConversationComposerAction[] {\n    return this.getVisibleActions(position, context).filter(\n      (action) => runInInjectionContext(this.injector, () => action.enabled?.(context)) !== false,\n    );\n  }\n\n  isActionEnabled(action: AXConversationComposerAction, context: AXConversationComposerActionContext): boolean {\n    return runInInjectionContext(this.injector, () => action.enabled?.(context)) !== false;\n  }\n\n  /**\n   * Picker actions for a file catalog (by priority), when visible and enabled.\n   */\n  findPickerActionsForFileType(\n    catalogName: string,\n    context: AXConversationComposerActionContext,\n  ): AXConversationComposerAction[] {\n    return [...this._actions()]\n      .filter((action) => action.component || action.componentLoader)\n      .filter((action) => action.fileType === catalogName)\n      .filter((action) => runInInjectionContext(this.injector, () => action.visible(context)))\n      .filter((action) => this.isActionEnabled(action, context))\n      .sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));\n  }\n\n  /**\n   * First picker action for a file catalog (by priority), when visible and enabled.\n   */\n  findPickerActionForFileType(\n    catalogName: string,\n    context: AXConversationComposerActionContext,\n  ): AXConversationComposerAction | undefined {\n    return this.findPickerActionsForFileType(catalogName, context)[0];\n  }\n\n  /**\n   * Get action by ID\n   */\n  getActionById(id: string): AXConversationComposerAction | undefined {\n    return this._actions().find((a) => a.id === id);\n  }\n\n  getActionLabel(action: AXConversationComposerAction): string {\n    return this.translation.translateSync(action.label);\n  }\n\n  getActionTooltip(action: AXConversationComposerAction): string | undefined {\n    if (!action.tooltip) return undefined;\n    return this.translation.translateSync(action.tooltip);\n  }\n\n  /**\n   * Execute an action\n   */\n  async executeAction(actionId: string, context: AXConversationComposerActionContext): Promise<void> {\n    const action = this.getActionById(actionId);\n    if (!action) {\n      throw new Error(`Action \"${actionId}\" not found`);\n    }\n\n    if (!runInInjectionContext(this.injector, () => action.visible(context))) {\n      throw new Error(`Action \"${actionId}\" is not visible`);\n    }\n    if (action.enabled && !runInInjectionContext(this.injector, () => action.enabled?.(context))) {\n      throw new Error(`Action \"${actionId}\" is not enabled`);\n    }\n\n    if (action.handler) {\n      await runInInjectionContext(this.injector, () => action.handler?.(context));\n    }\n  }\n\n  /**\n   * Update action badge\n   */\n  setBadge(id: string, badge: string | number | undefined): void {\n    this._actions.update((actions) => actions.map((action) => (action.id === id ? { ...action, badge } : action)));\n  }\n\n  /**\n   * Clear all actions\n   */\n  clear(): void {\n    this._actions.set([]);\n  }\n}\n","/**\n * Abstract Base Registry\n * Base class for all registries with common functionality\n */\n\nimport { computed, signal, Signal, WritableSignal } from '@angular/core';\n\n/**\n * Base registry interface\n */\nexport interface AXConversationRegistryItem {\n  /** Unique identifier */\n  id: string;\n\n  /** Display order priority (higher = earlier) */\n  priority?: number;\n\n  /** Whether item is enabled */\n  enabled?: boolean;\n}\n\n/**\n * Abstract Base Registry Class\n * Provides common registry functionality\n */\nexport abstract class AXConversationBaseRegistry<T extends AXConversationRegistryItem> {\n  protected readonly _items: WritableSignal<T[]> = signal([]);\n\n  /** All registered items */\n  readonly items: Signal<T[]> = this._items.asReadonly();\n\n  /** Enabled items sorted by priority */\n  readonly enabledItems: Signal<T[]> = computed(() =>\n    [...this._items()].filter((item) => item.enabled !== false).sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0)),\n  );\n\n  /**\n   * Register an item\n   */\n  register(item: T): void {\n    this.validateItem(item);\n\n    // Check for duplicates\n    const existing = this._items().find((i) => i.id === item.id);\n    if (existing) {\n      console.warn(`${this.getRegistryName()}: Item \"${item.id}\" is already registered. Replacing...`);\n      this.unregister(item.id);\n    }\n\n    // Add to registry\n    this._items.update((items) => [...items, item]);\n  }\n\n  /**\n   * Register multiple items\n   */\n  registerMany(items: T[]): void {\n    items.forEach((item) => this.register(item));\n  }\n\n  /**\n   * Unregister an item by ID\n   */\n  unregister(id: string): void {\n    this._items.update((items) => items.filter((i) => i.id !== id));\n  }\n\n  /**\n   * Get item by ID\n   */\n  getById(id: string): T | undefined {\n    return this._items().find((i) => i.id === id);\n  }\n\n  /**\n   * Check if item exists\n   */\n  has(id: string): boolean {\n    return this.getById(id) !== undefined;\n  }\n\n  /**\n   * Enable/disable an item\n   */\n  setEnabled(id: string, enabled: boolean): void {\n    this._items.update((items) => items.map((item) => (item.id === id ? { ...item, enabled } : item)));\n  }\n\n  /**\n   * Update an item\n   */\n  update(id: string, updates: Partial<T>): void {\n    this._items.update((items) => items.map((item) => (item.id === id ? { ...item, ...updates } : item)));\n  }\n\n  /**\n   * Clear all items\n   */\n  clear(): void {\n    this._items.set([]);\n  }\n\n  /**\n   * Get count of registered items\n   */\n  get count(): number {\n    return this._items().length;\n  }\n\n  /**\n   * Get count of enabled items\n   */\n  get enabledCount(): number {\n    return this.enabledItems().length;\n  }\n\n  /**\n   * Validate item before registration\n   * Override in child classes for custom validation\n   */\n  protected validateItem(item: T): void {\n    if (!item.id) {\n      throw new Error(`${this.getRegistryName()}: Item must have an id`);\n    }\n  }\n\n  /**\n   * Get registry name for logging\n   * Override in child classes\n   */\n  protected abstract getRegistryName(): string;\n}\n","/**\n * Conversation Item Action Registry\n * Manages actions available in the conversation list item context menu\n */\n\nimport { Injectable, inject, Injector, runInInjectionContext } from '@angular/core';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport type { AXConversation } from '../models';\nimport { AX_CONVERSATION_DEFAULT_CONVERSATION_ITEM_ACTIONS, AX_CONVERSATION_REGISTRY_CONFIG } from '../tokens';\nimport { AXConversationBaseRegistry, AXConversationRegistryItem } from './base-registry.abstract';\n\n/**\n * Context provided to action handlers\n */\nexport interface AXConversationItemActionContext {\n  /** The conversation */\n  conversation: AXConversation;\n\n  /** Additional context data */\n  data?: Record<string, unknown>;\n}\n\n/**\n * Conversation item action configuration\n */\nexport interface AXConversationItemAction extends AXConversationRegistryItem {\n  /** Action label */\n  label: string | ((context: AXConversationItemActionContext) => string);\n\n  /** Action icon (emoji or icon class) */\n  icon?: string | ((context: AXConversationItemActionContext) => string);\n\n  /** Tooltip text */\n  tooltip?: string | ((context: AXConversationItemActionContext) => string);\n\n  /** Whether this action is destructive */\n  destructive?: boolean;\n\n  /** Whether this is a divider */\n  divider?: boolean;\n\n  /**\n   * Visibility condition\n   * @returns true if action should be visible\n   */\n  visible?: (context: AXConversationItemActionContext) => boolean;\n\n  /**\n   * Dynamic enabled condition\n   * @returns true if action should be enabled\n   * Note: Use the `enabled` property from AXConversationRegistryItem for static enable/disable\n   */\n  enabledWhen?: (context: AXConversationItemActionContext) => boolean;\n\n  /**\n   * Action handler\n   * Called when the action is clicked\n   */\n  handler?: (context: AXConversationItemActionContext) => void | Promise<void>;\n}\n\n/**\n * Conversation Item Action Registry Service\n * Manages available actions in the conversation list item context menu\n */\n@Injectable()\nexport class AXConversationItemActionRegistry extends AXConversationBaseRegistry<AXConversationItemAction> {\n  private readonly translation = inject(AXTranslationService);\n  private readonly injector = inject(Injector);\n\n  constructor() {\n    super();\n\n    // Register default actions from individual token\n    inject(AX_CONVERSATION_DEFAULT_CONVERSATION_ITEM_ACTIONS, { optional: true })?.forEach((action) => this.register(action));\n\n    // Register actions from AX_CONVERSATION_REGISTRY_CONFIG\n    const config = inject(AX_CONVERSATION_REGISTRY_CONFIG, { optional: true });\n    config?.conversationItemActions?.forEach((action) => this.register(action));\n  }\n\n  /**\n   * Get registry name for logging\n   */\n  protected getRegistryName(): string {\n    return 'ConversationItemActionRegistry';\n  }\n\n  /**\n   * Get actions for a specific conversation\n   */\n  getActionsForConversation(conversation: AXConversation): AXConversationItemAction[] {\n    const context: AXConversationItemActionContext = { conversation };\n\n    return this.enabledItems()\n      .filter((action) => {\n        // Filter by visibility\n        if (action.visible && !runInInjectionContext(this.injector, () => action.visible?.(context))) {\n          return false;\n        }\n        return true;\n      })\n      .sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));\n  }\n\n  isActionEnabled(action: AXConversationItemAction, context: AXConversationItemActionContext): boolean {\n    if (action.enabled === false) {\n      return false;\n    }\n    if (action.enabledWhen) {\n      return runInInjectionContext(this.injector, () => action.enabledWhen?.(context)) !== false;\n    }\n    return true;\n  }\n\n  /**\n   * Get label for an action\n   */\n  getActionLabel(action: AXConversationItemAction, conversation: AXConversation): string {\n    if (typeof action.label === 'function') {\n      const labelFactory = action.label;\n      return this.translation.translateSync(\n        runInInjectionContext(this.injector, () => labelFactory({ conversation })),\n      );\n    }\n    return this.translation.translateSync(action.label);\n  }\n\n  /**\n   * Get icon for an action\n   */\n  getActionIcon(action: AXConversationItemAction, conversation: AXConversation): string | undefined {\n    if (!action.icon) return undefined;\n\n    if (typeof action.icon === 'function') {\n      const iconFactory = action.icon;\n      return runInInjectionContext(this.injector, () => iconFactory({ conversation }));\n    }\n    return action.icon;\n  }\n\n  /**\n   * Get tooltip for an action\n   */\n  getActionTooltip(action: AXConversationItemAction, conversation: AXConversation): string | undefined {\n    if (!action.tooltip) return undefined;\n\n    if (typeof action.tooltip === 'function') {\n      const tooltipFactory = action.tooltip;\n      return this.translation.translateSync(\n        runInInjectionContext(this.injector, () => tooltipFactory({ conversation })),\n      );\n    }\n    return this.translation.translateSync(action.tooltip);\n  }\n\n  async executeAction(actionId: string, context: AXConversationItemActionContext): Promise<void> {\n    const action = this.getById(actionId);\n    if (!action) {\n      throw new Error(`Action \"${actionId}\" not found`);\n    }\n    if (!this.isActionEnabled(action, context)) {\n      throw new Error(`Action \"${actionId}\" is not enabled`);\n    }\n    if (action.handler) {\n      await runInInjectionContext(this.injector, () => action.handler?.(context));\n    }\n  }\n}\n","/**\n * Conversation Tab Registry\n * Register custom tabs for filtering conversations in the sidebar\n */\n\nimport { computed, inject, Injectable, signal } from '@angular/core';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport type { AXConversation } from '../models';\nimport { AX_CONVERSATION_DEFAULT_CONVERSATION_TABS, AX_CONVERSATION_REGISTRY_CONFIG } from '../tokens';\nimport type { AXConversationRegistryItem } from './base-registry.abstract';\n\n/**\n * Conversation tab registration\n */\nexport interface AXConversationTab extends AXConversationRegistryItem {\n  /** Display label */\n  label: string;\n\n  /** Icon name/class */\n  icon?: string;\n\n  /** Filter function to determine which conversations to show */\n  filter: (conversations: AXConversation[]) => AXConversation[];\n\n  /** Badge function to compute badge count/text */\n  badge?: (conversations: AXConversation[]) => number | string | undefined;\n\n  /** Custom class for styling */\n  className?: string;\n\n  /** Whether this is the default active tab */\n  default?: boolean;\n}\n\n/**\n * Conversation Tab Registry Service\n */\n@Injectable()\nexport class AXConversationTabRegistry {\n  private readonly _tabs = signal<AXConversationTab[]>([]);\n  private readonly translation = inject(AXTranslationService);\n\n  constructor() {\n    // Register default tabs from individual token\n    inject(AX_CONVERSATION_DEFAULT_CONVERSATION_TABS, { optional: true })?.forEach((tab) => this.register(tab));\n\n    // Register tabs from AX_CONVERSATION_REGISTRY_CONFIG\n    const config = inject(AX_CONVERSATION_REGISTRY_CONFIG, { optional: true });\n    config?.conversationTabs?.forEach((tab) => this.register(tab));\n  }\n\n  /** All registered tabs */\n  readonly tabs = this._tabs.asReadonly();\n\n  /** Enabled tabs sorted by priority */\n  readonly enabledTabs = computed(() =>\n    [...this._tabs()].filter((tab) => tab.enabled !== false).sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0)),\n  );\n\n  /** Default active tab */\n  readonly defaultTab = computed(() => this.enabledTabs().find((tab) => tab.default === true) || this.enabledTabs()[0]);\n\n  /**\n   * Register a conversation tab\n   */\n  register(tab: AXConversationTab): void {\n    // Validate tab\n    if (!tab.id) {\n      throw new Error('Conversation tab must have an id');\n    }\n    if (!tab.label) {\n      throw new Error('Conversation tab must have a label');\n    }\n    if (!tab.filter) {\n      throw new Error('Conversation tab must have a filter function');\n    }\n\n    // Check for duplicates\n    const existing = this._tabs().find((t) => t.id === tab.id);\n    if (existing) {\n      console.warn(`Conversation tab \"${tab.id}\" is already registered. Replacing...`);\n      this.unregister(tab.id);\n    }\n\n    // Add to registry\n    this._tabs.update((tabs) => [...tabs, tab]);\n  }\n\n  /**\n   * Unregister a conversation tab\n   */\n  unregister(id: string): void {\n    this._tabs.update((tabs) => tabs.filter((t) => t.id !== id));\n  }\n\n  /**\n   * Get tab by ID\n   */\n  getTabById(id: string): AXConversationTab | undefined {\n    return this._tabs().find((t) => t.id === id);\n  }\n\n  getTabLabel(tab: AXConversationTab): string {\n    return this.translation.translateSync(tab.label);\n  }\n\n  /**\n   * Apply tab filter to conversations\n   */\n  filterConversations(tabId: string, conversations: AXConversation[]): AXConversation[] {\n    const tab = this.getTabById(tabId);\n    if (!tab) {\n      throw new Error(`Tab \"${tabId}\" not found`);\n    }\n    return tab.filter(conversations);\n  }\n\n  /**\n   * Get badge for a tab\n   */\n  getBadge(tabId: string, conversations: AXConversation[]): number | string | undefined {\n    const tab = this.getTabById(tabId);\n    if (!tab || !tab.badge) {\n      return undefined;\n    }\n    return tab.badge(conversations);\n  }\n\n  /**\n   * Enable/disable a tab\n   */\n  setEnabled(id: string, enabled: boolean): void {\n    this._tabs.update((tabs) => tabs.map((tab) => (tab.id === id ? { ...tab, enabled } : tab)));\n  }\n\n  /**\n   * Set default tab\n   */\n  setDefault(id: string): void {\n    this._tabs.update((tabs) =>\n      tabs.map((tab) => ({\n        ...tab,\n        default: tab.id === id,\n      })),\n    );\n  }\n\n  /**\n   * Clear all tabs\n   */\n  clear(): void {\n    this._tabs.set([]);\n  }\n}\n","/**\n * Info Bar Action Registry\n * Manages actions available in the conversation info bar\n */\n\nimport { Injectable, Type, inject, Injector, runInInjectionContext, type InputSignal } from '@angular/core';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { AXConversationInfoBarService } from '../components/info-bar/info-bar.service';\nimport type { AXConversation } from '../models';\nimport { AX_CONVERSATION_DEFAULT_INFO_BAR_ACTIONS, AX_CONVERSATION_REGISTRY_CONFIG } from '../tokens';\nimport { AXConversationBaseRegistry, AXConversationRegistryItem } from './base-registry.abstract';\n\n/**\n * Context provided to action handlers\n */\nexport interface AXConversationInfoBarActionContext {\n  /** The conversation */\n  conversation: AXConversation;\n\n  /** Additional context data */\n  data?: Record<string, unknown>;\n}\n\n/**\n * Contract for components used as {@link AXConversationInfoBarAction.component}.\n * Info-bar shell passes at least `{ conversation, service }`.\n */\nexport interface AXConversationInfoBarActionComponent {\n  readonly conversation: InputSignal<AXConversation>;\n  readonly service?: InputSignal<AXConversationInfoBarService | undefined>;\n}\n\n/**\n * Info bar action configuration\n */\nexport interface AXConversationInfoBarAction extends AXConversationRegistryItem {\n  /** Action label */\n  label: string | ((context: AXConversationInfoBarActionContext) => string);\n\n  /** Action icon (emoji or icon class) */\n  icon?: string | ((context: AXConversationInfoBarActionContext) => string);\n\n  /** Tooltip text */\n  tooltip?: string | ((context: AXConversationInfoBarActionContext) => string);\n\n  /** Whether this action is destructive */\n  destructive?: boolean;\n\n  /** Whether this is a divider */\n  divider?: boolean;\n\n  /** Display location: 'inline' for toolbar buttons, 'menu' for dropdown menu */\n  location?: 'inline' | 'menu' | ((context: AXConversationInfoBarActionContext) => 'inline' | 'menu');\n\n  /**\n   * Component to show when action is activated (for inline actions)\n   * If provided, clicking the action will show this component in the info-bar\n   */\n  component?: Type<AXConversationInfoBarActionComponent>;\n\n  /** Lazy loader for the inline/full-width action component */\n  componentLoader?: () => Promise<Type<AXConversationInfoBarActionComponent>>;\n\n  /**\n   * Whether this action is toggleable (shows/hides component)\n   */\n  toggleable?: boolean;\n\n  /**\n   * Whether action component should take full width of the info-bar.\n   * Defaults to `true` when omitted.\n   */\n  fullWidthComponent?: boolean;\n\n  /**\n   * Visibility condition\n   * @returns true if action should be visible\n   */\n  visible?: (context: AXConversationInfoBarActionContext) => boolean;\n\n  /**\n   * Dynamic enabled condition\n   * @returns true if action should be enabled\n   * Note: Use the `enabled` property from AXConversationRegistryItem for static enable/disable\n   */\n  enabledWhen?: (context: AXConversationInfoBarActionContext) => boolean;\n\n  /**\n   * Action handler\n   * Called when the action is clicked\n   */\n  handler?: (context: AXConversationInfoBarActionContext) => void | Promise<void>;\n}\n\n/**\n * Info Bar Action Registry Service\n * Manages available actions in the conversation info bar\n */\n@Injectable()\nexport class AXConversationInfoBarActionRegistry extends AXConversationBaseRegistry<AXConversationInfoBarAction> {\n  private readonly translation = inject(AXTranslationService);\n  private readonly injector = inject(Injector);\n\n  constructor() {\n    super();\n\n    // Register default actions from individual token\n    inject(AX_CONVERSATION_DEFAULT_INFO_BAR_ACTIONS, { optional: true })?.forEach((action) => this.register(action));\n\n    // Register actions from AX_CONVERSATION_REGISTRY_CONFIG\n    const config = inject(AX_CONVERSATION_REGISTRY_CONFIG, { optional: true });\n    config?.infoBarActions?.forEach((action) => this.register(action));\n  }\n\n  /**\n   * Get registry name for logging\n   */\n  protected getRegistryName(): string {\n    return 'InfoBarActionRegistry';\n  }\n\n  /**\n   * Get actions for a specific conversation\n   */\n  getActionsForConversation(conversation: AXConversation, location?: 'inline' | 'menu'): AXConversationInfoBarAction[] {\n    const context: AXConversationInfoBarActionContext = { conversation };\n\n    return this.enabledItems()\n      .filter((action) => {\n        // Filter by location if specified\n        if (location) {\n          const actionLocation = this.getActionLocation(action, conversation);\n          if (actionLocation && actionLocation !== location) {\n            return false;\n          }\n        }\n        // Filter by visibility\n        if (action.visible && !runInInjectionContext(this.injector, () => action.visible?.(context))) {\n          return false;\n        }\n        return true;\n      })\n      .sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));\n  }\n\n  /**\n   * Resolve the display location for an action (supports dynamic location factories).\n   */\n  getActionLocation(\n    action: AXConversationInfoBarAction,\n    conversation: AXConversation,\n  ): 'inline' | 'menu' | undefined {\n    if (!action.location) {\n      return undefined;\n    }\n\n    if (typeof action.location === 'function') {\n      const locationFactory = action.location;\n      return runInInjectionContext(this.injector, () => locationFactory({ conversation }));\n    }\n\n    return action.location;\n  }\n\n  /**\n   * Get inline actions (toolbar buttons)\n   */\n  getInlineActions(conversation: AXConversation): AXConversationInfoBarAction[] {\n    return this.getActionsForConversation(conversation, 'inline');\n  }\n\n  /**\n   * Get menu actions (dropdown items)\n   */\n  getMenuActions(conversation: AXConversation): AXConversationInfoBarAction[] {\n    return this.getActionsForConversation(conversation, 'menu');\n  }\n\n  isActionEnabled(action: AXConversationInfoBarAction, context: AXConversationInfoBarActionContext): boolean {\n    if (action.enabled === false) {\n      return false;\n    }\n    if (action.enabledWhen) {\n      return runInInjectionContext(this.injector, () => action.enabledWhen?.(context)) !== false;\n    }\n    return true;\n  }\n\n  /**\n   * Get label for an action\n   */\n  getActionLabel(action: AXConversationInfoBarAction, conversation: AXConversation): string {\n    if (typeof action.label === 'function') {\n      const labelFactory = action.label;\n      return this.translation.translateSync(\n        runInInjectionContext(this.injector, () => labelFactory({ conversation })),\n      );\n    }\n    return this.translation.translateSync(action.label);\n  }\n\n  /**\n   * Get icon for an action\n   */\n  getActionIcon(action: AXConversationInfoBarAction, conversation: AXConversation): string | undefined {\n    if (!action.icon) return undefined;\n\n    if (typeof action.icon === 'function') {\n      const iconFactory = action.icon;\n      return runInInjectionContext(this.injector, () => iconFactory({ conversation }));\n    }\n    return action.icon;\n  }\n\n  /**\n   * Get tooltip for an action\n   */\n  getActionTooltip(action: AXConversationInfoBarAction, conversation: AXConversation): string | undefined {\n    if (!action.tooltip) return undefined;\n\n    if (typeof action.tooltip === 'function') {\n      const tooltipFactory = action.tooltip;\n      return this.translation.translateSync(\n        runInInjectionContext(this.injector, () => tooltipFactory({ conversation })),\n      );\n    }\n    return this.translation.translateSync(action.tooltip);\n  }\n}\n","/**\n * Message Action Registry\n * Register custom actions that can be performed on messages\n */\n\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { computed, inject, Injectable, Injector, runInInjectionContext, signal } from '@angular/core';\nimport { AXConversationMessage, AXConversationParticipant } from '../models';\nimport { AX_CONVERSATION_DEFAULT_MESSAGE_ACTIONS, AX_CONVERSATION_REGISTRY_CONFIG } from '../tokens/registry-config.tokens';\nimport type { AXConversationRegistryItem } from './base-registry.abstract';\nimport { AXConversationMessageRendererComponent } from './message-renderer.registry';\n\n/**\n * Action context provided to handlers\n */\nexport interface AXConversationMessageActionContext {\n  /** The message */\n  message: AXConversationMessage;\n\n  /** Current user */\n  currentUser: AXConversationParticipant;\n\n  /** All conversation participants */\n  participants: AXConversationParticipant[];\n\n  /** Mounted message renderer for this row (see {@link AXConversationMessageRendererComponent.copy}). */\n  renderer?: AXConversationMessageRendererComponent;\n\n  /** Custom context data */\n  custom?: Record<string, unknown>;\n}\n\n/**\n * Message action registration\n */\nexport interface AXConversationMessageAction extends Omit<AXConversationRegistryItem, 'enabled'> {\n  /** Display label */\n  label: string;\n\n  /** Icon name/class */\n  icon?: string;\n\n  /** Show as inline button */\n  showInline?: boolean;\n\n  /** Visibility condition */\n  visible: (message: AXConversationMessage, currentUser: AXConversationParticipant) => boolean;\n\n  /** Enabled condition */\n  enabled: (message: AXConversationMessage, currentUser: AXConversationParticipant) => boolean;\n\n  /** Action handler */\n  handler: (context: AXConversationMessageActionContext) => void | Promise<void>;\n\n  /** Confirmation message (if required) */\n  confirmMessage?: string;\n\n  /** Keyboard shortcut */\n  shortcut?: string;\n\n  /** Custom class for styling */\n  className?: string;\n\n  /** Destructive action (shows warning) */\n  destructive?: boolean;\n}\n\n/**\n * Message Action Registry Service\n */\n@Injectable()\nexport class AXConversationMessageActionRegistry {\n  private readonly _actions = signal<AXConversationMessageAction[]>([]);\n  private readonly translation = inject(AXTranslationService);\n  private readonly injector = inject(Injector);\n\n  constructor() {\n    // Register default actions from individual token\n    const defaultActions = inject(AX_CONVERSATION_DEFAULT_MESSAGE_ACTIONS, { optional: true });\n    if (defaultActions) {\n      defaultActions.forEach((action) => this.register(action));\n    }\n\n    // Register actions from AX_CONVERSATION_REGISTRY_CONFIG\n    const config = inject(AX_CONVERSATION_REGISTRY_CONFIG, { optional: true });\n    config?.messageActions?.forEach((action) => this.register(action));\n  }\n\n  /** All registered actions */\n  readonly actions = this._actions.asReadonly();\n\n  /** Actions sorted by priority */\n  readonly sortedActions = computed(() => [...this._actions()].sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0)));\n\n  /**\n   * Register a message action\n   */\n  register(action: AXConversationMessageAction): void {\n    // Validate action\n    if (!action.id) {\n      throw new Error('Message action must have an id');\n    }\n    if (!action.label) {\n      throw new Error('Message action must have a label');\n    }\n    if (!action.handler) {\n      throw new Error('Message action must have a handler');\n    }\n\n    // Check for duplicates\n    const existing = this._actions().find((a) => a.id === action.id);\n    if (existing) {\n      console.warn(`Message action \"${action.id}\" is already registered. Replacing...`);\n      this.unregister(action.id);\n    }\n\n    // Add to registry\n    this._actions.update((actions) => [...actions, action]);\n  }\n\n  /**\n   * Unregister a message action\n   */\n  unregister(id: string): void {\n    this._actions.update((actions) => actions.filter((a) => a.id !== id));\n  }\n\n  /**\n   * Get all actions for a specific message\n   */\n  getActions(message: AXConversationMessage, currentUser: AXConversationParticipant): AXConversationMessageAction[] {\n    return this.sortedActions().filter(\n      (action) =>\n        runInInjectionContext(this.injector, () => action.visible(message, currentUser)) &&\n        runInInjectionContext(this.injector, () => action.enabled(message, currentUser)),\n    );\n  }\n\n  /**\n   * Get menu actions for a message\n   */\n  getMenuActions(message: AXConversationMessage, currentUser: AXConversationParticipant): AXConversationMessageAction[] {\n    return this.getActions(message, currentUser);\n  }\n\n  /** Whether an action is enabled (safe to call outside an injection context). */\n  isActionEnabled(action: AXConversationMessageAction, message: AXConversationMessage, currentUser: AXConversationParticipant): boolean {\n    return runInInjectionContext(this.injector, () => action.enabled(message, currentUser));\n  }\n\n  getActionLabel(action: AXConversationMessageAction): string {\n    return this.translation.translateSync(action.label);\n  }\n\n  /**\n   * Get inline actions for a message\n   */\n  getInlineActions(message: AXConversationMessage, currentUser: AXConversationParticipant): AXConversationMessageAction[] {\n    return this.getActions(message, currentUser).filter((action) => action.showInline === true);\n  }\n\n  /**\n   * Get action by ID\n   */\n  getActionById(id: string): AXConversationMessageAction | undefined {\n    return this._actions().find((a) => a.id === id);\n  }\n\n  /**\n   * Execute an action\n   */\n  async executeAction(actionId: string, context: AXConversationMessageActionContext): Promise<void> {\n    const action = this.getActionById(actionId);\n    if (!action) {\n      throw new Error(`Action \"${actionId}\" not found`);\n    }\n\n    // Check if enabled\n    if (!runInInjectionContext(this.injector, () => action.enabled(context.message, context.currentUser))) {\n      throw new Error(`Action \"${actionId}\" is not enabled`);\n    }\n\n    // Execute handler\n    await runInInjectionContext(this.injector, () => action.handler(context));\n  }\n\n  /**\n   * Clear all actions\n   */\n  clear(): void {\n    this._actions.set([]);\n  }\n}\n","/**\n * Message Renderer Registry\n * Register custom message renderers for different message types\n */\n\nimport { computed, inject, Injectable, signal, type InputSignal, type Signal, Type } from '@angular/core';\nimport type { AXConversationMessage, AXConversationMessageStatus } from '../models';\nimport { AX_CONVERSATION_DEFAULT_MESSAGE_RENDERERS, AX_CONVERSATION_REGISTRY_CONFIG } from '../tokens';\nimport { AXConversationComposerActionRegistry, type AXConversationComposerAction } from './composer-action.registry';\n\n/**\n * Message renderer capabilities\n */\nexport interface AXConversationMessageRendererCapabilities {\n  /** Supports reactions */\n  supportsReactions: boolean;\n\n  /** Supports replies */\n  supportsReplies: boolean;\n\n  /** Supports editing */\n  supportsEdit: boolean;\n\n  /** Supports forwarding */\n  supportsForward: boolean;\n\n  /** Supports selection */\n  supportsSelection: boolean;\n\n  /** Custom capabilities */\n  custom?: Record<string, boolean>;\n}\n\n/**\n * Remote or binary content lifecycle inside a message renderer (image load, audio decode, etc.).\n * Use `none` when the renderer has no separate load phase (text, file row, etc.).\n */\nexport type AXConversationMessageRendererContentState = 'none' | 'loading' | 'ready' | 'error';\n\n/**\n * Combined state for a chat message renderer: delivery pipeline plus optional content load.\n */\nexport interface AXConversationMessageRendererState {\n  /** Mirrors `message.status` (sending, sent, delivered, read, failed). */\n  deliveryStatus: AXConversationMessageStatus;\n  /** Media / rich content load; set to `error` from `(error)` handlers on img, audio, video, etc. */\n  contentState: AXConversationMessageRendererContentState;\n}\n\n/**\n * Contract for components used as {@link AXConversationMessageRenderer.component}.\n * The message list passes `{ message }`; each view exposes `rendererState` for templates and tooling.\n */\nexport interface AXConversationMessageRendererComponent {\n  readonly message: InputSignal<AXConversationMessage>;\n  readonly rendererState: Signal<AXConversationMessageRendererState>;\n  /** Plain-text copy for this message (does not write to the clipboard). */\n  copy?(): string | Promise<string>;\n}\n\n/**\n * Contract for components used as {@link AXConversationMessageRenderer.infoBarBanner}.\n * Conversation shell passes at least `{ message }`; renderers can pass additional inputs.\n */\nexport interface AXConversationMessageInfoBarBannerComponent {\n  readonly message: InputSignal<AXConversationMessage>;\n}\n\n/**\n * Message renderer registration\n */\nexport interface AXConversationMessageRenderer {\n  /** Unique type identifier */\n  type: string;\n\n  /** Angular component to render this message type */\n  component?: Type<AXConversationMessageRendererComponent>;\n\n  /** Lazy loader for the renderer component */\n  componentLoader?: () => Promise<Type<AXConversationMessageRendererComponent>>;\n\n  /**\n   * Optional component rendered as a dismissible banner under info-bar.\n   * Useful for active/interactive message states (e.g. voice playback progress).\n   */\n  infoBarBanner?: Type<AXConversationMessageInfoBarBannerComponent>;\n\n  /** Lazy loader for the info-bar banner component */\n  infoBarBannerLoader?: () => Promise<Type<AXConversationMessageInfoBarBannerComponent>>;\n\n  /** Function to determine if this renderer can handle a message */\n  canHandle: (message: AXConversationMessage) => boolean;\n\n  /** Renderer capabilities */\n  capabilities: AXConversationMessageRendererCapabilities;\n\n  /** Display name */\n  displayName?: string;\n\n  /** Icon name/class */\n  icon?: string;\n\n  /** Linked file type catalog name (for utility APIs like preview/duration). */\n  fileType?: string;\n\n  /**\n   * Optional composer actions co-located with this message type (e.g. pickers that produce this message).\n   * Registered with {@link AXConversationComposerActionRegistry} when the renderer is registered.\n   * Use `AXConversationRegistryConfiguration.composerActions` for actions not tied to a single message renderer.\n   */\n  composerActions?: AXConversationComposerAction[];\n}\n\n/**\n * Message Renderer Registry Service\n */\n@Injectable()\nexport class AXConversationMessageRendererRegistry {\n  private readonly _renderers = signal<AXConversationMessageRenderer[]>([]);\n  private readonly _composerActions = inject(AXConversationComposerActionRegistry);\n\n  constructor() {\n    void this.registerBuiltInRenderers();\n\n    // Register additional renderers from token (optional)\n    const defaultRenderers = inject(AX_CONVERSATION_DEFAULT_MESSAGE_RENDERERS, { optional: true });\n    defaultRenderers?.forEach((renderer) => this.register(renderer));\n\n    // Register renderers from AX_CONVERSATION_REGISTRY_CONFIG (optional)\n    const config = inject(AX_CONVERSATION_REGISTRY_CONFIG, { optional: true });\n    config?.messageRenderers?.forEach((renderer) => this.register(renderer));\n  }\n\n  private async registerBuiltInRenderers(): Promise<void> {\n    const [text, system, fallback] = await Promise.all([\n      import('../plugins/message-list/message-renderers/text-renderer.plugin'),\n      import('../plugins/message-list/message-renderers/system-renderer.plugin'),\n      import('../plugins/message-list/message-renderers/fallback-renderer.plugin'),\n    ]);\n    this.registerBuiltInRendererIfMissing(text.AX_CONVERSATION_TEXT_RENDERER);\n    this.registerBuiltInRendererIfMissing(system.AX_CONVERSATION_SYSTEM_RENDERER);\n    this.registerBuiltInRendererIfMissing(fallback.AX_CONVERSATION_FALLBACK_RENDERER);\n  }\n\n  private registerBuiltInRendererIfMissing(renderer: AXConversationMessageRenderer): void {\n    if (this._renderers().some((existing) => existing.type === renderer.type)) {\n      return;\n    }\n    this.register(renderer);\n  }\n\n  /** All registered renderers */\n  readonly renderers = this._renderers.asReadonly();\n\n  /** Renderers sorted by priority (highest first) */\n  readonly sortedRenderers = computed(() => [...this._renderers()]);\n\n  /**\n   * Register a message renderer\n   */\n  register(renderer: AXConversationMessageRenderer): void {\n    // Validate renderer\n    if (!renderer.type) {\n      throw new Error('Message renderer must have a type');\n    }\n    if (!renderer.component && !renderer.componentLoader) {\n      throw new Error('Message renderer must have a component or componentLoader');\n    }\n    if (!renderer.canHandle) {\n      throw new Error('Message renderer must have a canHandle function');\n    }\n\n    // Check for duplicates\n    const existing = this._renderers().find((r) => r.type === renderer.type);\n    if (existing) {\n      console.warn(`Message renderer for type \"${renderer.type}\" is already registered. Replacing...`);\n      this.unregister(renderer.type);\n    }\n\n    renderer.composerActions?.forEach((action) => this._composerActions.register(action));\n\n    // Add to registry\n    this._renderers.update((renderers) => [...renderers, renderer]);\n  }\n\n  /**\n   * Unregister a message renderer by type\n   */\n  unregister(type: string): void {\n    this._renderers.update((renderers) => renderers.filter((r) => r.type !== type));\n  }\n\n  /**\n   * Get renderer for a specific message\n   */\n  getRenderer(message: AXConversationMessage): AXConversationMessageRenderer | undefined {\n    const sorted = this.sortedRenderers();\n    return sorted.find((renderer) => renderer.type === message.type);\n  }\n\n  /**\n   * Get renderer by type\n   */\n  getRendererByType(type: string): AXConversationMessageRenderer | undefined {\n    return this._renderers().find((r) => r.type === type);\n  }\n\n  /**\n   * Check if a message type is supported\n   */\n  isSupported(message: AXConversationMessage): boolean {\n    return this.getRenderer(message) !== undefined;\n  }\n\n  /**\n   * Get all registered types\n   */\n  getTypes(): string[] {\n    return this._renderers().map((r) => r.type);\n  }\n\n  /**\n   * Clear all renderers\n   */\n  clear(): void {\n    this._renderers.set([]);\n  }\n}\n","/** Unified access to conversation registries (renderers, actions, tabs). */\n\nimport { inject, Injectable } from '@angular/core';\nimport { AXConversationComposerActionRegistry } from '../registries/composer-action.registry';\nimport { AXConversationComposerTabRegistry } from '../registries/composer-tab.registry';\nimport { AXConversationItemActionRegistry } from '../registries/conversation-item-action.registry';\nimport { AXConversationTabRegistry } from '../registries/conversation-tab.registry';\nimport { AXConversationInfoBarActionRegistry } from '../registries/info-bar-action.registry';\nimport { AXConversationMessageActionRegistry } from '../registries/message-action.registry';\nimport { AXConversationMessageRendererRegistry } from '../registries/message-renderer.registry';\n\n/**\n * Central Registry Service\n * Provides unified access to all registries\n *\n * This service is now pure - all default features are plugins.\n * Use tokens to register plugins in your app configuration.\n */\n@Injectable()\nexport class AXConversationRegistryService {\n  /** Message renderer registry */\n  readonly messageRenderers = inject(AXConversationMessageRendererRegistry);\n\n  /** Message action registry */\n  readonly messageActions = inject(AXConversationMessageActionRegistry);\n\n  /** Composer tab registry */\n  readonly composerTabs = inject(AXConversationComposerTabRegistry);\n\n  /** Composer action registry */\n  readonly composerActions = inject(AXConversationComposerActionRegistry);\n\n  /** Conversation tab registry */\n  readonly conversationTabs = inject(AXConversationTabRegistry);\n\n  /** Info bar action registry */\n  readonly infoBarActions = inject(AXConversationInfoBarActionRegistry);\n\n  /** Conversation item action registry */\n  readonly conversationItemActions = inject(AXConversationItemActionRegistry);\n\n  /**\n   * Clear all registries\n   */\n  clearAll(): void {\n    this.messageRenderers.clear();\n    this.messageActions.clear();\n    this.composerTabs.clear();\n    this.composerActions.clear();\n    this.conversationTabs.clear();\n    this.infoBarActions.clear();\n    this.conversationItemActions.clear();\n  }\n}\n","/**\n * Conversation Service\n * Main service for managing conversations, messages, and real-time updates\n *\n * All operations include comprehensive error handling with try-catch blocks\n */\n\nimport { AXUploaderService } from '@acorex/cdk/uploader';\nimport { AXDialogService } from '@acorex/components/dialog';\nimport { AXPopupService } from '@acorex/components/popup';\nimport { AXFileService } from '@acorex/core/file';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { computed, DestroyRef, inject, Injectable, PLATFORM_ID, signal } from '@angular/core';\nimport { catchError, EMPTY, Subject, takeUntil } from 'rxjs';\nimport type {\n  AXConversation,\n  AXConversationMessage,\n  AXConversationMessagePayload,\n  AXConversationMetadata,\n  AXConversationPresenceUpdate,\n  AXConversationRoomPreferences,\n  AXConversationSendMessageCommand,\n  AXConversationType,\n  AXConversationTypingIndicator,\n  AXConversationUser,\n  AXConversationUserPresence,\n} from '../models';\nimport type {\n  AXConversationSendMessageOptions,\n  AXConversationUploaderReference,\n  AXConversationUploaderResult,\n  AXConversationUploadOptions,\n} from '../models/conversation-upload.types';\nimport { resolveConversationMessageFileType } from '../models/message-file-type-catalog';\nimport { AX_CONVERSATION_CONFIG } from '../tokens';\nimport { resolveConversationPeerUserId } from '../utils/avatar-context.utils';\nimport {\n  AX_CONVERSATION_DEFAULT_GROUP_ICON,\n  findExistingPrivateConversation,\n  resolveConversationForViewer,\n} from '../utils/conversation-display.utils';\nimport { normalizeMessagePayloadAsync } from '../utils/message-payload-normalize';\nimport {\n  validateConversationId,\n  validateMessagePayload,\n  validateMessageText,\n  validateMessageType,\n} from '../utils/validation.utils';\nimport {\n  AXConversationApi,\n  AXConversationApiLoggerService,\n  AXConversationMessageApi,\n  AXConversationRealtimeApi,\n  AXConversationUpdateData,\n  AXConversationUserApi,\n  AXConversationUserSearchFilters,\n  type AXConversationApiName,\n} from './api';\nimport type {\n  AXConversationPaginatedResult,\n  AXConversationPagination,\n  AXConversationPaginationState,\n  AXConversationPresenceStatus,\n} from './api/api-types';\nimport { AXConversationComposerGenerationStateService } from './composer-generation-state.service';\nimport {\n  applyLocalPreview,\n  createLocalPreviewUrl,\n  mergeUploadResult,\n  revokeObjectUrl,\n} from './conversation-media-send.loader';\nimport { AXConversationState } from './conversation-state';\nimport { AXConversationErrorHandlerService } from './error-handler.service';\nimport { AXConversationRegistryService } from './registry.service';\n\n/** Result of loading a message page (newest-first APIs, merged ascending in the store). */\nexport interface AXConversationLoadMessagesResult {\n  items: AXConversationMessage[];\n  hasMore: boolean;\n  page: number;\n  nextCursor?: string;\n}\n\n/**\n * Main Conversation Service\n *\n * This service orchestrates all conversation operations with:\n * - Comprehensive error handling\n * - Real-time event subscriptions\n * - Optimistic UI updates\n * - Automatic rollback on failures\n */\n@Injectable()\nexport class AXConversationService {\n  private static normalizeOptionalString(value: unknown): string | undefined {\n    if (typeof value !== 'string') {\n      return undefined;\n    }\n    const normalized = value.trim();\n    return normalized.length > 0 ? normalized : undefined;\n  }\n\n  private readonly config = inject(AX_CONVERSATION_CONFIG);\n  private readonly state = new AXConversationState(this.config);\n\n  // New separated APIs\n  readonly userApi = inject(AXConversationUserApi);\n  readonly conversationApi = inject(AXConversationApi);\n  readonly messageApi = inject(AXConversationMessageApi);\n  readonly realtimeApi = inject(AXConversationRealtimeApi, { optional: true });\n  readonly uploader = inject(AXUploaderService);\n  private readonly fileService = inject(AXFileService);\n  private readonly platformId = inject(PLATFORM_ID);\n\n  private readonly errorHandler = inject(AXConversationErrorHandlerService);\n  private readonly apiLogger = inject(AXConversationApiLoggerService);\n  readonly dialogService = inject(AXDialogService);\n  readonly popupService = inject(AXPopupService);\n  private readonly translation = inject(AXTranslationService);\n  private readonly destroyRef = inject(DestroyRef);\n  private readonly destroy$ = new Subject<void>();\n\n  /** Registry service - exposed for child services */\n  readonly registry = inject(AXConversationRegistryService);\n\n  private readonly composerGenerationState = inject(AXConversationComposerGenerationStateService);\n\n  /** Whether the composer primary button is in cancel (generation) mode. */\n  readonly isGenerating = this.composerGenerationState.isGenerating;\n\n  /** Whether cancel cleanup is in progress. */\n  readonly isStopping = this.composerGenerationState.isStopping;\n\n  /** Emits when the user cancels an in-progress generation from the composer. */\n  readonly onGenerationCancelled = this.composerGenerationState.onCancelled;\n\n  // State signals\n  private readonly _activeConversationId = signal<string | null>(null);\n  private readonly _loading = signal<boolean>(false);\n  private readonly _loadingActiveMessages = signal<boolean>(false);\n  private readonly _isForwardingMessage = signal<boolean>(false);\n  private readonly _error = signal<Error | null>(null);\n\n  private readonly _conversationsPagination = signal<AXConversationPaginationState>({ page: 0, hasMore: true });\n  private readonly _messagesPaginationByConversation = signal<Map<string, AXConversationPaginationState>>(new Map());\n\n  // Event subjects\n  private readonly _messageReceived$ = new Subject<AXConversationMessage>();\n  private readonly _messageUpdated$ = new Subject<AXConversationMessage>();\n  private readonly _messageDeleted$ = new Subject<string>();\n  private readonly _typingIndicator$ = new Subject<AXConversationTypingIndicator>();\n  private readonly _presenceUpdate$ = new Subject<AXConversationPresenceUpdate>();\n\n  /** All conversations (viewer-scoped display titles for private 1v1 chats) */\n  readonly conversations = computed(() => {\n    const currentUserId = this._currentUser()?.id;\n    return this.state.conversations().map((conversation) => resolveConversationForViewer(conversation, currentUserId));\n  });\n\n  /** Active conversation ID */\n  readonly activeConversationId = this._activeConversationId.asReadonly();\n\n  /** Active conversation */\n  readonly activeConversation = computed(() => {\n    const id = this._activeConversationId();\n    if (!id) {\n      return null;\n    }\n    const conversation = this.state.getConversation(id);\n    return conversation ? resolveConversationForViewer(conversation, this._currentUser()?.id) : null;\n  });\n\n  /** Messages for active conversation */\n  readonly activeMessages = computed(() => {\n    const convId = this._activeConversationId();\n    return convId ? this.state.getConversationMessages(convId) : [];\n  });\n\n  /** Loading state (conversation list initial load) */\n  readonly loading = this._loading.asReadonly();\n\n  /** Loading state for the active conversation's message history */\n  readonly loadingActiveMessages = this._loadingActiveMessages.asReadonly();\n\n  /** Whether a message forward operation is in progress. */\n  readonly isForwardingMessage = this._isForwardingMessage.asReadonly();\n\n  /** Sidebar conversation list pagination */\n  readonly conversationsPagination = this._conversationsPagination.asReadonly();\n\n  /** Active conversation message pagination */\n  readonly activeMessagesPagination = computed((): AXConversationPaginationState => {\n    const convId = this._activeConversationId();\n    if (!convId) {\n      return { page: 0, hasMore: true };\n    }\n    return this._messagesPaginationByConversation().get(convId) ?? { page: 0, hasMore: true };\n  });\n\n  /** Error state */\n  readonly error = this._error.asReadonly();\n\n  /** Error stream */\n  readonly errors$ = this.errorHandler.errors$;\n\n  // Event observables\n  readonly onMessageReceived = this._messageReceived$.asObservable();\n  readonly onMessageUpdated = this._messageUpdated$.asObservable();\n  readonly onMessageDeleted = this._messageDeleted$.asObservable();\n  readonly onTypingIndicator = this._typingIndicator$.asObservable();\n  readonly onPresenceChange = this._presenceUpdate$.asObservable();\n\n  // Message count refresh event (emits messageId when counts need refresh)\n\n  // Current user cache\n  private _currentUser = signal<AXConversationUser | null>(null);\n  readonly currentUser = this._currentUser.asReadonly();\n\n  readonly userPresenceMap = computed(() => this.state.userPresenceMap());\n\n  readonly presenceTimeTick = computed(() => {\n    this.state.presenceTimeTick();\n    return this.state.userPresenceMap();\n  });\n\n  readonly typingRevision = computed(() => this.state.typingRevision());\n\n  /** One-time async initialization (connect, user, conversations, realtime). */\n  private initPromise: Promise<void> | null = null;\n\n  /** Generation counter — stale page-0 loads are ignored after conversation switches. */\n  private messageLoadGeneration = 0;\n\n  /** Bumps when a conversation is created while a list load is in flight. */\n  private conversationListLoadGeneration = 0;\n\n  /** Batched read-receipt queue keyed by conversation ID. */\n  private readonly readQueue = new Map<string, Set<string>>();\n  private readFlushHandle: ReturnType<typeof setTimeout> | undefined;\n\n  private presenceTickHandle?: ReturnType<typeof setInterval>;\n  private typingPruneHandle?: ReturnType<typeof setInterval>;\n\n  /** Outgoing typing indicator throttle state (composer -> API). */\n  private readonly outgoingTypingLastEmitAt = new Map<string, number>();\n  private readonly outgoingTypingActive = new Map<string, boolean>();\n  private readonly outgoingTypingStopHandles = new Map<string, ReturnType<typeof setTimeout>>();\n\n  /** Session cache for available reaction emojis. */\n  private availableReactionsCache: string[] | null = null;\n  private availableReactionsPromise: Promise<string[]> | null = null;\n\n  constructor() {\n    this.presenceTickHandle = setInterval(() => this.state.bumpPresenceTimeTick(), 60_000);\n    this.typingPruneHandle = setInterval(() => this.state.pruneExpiredTyping(), 1_000);\n\n    this.destroyRef.onDestroy(() => {\n      this.destroy$.next();\n      this.destroy$.complete();\n      if (this.readFlushHandle) {\n        clearTimeout(this.readFlushHandle);\n      }\n      if (this.presenceTickHandle) {\n        clearInterval(this.presenceTickHandle);\n      }\n      if (this.typingPruneHandle) {\n        clearInterval(this.typingPruneHandle);\n      }\n      for (const conversationId of [...this.outgoingTypingActive.keys()]) {\n        this.notifyComposerStoppedTyping(conversationId);\n      }\n      for (const handle of this.outgoingTypingStopHandles.values()) {\n        clearTimeout(handle);\n      }\n      this.outgoingTypingStopHandles.clear();\n      void this.flushReadQueue();\n      void this.userApi.updatePresence('offline').catch(() => undefined);\n    });\n  }\n\n  /** Log and invoke an async API method from AXConversationService. */\n  private callApi<T>(\n    serviceMethod: string,\n    api: AXConversationApiName,\n    apiMethod: string,\n    fn: () => Promise<T>,\n    ...context: unknown[]\n  ): Promise<T> {\n    this.apiLogger.log({ serviceMethod, api, apiMethod, context });\n    return fn();\n  }\n\n  /** Log a sync API invocation (e.g. realtime observable subscriptions). */\n  private logApi(serviceMethod: string, api: AXConversationApiName, apiMethod: string, ...context: unknown[]): void {\n    this.apiLogger.log({ serviceMethod, api, apiMethod, context });\n  }\n\n  /**\n   * Ensures the service is initialized exactly once.\n   * Safe to call from container components or before any public API usage.\n   */\n  ensureInitialized(): Promise<void> {\n    if (!this.initPromise) {\n      this.initPromise = this.initializeService();\n    }\n    return this.initPromise;\n  }\n\n  /**\n   * Initialize the service\n   * Connects to API and loads initial data\n   */\n  private async initializeService(): Promise<void> {\n    try {\n      // Load current user\n      const currentUser = await this.callApi('initializeService', 'userApi', 'getCurrentUser', () =>\n        this.userApi.getCurrentUser(),\n      );\n      this._currentUser.set(currentUser);\n      if (currentUser.conversationPreferences) {\n        this.state.setRoomPreferencesBulk(currentUser.conversationPreferences);\n      }\n\n      // Subscribe to real-time events\n      this.subscribeToEvents();\n\n      void this.userApi.updatePresence('online').catch(() => undefined);\n\n      // Load initial data\n      await this.loadConversations();\n      await this.hydrateUserPresence();\n      await this.loadRoomPreferences();\n    } catch (error) {\n      const handledError = this.errorHandler.handle(error, 'initializeService');\n      this._error.set(new Error(handledError.message));\n    }\n  }\n\n  /**\n   * Subscribe to real-time events from {@link AXConversationRealtimeApi}.\n   * Binds every abstract subscription: messages (create/update/delete/status/read),\n   * conversations (create/update/delete), typing indicators, and presence.\n   */\n  private subscribeToEvents(): void {\n    // Skip if realtime API is not provided\n    if (!this.realtimeApi) {\n      return;\n    }\n    // Subscribe to message updates\n    this.realtimeApi\n      .subscribeToMessageUpdates()\n      .pipe(\n        takeUntil(this.destroy$),\n        catchError((error) => {\n          this.errorHandler.handle(error, 'subscribeToMessageUpdates');\n          return EMPTY; // Keep subscription alive\n        }),\n      )\n      .subscribe((message) => {\n        this.handleMessageUpdate(message);\n        this._messageUpdated$.next(message);\n      });\n\n    // Subscribe to message deletions\n    this.realtimeApi\n      .subscribeToMessageDeletions()\n      .pipe(\n        takeUntil(this.destroy$),\n        catchError((error) => {\n          this.errorHandler.handle(error, 'subscribeToMessageDeletions');\n          return EMPTY;\n        }),\n      )\n      .subscribe((messageId) => {\n        this.handleMessageDeletion(messageId);\n        this._messageDeleted$.next(messageId);\n      });\n\n    // Subscribe to typing indicators\n    this.realtimeApi\n      .subscribeToTypingIndicators('')\n      .pipe(\n        takeUntil(this.destroy$),\n        catchError((error) => {\n          this.errorHandler.handle(error, 'subscribeToTypingIndicators');\n          return EMPTY;\n        }),\n      )\n      .subscribe((indicator) => {\n        this.handleTypingIndicator(indicator);\n        this._typingIndicator$.next(indicator);\n      });\n\n    // Subscribe to presence updates\n    this.realtimeApi\n      .subscribeToPresenceUpdates()\n      .pipe(\n        takeUntil(this.destroy$),\n        catchError((error) => {\n          this.errorHandler.handle(error, 'subscribeToPresenceUpdates');\n          return EMPTY;\n        }),\n      )\n      .subscribe((update) => {\n        this.handlePresenceUpdate(update);\n        this._presenceUpdate$.next(update);\n      });\n\n    // Subscribe to conversation updates (for badge updates, last message, etc.)\n    this.realtimeApi\n      .subscribeToConversationUpdates()\n      .pipe(\n        takeUntil(this.destroy$),\n        catchError((error) => {\n          this.errorHandler.handle(error, 'subscribeToConversationUpdates');\n          return EMPTY;\n        }),\n      )\n      .subscribe((conversation) => {\n        this.handleConversationUpdate(conversation);\n      });\n\n    // Global message stream — backs message list even when the backend only pushes\n    // conversation.lastMessage updates or when per-conversation subscribe races loadMessages.\n    this.realtimeApi\n      .subscribeToMessages('')\n      .pipe(\n        takeUntil(this.destroy$),\n        catchError((error) => {\n          this.errorHandler.handle(error, 'subscribeToMessages');\n          return EMPTY;\n        }),\n      )\n      .subscribe((message) => {\n        this.handleNewMessage(message);\n        this._messageReceived$.next(message);\n      });\n\n    this.realtimeApi\n      .subscribeToConversationCreated()\n      .pipe(\n        takeUntil(this.destroy$),\n        catchError((error) => {\n          this.errorHandler.handle(error, 'subscribeToConversationCreated');\n          return EMPTY;\n        }),\n      )\n      .subscribe((conversation) => {\n        this.handleConversationCreated(conversation);\n      });\n\n    this.realtimeApi\n      .subscribeToConversationDeleted()\n      .pipe(\n        takeUntil(this.destroy$),\n        catchError((error) => {\n          this.errorHandler.handle(error, 'subscribeToConversationDeleted');\n          return EMPTY;\n        }),\n      )\n      .subscribe((conversationId) => {\n        this.handleConversationDeleted(conversationId);\n      });\n\n    this.realtimeApi\n      .subscribeToReadReceipts()\n      .pipe(\n        takeUntil(this.destroy$),\n        catchError((error) => {\n          this.errorHandler.handle(error, 'subscribeToReadReceipts');\n          return EMPTY;\n        }),\n      )\n      .subscribe((receipt) => {\n        this.handleReadReceipt(receipt);\n      });\n\n    this.realtimeApi\n      .subscribeToMessageStatusChanges()\n      .pipe(\n        takeUntil(this.destroy$),\n        catchError((error) => {\n          this.errorHandler.handle(error, 'subscribeToMessageStatusChanges');\n          return EMPTY;\n        }),\n      )\n      .subscribe((change) => {\n        this.handleMessageStatusChange(change);\n      });\n  }\n\n  getUserPresence(userId: string): AXConversationUserPresence | undefined {\n    return this.state.getUserPresence(userId);\n  }\n\n  getRoomPreferences(conversationId: string): AXConversationRoomPreferences {\n    return this.state.getRoomPreferences(conversationId);\n  }\n\n  isAnyoneTyping(conversationId: string): boolean {\n    return this.state.isAnyoneTyping(conversationId);\n  }\n\n  getActiveTypingUserIds(conversationId: string): string[] {\n    return this.state.getActiveTypingUserIds(conversationId);\n  }\n\n  getPeerPresence(conversation: AXConversation): AXConversationUserPresence | undefined {\n    const peerId = resolveConversationPeerUserId(conversation, this._currentUser()?.id);\n    return peerId ? this.getUserPresence(peerId) : undefined;\n  }\n\n  private async hydrateUserPresence(): Promise<void> {\n    const currentUserId = this._currentUser()?.id;\n    const userIds = new Set<string>();\n    for (const conversation of this.state.conversations()) {\n      for (const participant of conversation.participants) {\n        if (participant.id !== currentUserId) {\n          userIds.add(participant.id);\n        }\n      }\n    }\n    if (userIds.size === 0) {\n      return;\n    }\n    try {\n      const updates = await this.callApi(\n        'hydrateUserPresence',\n        'userApi',\n        'getUsersPresence',\n        () => this.userApi.getUsersPresence([...userIds]),\n        [...userIds],\n      );\n      this.state.bulkSetUserPresence(updates);\n    } catch (error) {\n      this.errorHandler.handle(error, 'hydrateUserPresence');\n    }\n  }\n\n  private async loadRoomPreferences(): Promise<void> {\n    try {\n      const preferences = await this.callApi('loadRoomPreferences', 'userApi', 'getConversationPreferences', () =>\n        this.userApi.getConversationPreferences(),\n      );\n      this.state.setRoomPreferencesBulk(preferences);\n    } catch (error) {\n      this.errorHandler.handle(error, 'loadRoomPreferences');\n    }\n  }\n\n  /**\n   * Load conversations from server\n   * Includes comprehensive error handling\n   */\n  async loadConversations(): Promise<void> {\n    this._loading.set(true);\n    this._error.set(null);\n    const loadGeneration = this.conversationListLoadGeneration;\n\n    try {\n      const pagination = {\n        page: 0,\n        pageSize: this.config.conversationPageSize,\n      };\n      const result = await this.callApi(\n        'loadConversations',\n        'conversationApi',\n        'getConversations',\n        () => this.conversationApi.getConversations(pagination, undefined),\n        pagination,\n        undefined,\n      );\n\n      if (loadGeneration !== this.conversationListLoadGeneration) {\n        // A create (or newer reload) started while this request was in flight — merge, do not replace.\n        this.state.addConversations(result.items);\n      } else {\n        this.state.setConversations(result.items);\n      }\n      this._conversationsPagination.set({\n        page: 0,\n        hasMore: result.hasMore,\n        nextCursor: result.nextCursor,\n      });\n      await this.hydrateUserPresence();\n    } catch (error) {\n      const handledError = this.errorHandler.handle(error, 'loadConversations');\n      this._error.set(new Error(handledError.message));\n    } finally {\n      this._loading.set(false);\n    }\n  }\n\n  /**\n   * Load more conversations (pagination)\n   * Returns true if there are more pages available\n   */\n  async loadMoreConversations(page: number): Promise<boolean> {\n    await this.ensureInitialized();\n    try {\n      const pagination = {\n        page,\n        pageSize: this.config.conversationPageSize,\n      };\n      const result = await this.callApi(\n        'loadMoreConversations',\n        'conversationApi',\n        'getConversations',\n        () => this.conversationApi.getConversations(pagination, undefined),\n        pagination,\n        undefined,\n      );\n\n      // Append new conversations to existing ones\n      if (result.items.length > 0) {\n        this.state.addConversations(result.items);\n      }\n\n      this._conversationsPagination.set({\n        page,\n        hasMore: result.hasMore,\n        nextCursor: result.nextCursor,\n      });\n\n      return result.hasMore;\n    } catch (error) {\n      this.errorHandler.handle(error, 'loadMoreConversations', { page });\n      return false;\n    }\n  }\n\n  /**\n   * Select a conversation and load page 0 of its message history.\n   */\n  async selectConversation(conversationId: string): Promise<void> {\n    await this.ensureInitialized();\n\n    const isAlreadyActive = this._activeConversationId() === conversationId;\n    const hasCachedMessages = this.state.getConversationMessages(conversationId).length > 0;\n\n    try {\n      if (!isAlreadyActive) {\n        this.messageLoadGeneration++;\n        this._activeConversationId.set(conversationId);\n      }\n\n      if (!isAlreadyActive || !hasCachedMessages) {\n        this._loadingActiveMessages.set(true);\n        try {\n          await this.loadMessages(conversationId, 0);\n        } finally {\n          this._loadingActiveMessages.set(false);\n        }\n      }\n\n      if (this.config.markConversationReadOnSelect) {\n        const conversation = this.state.getConversation(conversationId);\n        if (conversation && conversation.unreadCount > 0) {\n          void this.markConversationAsRead(conversationId);\n        }\n      }\n    } catch (error) {\n      this.errorHandler.handle(error, 'selectConversation', { conversationId });\n      throw error;\n    }\n  }\n\n  closeActiveConversation() {\n    if (this._activeConversationId()) {\n      this._activeConversationId.set(null);\n    }\n  }\n\n  /**\n   * Load messages for a conversation\n   * Fetches messages from server with request cancellation support\n   */\n  async loadMessages(conversationId: string, page = 0): Promise<AXConversationLoadMessagesResult> {\n    const empty: AXConversationLoadMessagesResult = { items: [], hasMore: false, page };\n    const loadGeneration = page === 0 ? this.messageLoadGeneration : null;\n\n    try {\n      const paginationState = this._messagesPaginationByConversation().get(conversationId);\n      const cursor = page > 0 ? paginationState?.nextCursor : undefined;\n\n      const messagePagination = {\n        page,\n        pageSize: this.config.messagePageSize,\n        cursor,\n      };\n      const result = await this.callApi(\n        'loadMessages',\n        'messageApi',\n        'getMessages',\n        () => this.messageApi.getMessages(conversationId, messagePagination),\n        conversationId,\n        messagePagination,\n      );\n\n      if (page === 0 && loadGeneration !== null && loadGeneration !== this.messageLoadGeneration) {\n        return empty;\n      }\n\n      if (page === 0) {\n        const pendingLocal = this.state\n          .getConversationMessages(conversationId)\n          .filter((m) => m.isLocal || m.status === 'sending');\n        const serverIds = new Set(result.items.map((m) => m.id));\n        const localsToKeep = pendingLocal.filter((m) => !serverIds.has(m.id));\n        this.state.setConversationMessages(conversationId, [...result.items, ...localsToKeep]);\n      } else if (result.items.length > 0) {\n        this.state.addMessages(result.items);\n      }\n\n      const pagination: AXConversationPaginationState = {\n        page,\n        hasMore: result.hasMore,\n        nextCursor: result.nextCursor,\n      };\n      this._messagesPaginationByConversation.update((map) => {\n        const next = new Map(map);\n        next.set(conversationId, pagination);\n        return next;\n      });\n\n      return { items: result.items, hasMore: result.hasMore, page, nextCursor: result.nextCursor };\n    } catch (error) {\n      this.errorHandler.handle(error, 'loadMessages', { conversationId, page });\n      return empty;\n    }\n  }\n\n  /** Reset sidebar conversation pagination (e.g. after filters change). */\n  resetConversationsPagination(): void {\n    this._conversationsPagination.set({ page: 0, hasMore: true });\n  }\n\n  /**\n   * Upload media for a conversation (composers and custom plugins).\n   */\n  uploadMedia(\n    source: File | Blob,\n    conversationId: string,\n    options?: Omit<AXConversationUploadOptions, 'metadata'> & {\n      metadata?: Record<string, unknown>;\n    },\n  ): Promise<AXConversationUploaderResult> {\n    const { fileName, mimeType, onProgress, signal, metadata } = options ?? {};\n    return this.uploader.upload({\n      source,\n      fileName,\n      mimeType,\n      onProgress,\n      signal,\n      metadata: { conversationId, ...metadata },\n    });\n  }\n\n  /**\n   * Resolve a media reference to a playback/download URL.\n   */\n  resolveMediaUrl(reference: AXConversationUploaderReference, signal?: AbortSignal): Promise<string> {\n    return this.uploader.resolvePlaybackUrl(reference, signal);\n  }\n\n  private resolveReplyTo(replyToId?: string): AXConversationMessage | undefined {\n    if (!replyToId) {\n      return undefined;\n    }\n    return this.state.getMessage(replyToId);\n  }\n\n  /**\n   * Send a message\n   * Uses optimistic UI updates - message appears immediately\n   * Pass `options.media` to upload a File/Blob before send (with optional progress and AbortSignal).\n   */\n  async sendMessage(\n    command: AXConversationSendMessageCommand,\n    options?: AXConversationSendMessageOptions,\n  ): Promise<void> {\n    const tempMessageId =\n      command.tempId ||\n      (typeof crypto !== 'undefined' && crypto.randomUUID\n        ? `temp-${crypto.randomUUID()}`\n        : `temp-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`);\n\n    const fileType = resolveConversationMessageFileType(command.type, command.fileType);\n    let sendCommand: AXConversationSendMessageCommand = {\n      ...command,\n      tempId: tempMessageId,\n      fileType,\n      payload: await normalizeMessagePayloadAsync(command.payload),\n    };\n    let localPreviewUrl: string | undefined = options?.localPreviewUrl;\n\n    if (options?.media) {\n      const { source, fileName, mimeType, onProgress, signal } = options.media;\n      localPreviewUrl ??= await createLocalPreviewUrl(this.fileService, this.platformId, source, command.type);\n\n      if (localPreviewUrl) {\n        sendCommand = {\n          ...sendCommand,\n          payload: await applyLocalPreview(command.type, sendCommand.payload, localPreviewUrl),\n        };\n      }\n\n      await this.validateMessageContent(sendCommand);\n\n      const tempMessage: AXConversationMessage = {\n        id: tempMessageId,\n        conversationId: command.conversationId,\n        senderId: this._currentUser()?.id ?? 'current-user',\n        type: command.type,\n        fileType,\n        timestamp: new Date(),\n        payload: sendCommand.payload,\n        status: 'sending',\n        reactions: [],\n        isLocal: true,\n        forwarded: command.forwarded,\n        forwardedFrom: command.forwardedFrom,\n        metadata: command.metadata,\n        replyTo: this.resolveReplyTo(sendCommand.replyToId),\n      };\n\n      this.state.addMessage(tempMessage);\n\n      try {\n        const uploadResult = await this.uploader.upload({\n          source,\n          fileName,\n          mimeType,\n          onProgress,\n          signal,\n          metadata: { conversationId: command.conversationId },\n        });\n\n        sendCommand = {\n          ...sendCommand,\n          payload: await mergeUploadResult(command.type, sendCommand.payload, uploadResult),\n        };\n\n        this.state.updateMessage(tempMessageId, { payload: sendCommand.payload });\n\n        const sentMessage = await this.callApi(\n          'sendMessage',\n          'messageApi',\n          'sendMessage',\n          () => this.messageApi.sendMessage(sendCommand),\n          sendCommand,\n        );\n        this.finalizeSentMessage(tempMessageId, sentMessage);\n\n        if (localPreviewUrl?.startsWith('blob:')) {\n          await revokeObjectUrl(this.platformId, localPreviewUrl);\n        }\n      } catch (error) {\n        this.state.updateMessage(tempMessageId, { status: 'failed' });\n        this.errorHandler.handle(error, 'sendMessage', {\n          conversationId: command.conversationId,\n          type: command.type,\n        });\n        throw error;\n      }\n\n      return;\n    }\n\n    await this.validateMessageContent(sendCommand);\n\n    try {\n      const tempMessage: AXConversationMessage = {\n        id: tempMessageId,\n        conversationId: command.conversationId,\n        senderId: this._currentUser()?.id ?? 'current-user',\n        type: command.type,\n        fileType,\n        timestamp: new Date(),\n        payload: sendCommand.payload,\n        status: 'sending',\n        reactions: [],\n        isLocal: true,\n        forwarded: command.forwarded,\n        forwardedFrom: command.forwardedFrom,\n        metadata: command.metadata,\n        replyTo: this.resolveReplyTo(sendCommand.replyToId),\n      };\n\n      this.state.addMessage(tempMessage);\n\n      const sentMessage = await this.callApi(\n        'sendMessage',\n        'messageApi',\n        'sendMessage',\n        () => this.messageApi.sendMessage(sendCommand),\n        sendCommand,\n      );\n\n      this.finalizeSentMessage(tempMessageId, sentMessage);\n    } catch (error) {\n      this.state.updateMessage(tempMessageId, { status: 'failed' });\n\n      this.errorHandler.handle(error, 'sendMessage', {\n        conversationId: command.conversationId,\n        type: command.type,\n      });\n      throw error;\n    }\n  }\n\n  /**\n   * Retry a failed message\n   */\n  async retryFailedMessage(messageId: string): Promise<void> {\n    const message = this.state.getMessage(messageId);\n    if (!message || message.status !== 'failed') {\n      return;\n    }\n\n    // Update status to sending\n    this.state.updateMessage(messageId, { status: 'sending' });\n\n    try {\n      // Recreate command from message\n      const command: AXConversationSendMessageCommand = {\n        conversationId: message.conversationId,\n        type: message.type,\n        fileType: message.fileType ?? resolveConversationMessageFileType(message.type),\n        payload: message.payload,\n        tempId: messageId,\n        forwarded: message.forwarded,\n        forwardedFrom: message.forwardedFrom,\n        metadata: message.metadata,\n      };\n\n      // Send to server\n      const sentMessage = await this.callApi(\n        'retryFailedMessage',\n        'messageApi',\n        'sendMessage',\n        () => this.messageApi.sendMessage(command),\n        command,\n      );\n\n      // Replace with real message (keep same DOM row when server echoes tempId)\n      this.finalizeSentMessage(messageId, sentMessage);\n    } catch (error) {\n      // Mark as failed again\n      this.state.updateMessage(messageId, { status: 'failed' });\n      this.errorHandler.handle(error, 'retryFailedMessage', { messageId });\n      throw error;\n    }\n  }\n\n  /**\n   * Edit a message\n   * Updates message locally and syncs with server\n   */\n  async editMessage(messageId: string, payload: AXConversationMessagePayload): Promise<void> {\n    const originalMessage = this.state.getMessage(messageId);\n    if (!originalMessage) {\n      throw new Error(`Message not found: ${messageId}`);\n    }\n\n    try {\n      const optimisticMessage: AXConversationMessage = {\n        ...originalMessage,\n        payload,\n        editedAt: new Date(),\n      };\n      this.state.updateMessage(messageId, {\n        payload,\n        editedAt: optimisticMessage.editedAt,\n      });\n      this.syncLastMessageIfRelevant(optimisticMessage);\n\n      // Sync with server\n      const updatedMessage = await this.callApi(\n        'editMessage',\n        'messageApi',\n        'editMessage',\n        () => this.messageApi.editMessage(messageId, payload),\n        messageId,\n        payload,\n      );\n      this.state.updateMessage(messageId, updatedMessage);\n      this.syncLastMessageIfRelevant(updatedMessage);\n    } catch (error) {\n      // Rollback on failure\n      if (originalMessage) {\n        this.state.updateMessage(messageId, {\n          payload: originalMessage.payload,\n          editedAt: originalMessage.editedAt,\n        });\n        this.syncLastMessageIfRelevant(originalMessage);\n      }\n\n      this.errorHandler.handle(error, 'editMessage', { messageId });\n      throw error;\n    }\n  }\n\n  /**\n   * Delete a message\n   * Shows confirmation dialog, then deletes locally first (optimistic), then syncs with server\n   */\n  async deleteMessage(messageId: string, forEveryone = false): Promise<void> {\n    // Show confirmation dialog\n    const result = await this.dialogService.confirm(\n      this.translation.translateSync('@acorex:chat.dialog.delete-message.title'),\n      forEveryone\n        ? this.translation.translateSync('@acorex:chat.dialog.delete-message.for-everyone')\n        : this.translation.translateSync('@acorex:chat.dialog.delete-message.default'),\n      'danger',\n    );\n\n    // User cancelled\n    if (!result.result) {\n      return;\n    }\n\n    // Store message for rollback\n    const message = this.state.getMessage(messageId);\n\n    try {\n      const conversationId = message?.conversationId;\n\n      // Optimistic delete\n      this.state.deleteMessage(messageId);\n      if (conversationId) {\n        this.refreshConversationLastMessage(conversationId);\n      }\n\n      // Sync with server\n      await this.callApi(\n        'deleteMessage',\n        'messageApi',\n        'deleteMessage',\n        () => this.messageApi.deleteMessage(messageId, forEveryone),\n        messageId,\n        forEveryone,\n      );\n    } catch (error) {\n      // Rollback on failure\n      if (message) {\n        this.state.addMessage(message);\n        this.syncLastMessageIfRelevant(message);\n      }\n\n      this.errorHandler.handle(error, 'deleteMessage', { messageId, forEveryone });\n      throw error;\n    }\n  }\n\n  /**\n   * React to a message\n   * Adds reaction optimistically, server update comes via subscription\n   */\n  async reactToMessage(messageId: string, emoji: string): Promise<void> {\n    const message = this.state.getMessage(messageId);\n    const currentUserId = this._currentUser()?.id;\n    if (!message || !currentUserId) {\n      return;\n    }\n\n    const originalReactions = [...message.reactions];\n    const hasReaction = message.reactions.some((r) => r.emoji === emoji && r.userId === currentUserId);\n    const optimisticReactions = hasReaction\n      ? message.reactions.filter((r) => !(r.emoji === emoji && r.userId === currentUserId))\n      : [...message.reactions, { emoji, userId: currentUserId, timestamp: new Date() }];\n\n    this.state.updateMessage(messageId, { reactions: optimisticReactions });\n\n    try {\n      await this.callApi(\n        'reactToMessage',\n        'messageApi',\n        'addReaction',\n        () => this.messageApi.addReaction(messageId, emoji),\n        messageId,\n        emoji,\n      );\n    } catch (error) {\n      this.state.updateMessage(messageId, { reactions: originalReactions });\n      this.errorHandler.handle(error, 'reactToMessage', { messageId, emoji });\n      throw error;\n    }\n  }\n\n  /**\n   * Get available reaction emojis from API\n   * Returns default reactions on error\n   */\n  async getAvailableReactions(): Promise<string[]> {\n    if (this.availableReactionsCache) {\n      return this.availableReactionsCache;\n    }\n\n    if (!this.availableReactionsPromise) {\n      this.availableReactionsPromise = this.callApi(\n        'getAvailableReactions',\n        'messageApi',\n        'getAvailableReactions',\n        () => this.messageApi.getAvailableReactions(),\n      )\n        .then((reactions) => {\n          this.availableReactionsCache = reactions;\n          return reactions;\n        })\n        .catch((error) => {\n          this.errorHandler.handle(error, 'getAvailableReactions');\n          const fallback = ['👍', '❤️', '😂', '😮', '😢', '🙏'];\n          this.availableReactionsCache = fallback;\n          return fallback;\n        })\n        .finally(() => {\n          this.availableReactionsPromise = null;\n        });\n    }\n\n    return this.availableReactionsPromise;\n  }\n\n  /**\n   * Queue a message to be marked as read (batched/debounced API sync).\n   */\n  queueMessageAsRead(messageId: string): void {\n    const message = this.state.getMessage(messageId);\n    if (!message || message.status === 'read') {\n      return;\n    }\n\n    const existingQueue = this.readQueue.get(message.conversationId);\n    if (existingQueue?.has(messageId)) {\n      return;\n    }\n\n    this.state.updateMessage(messageId, { status: 'read' });\n\n    let queue = existingQueue;\n    if (!queue) {\n      queue = new Set();\n      this.readQueue.set(message.conversationId, queue);\n    }\n    queue.add(messageId);\n\n    const conversation = this.state.getConversation(message.conversationId);\n    if (conversation && conversation.unreadCount > 0) {\n      this.state.updateConversation(message.conversationId, {\n        unreadCount: Math.max(0, conversation.unreadCount - 1),\n      });\n    }\n\n    this.scheduleReadFlush();\n  }\n\n  /**\n   * Mark a single message as read (queues for batched sync).\n   */\n  async markMessageAsRead(messageId: string): Promise<void> {\n    this.queueMessageAsRead(messageId);\n  }\n\n  private scheduleReadFlush(): void {\n    if (this.readFlushHandle) {\n      clearTimeout(this.readFlushHandle);\n    }\n    this.readFlushHandle = setTimeout(() => {\n      this.readFlushHandle = undefined;\n      void this.flushReadQueue();\n    }, this.config.messageReadDebounce);\n  }\n\n  /**\n   * Drop queued per-message read receipts without syncing to the API.\n   * Used before conversation-level mark-as-read to avoid duplicate API calls.\n   */\n  private discardReadQueue(conversationId?: string): void {\n    if (conversationId) {\n      this.readQueue.delete(conversationId);\n    } else {\n      this.readQueue.clear();\n    }\n\n    if (this.readFlushHandle) {\n      clearTimeout(this.readFlushHandle);\n      this.readFlushHandle = undefined;\n    }\n\n    if (this.readQueue.size > 0) {\n      this.scheduleReadFlush();\n    }\n  }\n\n  private async flushReadQueue(): Promise<void> {\n    const snapshot = new Map(this.readQueue);\n    this.readQueue.clear();\n\n    for (const [conversationId, ids] of snapshot) {\n      const messageIds = [...ids];\n      if (messageIds.length === 0) {\n        continue;\n      }\n\n      try {\n        await this.callApi(\n          'flushReadQueue',\n          'messageApi',\n          'markAsRead',\n          () => this.messageApi.markAsRead(conversationId, messageIds),\n          conversationId,\n          messageIds,\n        );\n      } catch (error) {\n        for (const id of messageIds) {\n          const msg = this.state.getMessage(id);\n          if (msg?.status === 'read') {\n            this.state.updateMessage(id, { status: 'delivered' });\n          }\n        }\n        this.errorHandler.handle(error, 'flushReadQueue', { conversationId, count: messageIds.length });\n      }\n    }\n  }\n\n  /**\n   * Mark conversation as read\n   * Marks messages locally and syncs with server\n   */\n  async markAsRead(conversationId: string): Promise<void> {\n    await this.flushReadQueue();\n\n    const messages = this.state.getConversationMessages(conversationId);\n    const currentId = this._currentUser()?.id ?? 'current-user';\n    const unreadMessageIds = messages.filter((m) => m.status !== 'read' && m.senderId !== currentId).map((m) => m.id);\n\n    if (unreadMessageIds.length === 0) return;\n\n    try {\n      // Optimistic update\n      this.state.resetUnreadCount(conversationId);\n\n      // Sync with server\n      await this.callApi(\n        'markAsRead',\n        'messageApi',\n        'markAsRead',\n        () => this.messageApi.markAsRead(conversationId, unreadMessageIds),\n        conversationId,\n        unreadMessageIds,\n      );\n    } catch (error) {\n      // Rollback on failure\n      this.state.updateConversation(conversationId, {\n        unreadCount: unreadMessageIds.length,\n      });\n\n      this.errorHandler.handle(error, 'markAsRead', { conversationId });\n      // Don't throw - marking as read failure shouldn't break the app\n    }\n  }\n\n  /**\n   * Set composer generation mode (shows cancel button instead of send/voice).\n   * Call from message APIs while an AI or async response is in progress.\n   */\n  setGenerating(value: boolean): void {\n    this.composerGenerationState.setGenerating(value);\n  }\n\n  /**\n   * Cancel an in-progress generation from the composer UI or programmatically.\n   */\n  cancelGeneration(): void {\n    this.composerGenerationState.cancel();\n  }\n\n  /**\n   * Notify that the composer has draft content.\n   * Emits typing indicators at most once per {@link AXConversationConfig.typingIndicatorThrottle}.\n   */\n  notifyComposerTyping(conversationId: string): void {\n    this.clearOutgoingTypingStop(conversationId);\n\n    const throttleMs = this.config.typingIndicatorThrottle;\n    const lastEmit = this.outgoingTypingLastEmitAt.get(conversationId) ?? 0;\n    const now = Date.now();\n    const isActive = this.outgoingTypingActive.get(conversationId) === true;\n\n    if (!isActive || now - lastEmit >= throttleMs) {\n      this.outgoingTypingLastEmitAt.set(conversationId, now);\n      this.outgoingTypingActive.set(conversationId, true);\n      void this.sendTypingIndicator(conversationId);\n    }\n\n    this.scheduleOutgoingTypingStop(conversationId);\n  }\n\n  /**\n   * Notify that the composer no longer has draft content (or user left the chat).\n   * Sends a single stop event when a typing indicator was previously emitted.\n   */\n  notifyComposerStoppedTyping(conversationId: string): void {\n    this.clearOutgoingTypingStop(conversationId);\n    if (!this.outgoingTypingActive.get(conversationId)) {\n      return;\n    }\n    this.outgoingTypingActive.set(conversationId, false);\n    void this.stopTypingIndicator(conversationId);\n  }\n\n  private scheduleOutgoingTypingStop(conversationId: string): void {\n    this.clearOutgoingTypingStop(conversationId);\n    const timeoutMs = this.config.typingIndicatorTimeout;\n    const handle = setTimeout(() => {\n      this.outgoingTypingStopHandles.delete(conversationId);\n      this.notifyComposerStoppedTyping(conversationId);\n    }, timeoutMs);\n    this.outgoingTypingStopHandles.set(conversationId, handle);\n  }\n\n  private clearOutgoingTypingStop(conversationId: string): void {\n    const handle = this.outgoingTypingStopHandles.get(conversationId);\n    if (!handle) {\n      return;\n    }\n    clearTimeout(handle);\n    this.outgoingTypingStopHandles.delete(conversationId);\n  }\n\n  /**\n   * Send typing indicator\n   * Non-critical operation, doesn't throw on failure\n   */\n  async sendTypingIndicator(conversationId: string): Promise<void> {\n    try {\n      await this.callApi(\n        'sendTypingIndicator',\n        'messageApi',\n        'sendTypingIndicator',\n        () => this.messageApi.sendTypingIndicator(conversationId),\n        conversationId,\n      );\n    } catch (error) {\n      this.errorHandler.handle(error, 'sendTypingIndicator', { conversationId });\n    }\n  }\n\n  async stopTypingIndicator(conversationId: string): Promise<void> {\n    try {\n      await this.callApi(\n        'stopTypingIndicator',\n        'messageApi',\n        'stopTypingIndicator',\n        () => this.messageApi.stopTypingIndicator(conversationId),\n        conversationId,\n      );\n    } catch (error) {\n      this.errorHandler.handle(error, 'stopTypingIndicator', { conversationId });\n    }\n  }\n\n  /**\n   * Search conversations\n   * Returns empty array on failure\n   */\n  async searchConversations(query: string): Promise<AXConversation[]> {\n    try {\n      return await this.callApi(\n        'searchConversations',\n        'conversationApi',\n        'searchConversations',\n        () => this.conversationApi.searchConversations(query),\n        query,\n      );\n    } catch (error) {\n      this.errorHandler.handle(error, 'searchConversations', { query });\n      return []; // Return empty array on failure\n    }\n  }\n\n  /**\n   * Handle new message received\n   */\n  private handleNewMessage(message: AXConversationMessage): void {\n    if (this.state.getMessage(message.id)) {\n      return;\n    }\n\n    this.state.clearTypingUser(message.conversationId, message.senderId);\n    this.state.addMessage(message);\n    this.state.updateLastMessage(message);\n\n    const currentId = this._currentUser()?.id ?? 'current-user';\n    const isFromOtherUser = message.senderId !== currentId;\n    const isActiveConversation = message.conversationId === this._activeConversationId();\n    const isAlreadyRead = message.status === 'read';\n\n    if (!isAlreadyRead && isFromOtherUser && isActiveConversation) {\n      this.queueMessageAsRead(message.id);\n    } else if (!isAlreadyRead && isFromOtherUser && !isActiveConversation) {\n      this.state.incrementUnreadCount(message.conversationId);\n    }\n\n    this.syncMessageCountFromRealtime(message, isActiveConversation);\n  }\n\n  /**\n   * Handle message update\n   */\n  private handleMessageUpdate(message: AXConversationMessage): void {\n    const existing = this.state.getMessage(message.id);\n    if (!existing) {\n      this.state.addMessage(message);\n      this.syncLastMessageIfRelevant(message);\n      return;\n    }\n\n    this.state.updateMessage(message.id, message);\n    this.syncLastMessageIfRelevant(message);\n  }\n\n  /**\n   * Bump reply/forward counts locally when realtime events arrive outside the active message list.\n   */\n  private syncMessageCountFromRealtime(message: AXConversationMessage, isActiveConversation: boolean): void {\n    if (message.replyTo?.id && !isActiveConversation) {\n      this.bumpMessageCount(message.replyTo.id, 'replyCount');\n    }\n    if (message.forwardedFrom?.messageId && !isActiveConversation) {\n      this.bumpMessageCount(message.forwardedFrom.messageId, 'forwardCount');\n    }\n  }\n\n  private bumpMessageCount(messageId: string, field: 'replyCount' | 'forwardCount', delta = 1): void {\n    const message = this.state.getMessage(messageId);\n    if (!message) {\n      return;\n    }\n    this.state.updateMessage(messageId, {\n      [field]: (message[field] ?? 0) + delta,\n    });\n  }\n\n  /**\n   * Handle message deletion\n   */\n  private handleMessageDeletion(messageId: string): void {\n    const message = this.state.getMessage(messageId);\n    const conversationId = message?.conversationId;\n\n    this.state.deleteMessage(messageId);\n\n    if (conversationId) {\n      this.refreshConversationLastMessage(conversationId);\n    }\n  }\n\n  /**\n   * Handle typing indicator\n   */\n  private handleTypingIndicator(indicator: AXConversationTypingIndicator): void {\n    const currentUser = this._currentUser();\n    if (currentUser && indicator.userId === currentUser.id) {\n      return;\n    }\n\n    if (indicator.isTyping === false) {\n      this.state.clearTypingUser(indicator.conversationId, indicator.userId);\n      return;\n    }\n\n    this.state.setTypingActive(indicator.conversationId, indicator.userId, this.config.typingDisplayDuration);\n  }\n\n  /**\n   * Handle presence update\n   */\n  private handlePresenceUpdate(update: AXConversationPresenceUpdate): void {\n    this.state.updateUserPresence(update);\n  }\n\n  /**\n   * Handle conversation update\n   * Updates conversation metadata including unread count, last message, etc.\n   */\n  private handleConversationUpdate(conversation: AXConversation): void {\n    this.syncConversationToInbox(conversation);\n  }\n\n  private handleConversationCreated(conversation: AXConversation): void {\n    this.syncConversationToInbox(conversation, true);\n  }\n\n  private handleConversationDeleted(conversationId: string): void {\n    this.state.deleteConversation(conversationId);\n    this.readQueue.delete(conversationId);\n\n    if (this._activeConversationId() === conversationId) {\n      this._activeConversationId.set(null);\n    }\n  }\n\n  private handleReadReceipt(receipt: { messageId: string; userId: string; readAt: Date }): void {\n    const currentUserId = this._currentUser()?.id;\n    const message = this.state.getMessage(receipt.messageId);\n    if (!message || !currentUserId) {\n      return;\n    }\n\n    if (receipt.userId === currentUserId) {\n      return;\n    }\n\n    if (message.senderId === currentUserId && message.status !== 'read') {\n      this.state.updateMessage(receipt.messageId, { status: 'read' });\n    }\n  }\n\n  private handleMessageStatusChange(change: {\n    messageId: string;\n    status: AXConversationMessage['status'];\n    timestamp: Date;\n  }): void {\n    const message = this.state.getMessage(change.messageId);\n    if (!message || message.status === change.status) {\n      return;\n    }\n    this.state.updateMessage(change.messageId, { status: change.status });\n    const updated = this.state.getMessage(change.messageId);\n    if (updated) {\n      this.syncLastMessageIfRelevant(updated);\n    }\n  }\n\n  /**\n   * Insert or refresh a conversation in the in-memory inbox.\n   * @param promote When true, bumps activity so the chat sorts to the top (create / reopen).\n   */\n  private syncConversationToInbox(conversation: AXConversation, promote = false): void {\n    const now = new Date();\n    const existing = this.state.getConversation(conversation.id);\n    const base = existing ?? conversation;\n    this.state.setConversation({\n      ...base,\n      ...conversation,\n      lastMessageAt: promote ? now : (conversation.lastMessageAt ?? base.lastMessageAt ?? now),\n      updatedAt: conversation.updatedAt ?? now,\n    });\n  }\n\n  private finalizeSentMessage(tempMessageId: string, sentMessage: AXConversationMessage): void {\n    if (sentMessage.id === tempMessageId) {\n      this.state.updateMessage(tempMessageId, { ...sentMessage, isLocal: false });\n    } else {\n      this.state.deleteMessage(tempMessageId);\n      this.state.addMessage(sentMessage);\n    }\n    this.updateConversationLastMessage(sentMessage);\n  }\n\n  /**\n   * Update conversation's last message\n   */\n  private updateConversationLastMessage(message: AXConversationMessage): void {\n    this.state.updateLastMessage(message);\n  }\n\n  /** Keep sidebar preview in sync when the last cached message is edited or deleted. */\n  private syncLastMessageIfRelevant(message: AXConversationMessage): void {\n    const conversation = this.state.getConversation(message.conversationId);\n    if (!conversation) {\n      return;\n    }\n\n    const cachedLast = this.state.getConversationMessages(message.conversationId).at(-1);\n    if (cachedLast?.id === message.id || conversation.lastMessage?.id === message.id) {\n      this.state.updateLastMessage(message);\n    }\n  }\n\n  /** Recompute conversation preview after a message is removed from the local cache. */\n  private refreshConversationLastMessage(conversationId: string): void {\n    const conversation = this.state.getConversation(conversationId);\n    if (!conversation) {\n      return;\n    }\n\n    const last = this.state.getConversationMessages(conversationId).at(-1);\n    if (last) {\n      this.state.updateLastMessage(last);\n      return;\n    }\n\n    this.state.updateConversation(conversationId, {\n      lastMessage: undefined,\n      lastMessageAt: conversation.createdAt ?? conversation.updatedAt ?? new Date(),\n      updatedAt: new Date(),\n    });\n  }\n\n  // =====================\n  // Conversation Update APIs\n  // =====================\n\n  /**\n   * Update conversation properties\n   * @param conversationId - Conversation ID\n   * @param updates - Partial conversation updates\n   */\n  async updateConversation(conversationId: string, updates: Partial<AXConversation>): Promise<void> {\n    try {\n      const { title, description, avatar, icon, metadata, archived } = updates;\n\n      const apiUpdates: AXConversationUpdateData = {};\n      if (title !== undefined) apiUpdates.title = title;\n      if (description !== undefined) apiUpdates.description = description;\n      if (avatar !== undefined) apiUpdates.avatar = avatar;\n      if (icon !== undefined) apiUpdates.icon = icon;\n      if (metadata !== undefined) apiUpdates.metadata = metadata;\n\n      if (Object.keys(apiUpdates).length > 0) {\n        await this.callApi(\n          'updateConversation',\n          'conversationApi',\n          'updateConversation',\n          () => this.conversationApi.updateConversation(conversationId, apiUpdates),\n          conversationId,\n          apiUpdates,\n        );\n      }\n\n      if (archived !== undefined) {\n        if (archived) {\n          await this.callApi(\n            'updateConversation',\n            'conversationApi',\n            'archiveConversation',\n            () => this.conversationApi.archiveConversation(conversationId),\n            conversationId,\n          );\n        } else {\n          await this.callApi(\n            'updateConversation',\n            'conversationApi',\n            'unarchiveConversation',\n            () => this.conversationApi.unarchiveConversation(conversationId),\n            conversationId,\n          );\n        }\n      }\n\n      this.state.updateConversation(conversationId, updates);\n    } catch (error) {\n      this.errorHandler.handle(error, 'updateConversation', { conversationId });\n      throw error;\n    }\n  }\n\n  /**\n   * Update conversation settings\n   * @param conversationId - Conversation ID\n   * @param settings - Partial settings to update\n   */\n  async updateConversationSettings(\n    conversationId: string,\n    settings: Partial<AXConversationRoomPreferences>,\n  ): Promise<void> {\n    try {\n      const updated = await this.callApi(\n        'updateConversationSettings',\n        'userApi',\n        'updateConversationPreferences',\n        () => this.userApi.updateConversationPreferences(conversationId, settings),\n        conversationId,\n        settings,\n      );\n      this.state.updateRoomPreferences(conversationId, updated);\n    } catch (error) {\n      this.errorHandler.handle(error, 'updateConversationSettings', { conversationId });\n      throw error;\n    }\n  }\n\n  /**\n   * Update conversation title\n   * @param conversationId - Conversation ID\n   * @param title - New title\n   */\n  async updateConversationTitle(conversationId: string, title: string): Promise<void> {\n    try {\n      await this.callApi(\n        'updateConversationTitle',\n        'conversationApi',\n        'updateConversation',\n        () => this.conversationApi.updateConversation(conversationId, { title }),\n        conversationId,\n        { title },\n      );\n      this.state.updateTitle(conversationId, title);\n    } catch (error) {\n      this.errorHandler.handle(error, 'updateConversationTitle', { conversationId, title });\n      throw error;\n    }\n  }\n\n  /**\n   * Update conversation metadata\n   * @param conversationId - Conversation ID\n   * @param metadata - Metadata to merge\n   */\n  async updateConversationMetadata(conversationId: string, metadata: AXConversationMetadata): Promise<void> {\n    try {\n      const current = this.state.getConversation(conversationId);\n      const mergedMetadata = { ...current?.metadata, ...metadata };\n      const metadataUpdate = { metadata: mergedMetadata };\n      await this.callApi(\n        'updateConversationMetadata',\n        'conversationApi',\n        'updateConversation',\n        () => this.conversationApi.updateConversation(conversationId, metadataUpdate),\n        conversationId,\n        metadataUpdate,\n      );\n      this.state.updateMetadata(conversationId, metadata);\n    } catch (error) {\n      this.errorHandler.handle(error, 'updateConversationMetadata', { conversationId });\n      throw error;\n    }\n  }\n\n  /**\n   * Get conversation by ID\n   * @param conversationId - Conversation ID\n   * @returns Conversation or null\n   */\n  getConversation(conversationId: string): AXConversation | null {\n    return this.state.getConversation(conversationId) || null;\n  }\n\n  /**\n   * Create a new conversation\n   * @param participantIds - Array of participant user IDs\n   * @param type - Conversation type (private, group, channel)\n   * @param metadata - Optional metadata (title, avatar, etc.)\n   * @param options - Optional flags (`forceCreate` recreates private chats even when one exists)\n   * @returns Created or existing conversation\n   */\n  async createConversation(\n    participantIds: string[],\n    type: AXConversationType,\n    metadata?: AXConversationMetadata,\n    options?: { forceCreate?: boolean },\n  ): Promise<AXConversation> {\n    try {\n      await this.ensureInitialized();\n\n      const currentUser = this._currentUser();\n      const creatorId = currentUser?.id;\n      const isPrivate = type === 'private';\n      const forceCreate = options?.forceCreate === true;\n      const scopedParticipantIds = [...participantIds];\n      if (creatorId && !scopedParticipantIds.includes(creatorId)) {\n        scopedParticipantIds.unshift(creatorId);\n      }\n\n      if (isPrivate && !forceCreate && creatorId) {\n        const peerUserId = scopedParticipantIds.find((id) => id !== creatorId);\n        if (peerUserId) {\n          const existing = findExistingPrivateConversation(this.state.conversations(), creatorId, peerUserId);\n          if (existing) {\n            this.syncConversationToInbox(existing, true);\n            return resolveConversationForViewer(existing, creatorId);\n          }\n        }\n      }\n\n      this.conversationListLoadGeneration++;\n\n      const createData = {\n        type,\n        participantIds: scopedParticipantIds,\n        creatorId,\n        title: isPrivate ? undefined : (metadata?.['title'] as string | undefined),\n        description: metadata?.['description'] as string | undefined,\n        avatar: isPrivate ? undefined : AXConversationService.normalizeOptionalString(metadata?.['avatar']),\n        icon: isPrivate\n          ? undefined\n          : (AXConversationService.normalizeOptionalString(metadata?.['icon']) ??\n            (type === 'group' ? AX_CONVERSATION_DEFAULT_GROUP_ICON : undefined)),\n        metadata: isPrivate ? undefined : metadata,\n        forceCreate,\n      };\n      const conversation = await this.callApi(\n        'createConversation',\n        'conversationApi',\n        'createConversation',\n        () => this.conversationApi.createConversation(createData),\n        createData,\n      );\n      this.syncConversationToInbox(conversation, true);\n      return resolveConversationForViewer(conversation, creatorId);\n    } catch (error) {\n      this.errorHandler.handle(error, 'createConversation', { participantIds, type });\n      throw error;\n    }\n  }\n\n  /**\n   * Get available users for conversation creation\n   * @param filters - Optional search filters (e.g. `query`)\n   * @param pagination - Pagination parameters\n   * @returns Paginated list of users\n   */\n  async getUsers(\n    filters?: AXConversationUserSearchFilters,\n    pagination: AXConversationPagination = { page: 0, pageSize: 50 },\n  ): Promise<AXConversationPaginatedResult<import('../models').AXConversationParticipant>> {\n    try {\n      return await this.callApi(\n        'getUsers',\n        'userApi',\n        'getUsers',\n        () => this.userApi.getUsers(pagination, filters),\n        pagination,\n        filters,\n      );\n    } catch (error) {\n      this.errorHandler.handle(error, 'getUsers', { filters, pagination });\n      return { items: [], total: 0, hasMore: false, page: pagination.page };\n    }\n  }\n\n  /**\n   * Mark entire conversation as read\n   * @param conversationId - Conversation ID\n   */\n  async markConversationAsRead(conversationId: string): Promise<void> {\n    this.discardReadQueue(conversationId);\n\n    const currentId = this._currentUser()?.id;\n    for (const message of this.state.getConversationMessages(conversationId)) {\n      if (message.status !== 'read' && message.senderId !== currentId) {\n        this.state.updateMessage(message.id, { status: 'read' });\n      }\n    }\n\n    try {\n      await this.callApi(\n        'markConversationAsRead',\n        'conversationApi',\n        'markConversationAsRead',\n        () => this.conversationApi.markConversationAsRead(conversationId),\n        conversationId,\n      );\n      this.state.resetUnreadCount(conversationId);\n    } catch (error) {\n      this.errorHandler.handle(error, 'markConversationAsRead', { conversationId });\n      throw error;\n    }\n  }\n\n  /**\n   * Delete a conversation\n   * Shows confirmation dialog, then deletes from server and store\n   * @param conversationId - Conversation ID\n   */\n  async deleteConversation(conversationId: string): Promise<boolean> {\n    // Get conversation title for confirmation message\n    const conversation = this.state.getConversation(conversationId);\n    const conversationTitle =\n      conversation?.title || this.translation.translateSync('@acorex:chat.fallbacks.this-conversation');\n\n    // Show confirmation dialog\n    const result = await this.dialogService.confirm(\n      this.translation.translateSync('@acorex:chat.dialog.delete-conversation.title'),\n      this.translation.translateSync('@acorex:chat.dialog.delete-conversation.message', {\n        params: { conversationTitle },\n      }),\n      'danger',\n    );\n\n    // User cancelled\n    if (!result.result) {\n      return false;\n    }\n\n    try {\n      // Delete from server\n      const result = await this.callApi(\n        'deleteConversation',\n        'conversationApi',\n        'deleteConversation',\n        () => this.conversationApi.deleteConversation(conversationId),\n        conversationId,\n      );\n\n      if (!result) return false;\n\n      // Delete from store\n      this.state.deleteConversation(conversationId);\n\n      // If this was the active conversation, clear selection\n      if (this._activeConversationId() === conversationId) {\n        this._activeConversationId.set(null);\n      }\n      return true;\n    } catch (error) {\n      this.errorHandler.handle(error, 'deleteConversation', { conversationId });\n      throw error;\n    }\n  }\n\n  /**\n   * Get reply count for a message\n   * @param messageId - Message ID\n   * @returns Number of replies\n   */\n  async getReplyCount(messageId: string): Promise<number> {\n    try {\n      return await this.callApi(\n        'getReplyCount',\n        'messageApi',\n        'getReplyCount',\n        () => this.messageApi.getReplyCount(messageId),\n        messageId,\n      );\n    } catch (error) {\n      this.errorHandler.handle(error, 'getReplyCount', { messageId });\n      return 0;\n    }\n  }\n\n  /**\n   * Get forward count for a message\n   * @param messageId - Message ID\n   * @returns Number of times forwarded\n   */\n  async getForwardCount(messageId: string): Promise<number> {\n    try {\n      return await this.callApi(\n        'getForwardCount',\n        'messageApi',\n        'getForwardCount',\n        () => this.messageApi.getForwardCount(messageId),\n        messageId,\n      );\n    } catch (error) {\n      this.errorHandler.handle(error, 'getForwardCount', { messageId });\n      return 0;\n    }\n  }\n\n  // =====================\n  // Extended Conversation APIs\n  // =====================\n\n  /**\n   * Archive conversation\n   * @param conversationId - Conversation ID\n   */\n  async archiveConversation(conversationId: string): Promise<void> {\n    try {\n      await this.callApi(\n        'archiveConversation',\n        'conversationApi',\n        'archiveConversation',\n        () => this.conversationApi.archiveConversation(conversationId),\n        conversationId,\n      );\n      this.state.updateConversation(conversationId, { archived: true });\n    } catch (error) {\n      this.errorHandler.handle(error, 'archiveConversation', { conversationId });\n      throw error;\n    }\n  }\n\n  /**\n   * Unarchive conversation\n   * @param conversationId - Conversation ID\n   */\n  async unarchiveConversation(conversationId: string): Promise<void> {\n    try {\n      await this.callApi(\n        'unarchiveConversation',\n        'conversationApi',\n        'unarchiveConversation',\n        () => this.conversationApi.unarchiveConversation(conversationId),\n        conversationId,\n      );\n      this.state.updateConversation(conversationId, { archived: false });\n    } catch (error) {\n      this.errorHandler.handle(error, 'unarchiveConversation', { conversationId });\n      throw error;\n    }\n  }\n\n  /**\n   * Pin conversation\n   * @param conversationId - Conversation ID\n   */\n  async pinConversation(conversationId: string): Promise<void> {\n    try {\n      await this.callApi(\n        'pinConversation',\n        'conversationApi',\n        'pinConversation',\n        () => this.conversationApi.pinConversation(conversationId),\n        conversationId,\n      );\n      this.state.updateConversation(conversationId, { pinned: true });\n    } catch (error) {\n      this.errorHandler.handle(error, 'pinConversation', { conversationId });\n      throw error;\n    }\n  }\n\n  /**\n   * Unpin conversation\n   * @param conversationId - Conversation ID\n   */\n  async unpinConversation(conversationId: string): Promise<void> {\n    try {\n      await this.callApi(\n        'unpinConversation',\n        'conversationApi',\n        'unpinConversation',\n        () => this.conversationApi.unpinConversation(conversationId),\n        conversationId,\n      );\n      this.state.updateConversation(conversationId, { pinned: false });\n    } catch (error) {\n      this.errorHandler.handle(error, 'unpinConversation', { conversationId });\n      throw error;\n    }\n  }\n\n  /**\n   * Mute conversation\n   * @param conversationId - Conversation ID\n   * @param duration - Mute duration in milliseconds (undefined = forever)\n   */\n  async muteConversation(conversationId: string, duration?: number): Promise<void> {\n    try {\n      const mutedUntil = duration ? new Date(Date.now() + duration) : new Date('2099-12-31');\n      await this.updateConversationSettings(conversationId, { mutedUntil, notifications: false });\n    } catch (error) {\n      this.errorHandler.handle(error, 'muteConversation', { conversationId, duration });\n      throw error;\n    }\n  }\n\n  /**\n   * Unmute conversation\n   * @param conversationId - Conversation ID\n   */\n  async unmuteConversation(conversationId: string): Promise<void> {\n    try {\n      await this.updateConversationSettings(conversationId, { mutedUntil: undefined, notifications: true });\n    } catch (error) {\n      this.errorHandler.handle(error, 'unmuteConversation', { conversationId });\n      throw error;\n    }\n  }\n\n  /**\n   * Add participants to conversation\n   * @param conversationId - Conversation ID\n   * @param userIds - User IDs to add\n   */\n  async addParticipants(conversationId: string, userIds: string[]): Promise<void> {\n    try {\n      const updatedConversation = await this.callApi(\n        'addParticipants',\n        'conversationApi',\n        'addParticipants',\n        () => this.conversationApi.addParticipants(conversationId, userIds),\n        conversationId,\n        userIds,\n      );\n      this.state.setConversation(updatedConversation);\n    } catch (error) {\n      this.errorHandler.handle(error, 'addParticipants', { conversationId, userIds });\n      throw error;\n    }\n  }\n\n  /**\n   * Remove participant from conversation\n   * @param conversationId - Conversation ID\n   * @param userId - User ID to remove\n   */\n  async removeParticipant(conversationId: string, userId: string): Promise<void> {\n    try {\n      const updatedConversation = await this.callApi(\n        'removeParticipant',\n        'conversationApi',\n        'removeParticipant',\n        () => this.conversationApi.removeParticipant(conversationId, userId),\n        conversationId,\n        userId,\n      );\n      this.state.setConversation(updatedConversation);\n    } catch (error) {\n      this.errorHandler.handle(error, 'removeParticipant', { conversationId, userId });\n      throw error;\n    }\n  }\n\n  /**\n   * Leave conversation\n   * @param conversationId - Conversation ID\n   */\n  async leaveConversation(conversationId: string): Promise<void> {\n    try {\n      await this.callApi(\n        'leaveConversation',\n        'conversationApi',\n        'leaveConversation',\n        () => this.conversationApi.leaveConversation(conversationId),\n        conversationId,\n      );\n      this.state.deleteConversation(conversationId);\n      if (this._activeConversationId() === conversationId) {\n        this._activeConversationId.set(null);\n      }\n    } catch (error) {\n      this.errorHandler.handle(error, 'leaveConversation', { conversationId });\n      throw error;\n    }\n  }\n\n  /**\n   * Save draft message\n   * @param conversationId - Conversation ID\n   * @param draft - Draft text\n   */\n  async saveDraft(conversationId: string, draft: string): Promise<void> {\n    try {\n      await this.callApi(\n        'saveDraft',\n        'conversationApi',\n        'saveDraft',\n        () => this.conversationApi.saveDraft(conversationId, draft),\n        conversationId,\n        draft,\n      );\n    } catch (error) {\n      this.errorHandler.handle(error, 'saveDraft', { conversationId });\n      // Don't throw - draft saving is not critical\n    }\n  }\n\n  /**\n   * Clear draft message\n   * @param conversationId - Conversation ID\n   */\n  async clearDraft(conversationId: string): Promise<void> {\n    try {\n      await this.callApi(\n        'clearDraft',\n        'conversationApi',\n        'clearDraft',\n        () => this.conversationApi.clearDraft(conversationId),\n        conversationId,\n      );\n    } catch (error) {\n      this.errorHandler.handle(error, 'clearDraft', { conversationId });\n      // Don't throw - draft clearing is not critical\n    }\n  }\n\n  // =====================\n  // Extended Message APIs\n  // =====================\n\n  /**\n   * Pin message in conversation\n   * @param conversationId - Conversation ID\n   * @param messageId - Message ID\n   */\n  async pinMessage(conversationId: string, messageId: string): Promise<void> {\n    try {\n      await this.callApi(\n        'pinMessage',\n        'messageApi',\n        'pinMessage',\n        () => this.messageApi.pinMessage(conversationId, messageId),\n        conversationId,\n        messageId,\n      );\n      this.state.updateMessage(messageId, { pinned: true });\n    } catch (error) {\n      this.errorHandler.handle(error, 'pinMessage', { conversationId, messageId });\n      throw error;\n    }\n  }\n\n  /**\n   * Unpin message from conversation\n   * @param conversationId - Conversation ID\n   * @param messageId - Message ID\n   */\n  async unpinMessage(conversationId: string, messageId: string): Promise<void> {\n    try {\n      await this.callApi(\n        'unpinMessage',\n        'messageApi',\n        'unpinMessage',\n        () => this.messageApi.unpinMessage(conversationId, messageId),\n        conversationId,\n        messageId,\n      );\n      this.state.updateMessage(messageId, { pinned: false });\n    } catch (error) {\n      this.errorHandler.handle(error, 'unpinMessage', { conversationId, messageId });\n      throw error;\n    }\n  }\n\n  /**\n   * Forward message to conversations\n   * @param messageId - Message ID to forward\n   * @param conversationIds - Target conversation IDs\n   * @param caption - Optional caption\n   */\n  async forwardMessage(messageId: string, conversationIds: string[], caption?: string): Promise<void> {\n    await this.runWithForwardingLock(async () => {\n      try {\n        const forwardCommand = {\n          messageId,\n          conversationIds,\n          caption,\n        };\n        await this.callApi(\n          'forwardMessage',\n          'messageApi',\n          'forwardMessage',\n          () => this.messageApi.forwardMessage(forwardCommand),\n          forwardCommand,\n        );\n        this.bumpMessageCount(messageId, 'forwardCount', conversationIds.length);\n      } catch (error) {\n        this.errorHandler.handle(error, 'forwardMessage', { messageId, conversationIds });\n        throw error;\n      }\n    });\n  }\n\n  /**\n   * Runs a forward operation while locking all forward actions until it completes.\n   */\n  async runWithForwardingLock<T>(task: () => Promise<T>): Promise<T> {\n    if (this._isForwardingMessage()) {\n      throw new Error('A message forward is already in progress.');\n    }\n\n    this._isForwardingMessage.set(true);\n    try {\n      return await task();\n    } finally {\n      this._isForwardingMessage.set(false);\n    }\n  }\n\n  /**\n   * Search messages in conversation\n   * @param conversationId - Conversation ID\n   * @param query - Search query\n   * @returns Matching messages\n   */\n  async searchMessages(conversationId: string, query: string): Promise<AXConversationMessage[]> {\n    try {\n      const searchFilters = { query };\n      const pagination = { page: 0, pageSize: 50 };\n      const result = await this.callApi(\n        'searchMessages',\n        'messageApi',\n        'searchMessages',\n        () => this.messageApi.searchMessages(conversationId, searchFilters, pagination),\n        conversationId,\n        searchFilters,\n        pagination,\n      );\n      return result.items;\n    } catch (error) {\n      this.errorHandler.handle(error, 'searchMessages', { conversationId, query });\n      return [];\n    }\n  }\n\n  /**\n   * Get message replies\n   * @param messageId - Message ID\n   * @returns Array of reply messages\n   */\n  async getMessageReplies(messageId: string): Promise<AXConversationMessage[]> {\n    try {\n      const pagination = { page: 0, pageSize: 50 };\n      const result = await this.callApi(\n        'getMessageReplies',\n        'messageApi',\n        'getMessageReplies',\n        () => this.messageApi.getMessageReplies(messageId, pagination),\n        messageId,\n        pagination,\n      );\n      return result.items;\n    } catch (error) {\n      this.errorHandler.handle(error, 'getMessageReplies', { messageId });\n      return [];\n    }\n  }\n\n  /**\n   * Export conversation messages\n   * @param conversationId - Conversation ID\n   * @param format - Export format\n   * @returns Export data\n   */\n  async exportMessages(conversationId: string, format: 'json' | 'csv' | 'txt'): Promise<string | Blob> {\n    try {\n      return await this.callApi(\n        'exportMessages',\n        'messageApi',\n        'exportMessages',\n        () => this.messageApi.exportMessages(conversationId, format),\n        conversationId,\n        format,\n      );\n    } catch (error) {\n      this.errorHandler.handle(error, 'exportMessages', { conversationId, format });\n      throw error;\n    }\n  }\n\n  // =====================\n  // User Management APIs\n  // =====================\n\n  /**\n   * Get user settings\n   * @returns User settings\n   */\n  async getUserSettings(): Promise<Record<string, unknown>> {\n    try {\n      return await this.callApi('getUserSettings', 'userApi', 'getUserSettings', () => this.userApi.getUserSettings());\n    } catch (error) {\n      this.errorHandler.handle(error, 'getUserSettings');\n      return {};\n    }\n  }\n\n  /**\n   * Update user settings\n   * @param settings - Settings to update\n   */\n  async updateUserSettings(settings: Record<string, unknown>): Promise<void> {\n    try {\n      await this.callApi(\n        'updateUserSettings',\n        'userApi',\n        'updateUserSettings',\n        () => this.userApi.updateUserSettings(settings),\n        settings,\n      );\n    } catch (error) {\n      this.errorHandler.handle(error, 'updateUserSettings', { settings });\n      throw error;\n    }\n  }\n\n  /**\n   * Block user\n   * @param userId - User ID to block\n   * @param reason - Optional reason\n   */\n  async blockUser(userId: string, reason?: { code: string; description?: string }): Promise<void> {\n    try {\n      await this.callApi(\n        'blockUser',\n        'userApi',\n        'blockUser',\n        () => this.userApi.blockUser(userId, reason),\n        userId,\n        reason,\n      );\n    } catch (error) {\n      this.errorHandler.handle(error, 'blockUser', { userId });\n      throw error;\n    }\n  }\n\n  /**\n   * Unblock user\n   * @param userId - User ID to unblock\n   */\n  async unblockUser(userId: string): Promise<void> {\n    try {\n      await this.callApi('unblockUser', 'userApi', 'unblockUser', () => this.userApi.unblockUser(userId), userId);\n    } catch (error) {\n      this.errorHandler.handle(error, 'unblockUser', { userId });\n      throw error;\n    }\n  }\n\n  /**\n   * Get blocked users\n   * @returns Array of blocked user IDs\n   */\n  async getBlockedUsers(): Promise<string[]> {\n    try {\n      return await this.callApi('getBlockedUsers', 'userApi', 'getBlockedUsers', () => this.userApi.getBlockedUsers());\n    } catch (error) {\n      this.errorHandler.handle(error, 'getBlockedUsers');\n      return [];\n    }\n  }\n\n  /**\n   * Update user presence\n   * @param status - Presence status\n   * @param statusText - Optional status text\n   */\n  async updatePresence(status: AXConversationPresenceStatus, statusText?: string): Promise<void> {\n    try {\n      await this.callApi(\n        'updatePresence',\n        'userApi',\n        'updatePresence',\n        () => this.userApi.updatePresence(status, statusText),\n        status,\n        statusText,\n      );\n    } catch (error) {\n      this.errorHandler.handle(error, 'updatePresence', { status });\n      // Don't throw - presence update is not critical\n    }\n  }\n\n  /**\n   * Validate message content before sending\n   * Uses centralized validation utilities for consistency\n   * @param command - Message command to validate\n   * @throws {Error} If message content is invalid\n   */\n  private async validateMessageContent(command: AXConversationSendMessageCommand): Promise<void> {\n    // Validate conversation ID\n    const conversationIdResult = validateConversationId(command.conversationId);\n    if (!conversationIdResult.valid) {\n      throw new Error(conversationIdResult.error);\n    }\n\n    // Validate message type\n    const typeResult = validateMessageType(command.type);\n    if (!typeResult.valid) {\n      throw new Error(typeResult.error);\n    }\n\n    // Validate payload exists\n    const payloadResult = await validateMessagePayload(command.payload, command.type);\n    if (!payloadResult.valid) {\n      throw new Error(payloadResult.error);\n    }\n\n    // Validate text messages\n    if (command.type === 'text') {\n      const payload = command.payload as { text?: string };\n      const textResult = validateMessageText(payload.text, this.config);\n      if (!textResult.valid) {\n        throw new Error(textResult.error);\n      }\n    }\n  }\n}\n","/**\n * Composer Popup Component\n * Container for emoji, sticker, and other tabs\n */\n\nimport { AXComponentCloseEvent } from '@acorex/cdk/common';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXTabItemComponent, AXTabsComponent } from '@acorex/components/tabs';\nimport { CommonModule } from '@angular/common';\nimport {\n  Component,\n  ComponentRef,\n  ViewEncapsulation,\n  computed,\n  effect,\n  inject,\n  input,\n  OnDestroy,\n  output,\n  signal,\n  viewChild,\n  ViewContainerRef,\n} from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { AXConversationService } from '../../services';\n\n@Component({\n  selector: 'ax-conversation-composer-popup',\n  encapsulation: ViewEncapsulation.None,\n  imports: [CommonModule, AXDecoratorModule, AXTabsComponent, AXTabItemComponent],\n  templateUrl: './composer-popup.component.html',\n  styleUrl: './composer-popup.component.css',\n})\nexport class AXConversationComposerPopupComponent implements OnDestroy {\n  private readonly conversationService = inject(AXConversationService);\n\n  // Access registry through conversation service\n  private get registry() {\n    return this.conversationService.registry;\n  }\n\n  contentContainer = viewChild.required('contentContainer', {\n    read: ViewContainerRef,\n  });\n\n  private currentComponentRef: ComponentRef<any> | null = null;\n  private tabItemSelectedSubscription: Subscription | null = null;\n\n  /** Popup open state (for backward compatibility) */\n  readonly isOpen = input<boolean>(false);\n\n  /** Close event (for backward compatibility) */\n  readonly closed = output<void>();\n\n  /** Item selected event (for backward compatibility) */\n  readonly itemSelected = output<any>();\n\n  /** Item selected callback (for popover mode) */\n  readonly onItemSelected = input<((item: any) => void) | undefined>(undefined);\n\n  /** Close event for popup service */\n  readonly onClosed = output<AXComponentCloseEvent>();\n\n  /** Active tab ID */\n  readonly activeTabId = signal<string | null>(null);\n\n  /** Enabled tabs from registry */\n  readonly enabledTabs = computed(() => this.registry.composerTabs.enabledTabs());\n\n  /** Whether more than one tab is available */\n  readonly hasMultipleTabs = computed(() => this.enabledTabs().length > 1);\n\n  getTabTitle(tabId: string): string {\n    const tab = this.registry.composerTabs.getTabById(tabId);\n    if (!tab) return '';\n    return this.registry.composerTabs.getTabTitle(tab);\n  }\n\n  constructor() {\n    // Load first tab by default\n    effect(() => {\n      if (!this.activeTabId() && this.enabledTabs().length > 0) {\n        this.activeTabId.set(this.enabledTabs()[0].id);\n      }\n    });\n\n    // Update content when active tab changes\n    effect(() => {\n      const tabId = this.activeTabId();\n      if (tabId) {\n        // Use setTimeout to ensure ViewChild is available\n        setTimeout(() => this.loadTabContent(tabId));\n      }\n    });\n  }\n\n  /** Handle tab change */\n  onTabChange(event: { tab?: { key?: string } }): void {\n    if (event.tab?.key) {\n      this.activeTabId.set(event.tab.key);\n    }\n  }\n\n  /** Load tab content component */\n  private async loadTabContent(tabId: string): Promise<void> {\n    if (!this.contentContainer) return;\n\n    const tab = this.registry.composerTabs.getTabById(tabId);\n    if (!tab) return;\n\n    this.clearTabContent();\n\n    this.contentContainer().clear();\n\n    const componentType = tab.component ?? (tab.componentLoader ? await tab.componentLoader() : undefined);\n    if (!componentType) return;\n\n    // Create new component instance\n    this.currentComponentRef = this.contentContainer().createComponent(componentType);\n\n    // Pass item selection handler if component has it\n    const instance = this.currentComponentRef.instance;\n    if (instance && typeof instance.itemSelected === 'object' && 'subscribe' in instance.itemSelected) {\n      this.tabItemSelectedSubscription = instance.itemSelected.subscribe((item: unknown) => {\n        // Call callback if provided (popover mode)\n        const callback = this.onItemSelected();\n        if (callback) {\n          callback(item);\n        } else {\n          // Emit event (popup mode)\n          this.itemSelected.emit(item);\n          this.closeWithData(item);\n        }\n      });\n    }\n  }\n\n  private clearTabContent(): void {\n    this.tabItemSelectedSubscription?.unsubscribe();\n    this.tabItemSelectedSubscription = null;\n\n    if (this.currentComponentRef) {\n      this.currentComponentRef.destroy();\n      this.currentComponentRef = null;\n    }\n  }\n\n  ngOnDestroy(): void {\n    this.clearTabContent();\n  }\n\n  /** Close popup (for backward compatibility) */\n  close(): void {\n    this.closed.emit();\n    const event = new AXComponentCloseEvent();\n    event.component = this;\n    event.data = null;\n    this.onClosed.emit(event);\n  }\n\n  /** Close popup with data (for popup service) */\n  closeWithData(data: unknown): void {\n    this.closed.emit();\n    const event = new AXComponentCloseEvent();\n    event.component = this;\n    event.data = data;\n    this.onClosed.emit(event);\n  }\n}\n","<div\n  class=\"composer-popup\"\n  [class.composer-popup--single-tab]=\"!hasMultipleTabs()\"\n>\n  @if (hasMultipleTabs()) {\n    <header class=\"composer-popup__header\">\n      <ax-tabs look=\"default\" location=\"top\" [fitParent]=\"true\" (onActiveTabChanged)=\"onTabChange($event)\">\n        @for (tab of enabledTabs(); track tab.id) {\n          <ax-tab-item\n            [text]=\"getTabTitle(tab.id)\"\n            [key]=\"tab.id\"\n            [active]=\"activeTabId() === tab.id\"\n            [attr.aria-label]=\"getTabTitle(tab.id)\"\n            [title]=\"getTabTitle(tab.id)\"\n          >\n            <ax-prefix>\n              @if (tab.icon) {\n                <i [class]=\"tab.icon\" aria-hidden=\"true\"></i>\n              }\n            </ax-prefix>\n          </ax-tab-item>\n        }\n      </ax-tabs>\n    </header>\n  }\n\n  <div class=\"composer-popup__content\">\n    <ng-container #contentContainer></ng-container>\n  </div>\n</div>\n","import type { AXConversationComposerAction } from '../../registries/composer-action.registry';\nimport type { AXConversationConfig } from '../../tokens/conversation-config.interface';\n\nexport function resolveComposerMaxFiles(\n  action: Pick<AXConversationComposerAction, 'maxFiles'> | undefined,\n  config: Pick<Required<AXConversationConfig>, 'maxFilesPerMessage'>,\n): number {\n  return Math.max(1, action?.maxFiles ?? config.maxFilesPerMessage);\n}\n","/** Gradient wash for the default chat wallpaper (pattern tile is applied in component CSS). */\nexport const MESSAGE_LIST_LIGHT_WALLPAPER_GRADIENT = [\n  'radial-gradient(ellipse 85% 70% at 12% 0%, rgba(255, 252, 238, 0.42) 0%, transparent 48%)',\n  'radial-gradient(ellipse 88% 72% at 98% 100%, rgba(196, 218, 158, 0.72) 0%, transparent 52%)',\n  'radial-gradient(ellipse 58% 48% at 48% 38%, rgba(228, 244, 196, 0.48) 0%, transparent 58%)',\n  'linear-gradient(168deg, #d6e6b4 0%, #b4d098 30%, #94c088 54%, #a6cb94 78%, #cae4ae 100%)',\n].join(', ');\n\nexport const MESSAGE_LIST_DARK_WALLPAPER_GRADIENT = [\n  'radial-gradient(ellipse 86% 68% at 10% 6%, rgba(52, 84, 108, 0.52) 0%, transparent 58%)',\n  'radial-gradient(ellipse 78% 62% at 94% 96%, rgba(22, 36, 50, 0.62) 0%, transparent 54%)',\n  'radial-gradient(ellipse 52% 46% at 58% 32%, rgba(38, 68, 92, 0.34) 0%, transparent 56%)',\n  'linear-gradient(162deg, #16222c 0%, #0c141e 46%, #111b27 74%, #192633 100%)',\n].join(', ');\n","import type { AXConversationMessageListThemeBackground } from '../models';\nimport {\n  MESSAGE_LIST_DARK_WALLPAPER_GRADIENT,\n  MESSAGE_LIST_LIGHT_WALLPAPER_GRADIENT,\n} from './message-list-background.patterns';\n\nexport interface AXConversationMessageListBackgroundPreset {\n  id: string;\n  value: AXConversationMessageListThemeBackground;\n}\n\n/** Library default when no per-conversation or global background is set (pattern-5 tile + gradient wash). */\nexport const AX_CONVERSATION_DEFAULT_MESSAGE_LIST_THEME_BACKGROUND: AXConversationMessageListThemeBackground = {\n  light: MESSAGE_LIST_LIGHT_WALLPAPER_GRADIENT,\n  dark: MESSAGE_LIST_DARK_WALLPAPER_GRADIENT,\n};\n\n/** Predefined chat-area backgrounds for the info panel (light + dark variants). */\nexport const AX_CONVERSATION_MESSAGE_LIST_BACKGROUND_PRESETS: AXConversationMessageListBackgroundPreset[] = [\n  {\n    id: 'solid-default',\n    value: AX_CONVERSATION_DEFAULT_MESSAGE_LIST_THEME_BACKGROUND,\n  },\n  {\n    id: 'solid-graphite',\n    value: {\n      light: 'rgb(var(--ax-sys-color-lighter-surface))',\n      dark: 'rgb(var(--ax-sys-color-darker-surface))',\n    },\n  },\n  {\n    id: 'solid-olive',\n    value: {\n      light: 'rgba(132, 144, 88, 0.24)',\n      dark: 'linear-gradient(165deg, rgba(163, 177, 110, 0.12) 0%, rgb(var(--ax-sys-color-darker-surface)) 70%)',\n    },\n  },\n  {\n    id: 'solid-sky',\n    value: {\n      light: 'rgba(56, 189, 248, 0.2)',\n      dark: 'linear-gradient(165deg, rgba(14, 165, 233, 0.14) 0%, rgb(var(--ax-sys-color-darker-surface)) 72%)',\n    },\n  },\n  {\n    id: 'grad-aurora',\n    value: {\n      light: 'linear-gradient(140deg, #60a5fa 0%, #a78bfa 55%, #f472b6 100%)',\n      dark: 'linear-gradient(140deg, rgba(30, 58, 138, 0.5) 0%, rgba(76, 29, 149, 0.38) 52%, rgb(var(--ax-sys-color-darker-surface)) 100%)',\n    },\n  },\n  {\n    id: 'grad-sunset',\n    value: {\n      light: 'linear-gradient(140deg, rgba(251, 113, 133, 0.34) 0%, rgba(251, 191, 36, 0.32) 100%)',\n      dark: 'linear-gradient(140deg, rgba(159, 18, 57, 0.38) 0%, rgba(146, 64, 14, 0.32) 55%, rgb(var(--ax-sys-color-darker-surface)) 100%)',\n    },\n  },\n];\n\nexport const AX_CONVERSATION_DEFAULT_MESSAGE_LIST_BACKGROUND_PRESET_ID = 'solid-default';\n","import type { AXConversationMessageListBackground, AXConversationMessageListThemeBackground } from '../models';\nimport {\n  MESSAGE_LIST_DARK_WALLPAPER_GRADIENT,\n  MESSAGE_LIST_LIGHT_WALLPAPER_GRADIENT,\n} from './message-list-background.patterns';\nimport { AX_CONVERSATION_DEFAULT_MESSAGE_LIST_THEME_BACKGROUND } from './message-list-background.presets';\n\n/** Subtle Telegram-style chat-area wash when `messageListBackground` is not set (theme-aware). */\nexport const AX_CONVERSATION_DEFAULT_MESSAGE_LIST_BACKGROUND =\n  AX_CONVERSATION_DEFAULT_MESSAGE_LIST_THEME_BACKGROUND.light;\n\nexport function isMessageListThemeBackground(\n  value: unknown,\n): value is AXConversationMessageListThemeBackground {\n  return (\n    typeof value === 'object' &&\n    value !== null &&\n    'light' in value &&\n    'dark' in value &&\n    typeof (value as AXConversationMessageListThemeBackground).light === 'string' &&\n    typeof (value as AXConversationMessageListThemeBackground).dark === 'string'\n  );\n}\n\n/** Pick the raw CSS string for the active theme; `undefined` when unset. */\nexport function resolveMessageListBackgroundRaw(\n  value: AXConversationMessageListBackground | undefined,\n  isDark: boolean,\n): string | undefined {\n  if (value === undefined) {\n    return undefined;\n  }\n  if (typeof value === 'string') {\n    if (value.trim() === '') {\n      return undefined;\n    }\n    return value;\n  }\n  return isDark ? value.dark : value.light;\n}\n\n/** Turn bare `https://...` or `/path` into valid CSS `background` for images. */\nexport function normalizeMessageListBackgroundValue(raw: string): string {\n  const v = raw.trim();\n  if (v === '') {\n    return AX_CONVERSATION_DEFAULT_MESSAGE_LIST_BACKGROUND;\n  }\n  const lower = v.toLowerCase();\n  if (lower === 'transparent' || lower === 'none') {\n    return v;\n  }\n  if (/^url\\s*\\(/i.test(v)) {\n    return v;\n  }\n  if (/^https?:\\/\\//i.test(v)) {\n    const escaped = v.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"');\n    return `url(\"${escaped}\") center / cover no-repeat`;\n  }\n  if (v.startsWith('/') && !/^(linear|radial|conic|rgb|hsl|var)\\b/i.test(v)) {\n    const escaped = v.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"');\n    return `url(\"${escaped}\") center / cover no-repeat`;\n  }\n  return v;\n}\n\n/** Whether the built-in pattern-5 wallpaper (gradient + tiled SVG) should be used. */\nexport function usesDefaultMessageListWallpaper(\n  value: AXConversationMessageListBackground | undefined,\n): boolean {\n  if (value === undefined) {\n    return true;\n  }\n  if (typeof value === 'string') {\n    return value.trim() === '';\n  }\n  return (\n    value.light === MESSAGE_LIST_LIGHT_WALLPAPER_GRADIENT && value.dark === MESSAGE_LIST_DARK_WALLPAPER_GRADIENT\n  );\n}\n\n/** Resolve config/metadata background for the active theme, with library default fallback. */\nexport function resolveMessageListBackgroundStyle(\n  value: AXConversationMessageListBackground | undefined,\n  isDark: boolean,\n): string {\n  const raw =\n    resolveMessageListBackgroundRaw(value, isDark) ??\n    resolveMessageListBackgroundRaw(AX_CONVERSATION_DEFAULT_MESSAGE_LIST_THEME_BACKGROUND, isDark);\n  if (raw === undefined) {\n    return AX_CONVERSATION_DEFAULT_MESSAGE_LIST_BACKGROUND;\n  }\n  return normalizeMessageListBackgroundValue(raw);\n}\n\n/** Whether two stored backgrounds represent the same preset (supports legacy string values). */\nexport function isSameMessageListBackground(\n  a: AXConversationMessageListBackground | undefined,\n  b: AXConversationMessageListThemeBackground,\n  isDark: boolean,\n): boolean {\n  if (a === undefined) {\n    return false;\n  }\n  if (typeof a === 'string') {\n    if (a === '') {\n      return false;\n    }\n    const themeValue = isDark ? b.dark : b.light;\n    return a === themeValue;\n  }\n  return a.light === b.light && a.dark === b.dark;\n}\n","import type { AXConversationParticipant, AXConversationUserProfile } from '../models';\n\nfunction isUserProfile(value: unknown): value is AXConversationUserProfile {\n  return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/** Resolves typed `profile`, falling back to legacy `metadata.profile`. */\nexport function resolveParticipantProfile(participant?: AXConversationParticipant): AXConversationUserProfile {\n  if (!participant) {\n    return {};\n  }\n\n  if (participant.profile) {\n    return participant.profile;\n  }\n\n  const legacy = participant.metadata?.['profile'];\n  return isUserProfile(legacy) ? legacy : {};\n}\n","export class AXConversationDateUtilsService {\n  /**\n   * Format relative time (e.g., \"2m ago\", \"1h ago\")\n   */\n  static formatRelativeTime(date: Date): string {\n    const now = new Date();\n    const diff = now.getTime() - date.getTime();\n    const seconds = Math.floor(diff / 1000);\n\n    if (seconds < 60) return 'just now';\n    if (seconds < 3600) return `${Math.floor(seconds / 60)}m ago`;\n    if (seconds < 86400) return `${Math.floor(seconds / 3600)}h ago`;\n    if (seconds < 604800) return `${Math.floor(seconds / 86400)}d ago`;\n\n    return date.toLocaleDateString();\n  }\n\n  /**\n   * Format date label (Today, Yesterday, or date)\n   */\n  static formatDateLabel(date: Date): string {\n    const today = new Date();\n    const yesterday = new Date(today);\n    yesterday.setDate(yesterday.getDate() - 1);\n\n    if (AXConversationDateUtilsService.isSameDay(date, today)) return 'Today';\n    if (AXConversationDateUtilsService.isSameDay(date, yesterday)) return 'Yesterday';\n\n    return date.toLocaleDateString('en-US', {\n      month: 'short',\n      day: 'numeric',\n      year: 'numeric',\n    });\n  }\n\n  /**\n   * Check if two dates are the same day\n   */\n  static isSameDay(date1: Date, date2: Date): boolean {\n    return (\n      date1.getFullYear() === date2.getFullYear() &&\n      date1.getMonth() === date2.getMonth() &&\n      date1.getDate() === date2.getDate()\n    );\n  }\n\n  /**\n   * Get date key for grouping (YYYY-MM-DD)\n   */\n  static getDateKey(date: Date): string {\n    return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')}`;\n  }\n\n  /**\n   * Format time (HH:MM)\n   */\n  static formatTime(date: Date): string {\n    return date.toLocaleTimeString('en-US', {\n      hour: '2-digit',\n      minute: '2-digit',\n    });\n  }\n}\n","import {\n  getFileExtension,\n  resolveFileCopyText,\n  resolveFileTypeExtension,\n  runFileTypeCopy,\n  runFileTypeOpen,\n  type AXFileTypeExtensionHint,\n  type AXFileTypeOpenContext,\n} from '@acorex/core/file';\nimport type { AXFileTypeRegistryService } from '@acorex/core/file';\nimport type { AXConversationMessage } from '../models';\n\nasync function inferFileExtensionHintFromMessageAsync(\n  message: AXConversationMessage,\n): Promise<AXFileTypeExtensionHint> {\n  switch (message.payload.type) {\n    case 'file': {\n      const { normalizeFilePayload } = await import(\n        '../plugins/message-list/components/file-renderer/file.payload'\n      );\n      const item = normalizeFilePayload(message.payload).files[0];\n      if (!item) {\n        return {};\n      }\n      return {\n        extensionName: item.extension ?? getFileExtension(item.name),\n        mimeType: item.mimeType,\n      };\n    }\n    case 'image': {\n      const { normalizeImagePayload } = await import(\n        '../plugins/message-list/components/image-renderer/image.payload'\n      );\n      const item = normalizeImagePayload(message.payload).images[0];\n      return { mimeType: item?.mimeType };\n    }\n    case 'video': {\n      const { normalizeVideoPayload } = await import(\n        '../plugins/message-list/components/video-renderer/video.payload'\n      );\n      const item = normalizeVideoPayload(message.payload).videos[0];\n      return { mimeType: item?.mimeType };\n    }\n    case 'audio': {\n      const { normalizeAudioPayload } = await import(\n        '../plugins/message-list/components/audio-renderer/audio.payload'\n      );\n      const item = normalizeAudioPayload(message.payload).audios[0];\n      return { mimeType: item?.mimeType };\n    }\n    case 'voice':\n      return { mimeType: message.payload.mimeType };\n    case 'sticker':\n      return { mimeType: message.payload.mimeType };\n    default:\n      return {};\n  }\n}\n\n/** Infer extension/MIME hints from a persisted message payload. */\nexport function inferFileExtensionHintFromMessage(message: AXConversationMessage): AXFileTypeExtensionHint {\n  switch (message.payload.type) {\n    case 'file': {\n      const payload = message.payload;\n      const files = Array.isArray(payload.files) ? payload.files : [];\n      const item = files[0];\n      if (!item) {\n        return {};\n      }\n      return {\n        extensionName: item.extension ?? getFileExtension(item.name),\n        mimeType: item.mimeType,\n      };\n    }\n    case 'image': {\n      const images = Array.isArray(message.payload.images) ? message.payload.images : [];\n      return { mimeType: images[0]?.mimeType };\n    }\n    case 'video': {\n      const videos = Array.isArray(message.payload.videos) ? message.payload.videos : [];\n      return { mimeType: videos[0]?.mimeType };\n    }\n    case 'audio': {\n      const audios = Array.isArray(message.payload.audios) ? message.payload.audios : [];\n      return { mimeType: audios[0]?.mimeType };\n    }\n    case 'voice':\n      return { mimeType: message.payload.mimeType };\n    case 'sticker':\n      return { mimeType: message.payload.mimeType };\n    default:\n      return {};\n  }\n}\n\n/** Use file-type `copy` on the message when `message.fileType` is set; otherwise fallback. */\nexport async function copyWithFileTypeFallback(\n  message: AXConversationMessage,\n  registry: AXFileTypeRegistryService,\n  fallback: () => string,\n): Promise<string> {\n  if (!message.fileType) {\n    return fallback();\n  }\n  const fileType = await registry.get(message.fileType);\n  if (!fileType) {\n    return fallback();\n  }\n  const extension = resolveFileTypeExtension(fileType, await inferFileExtensionHintFromMessageAsync(message));\n  const result = await runFileTypeCopy(fileType, message.payload, extension);\n  return resolveFileCopyText(result)?.trim() || fallback();\n}\n\n/** Use file-type `open` on the message when `message.fileType` is set. */\nexport async function openWithFileType(\n  message: AXConversationMessage,\n  registry: AXFileTypeRegistryService,\n  ctx: AXFileTypeOpenContext,\n): Promise<boolean> {\n  if (!message.fileType) {\n    return false;\n  }\n  const fileType = await registry.get(message.fileType);\n  if (!fileType) {\n    return false;\n  }\n  const extension = resolveFileTypeExtension(fileType, inferFileExtensionHintFromMessage(message));\n  const result = await runFileTypeOpen(fileType, ctx, message.payload, extension);\n  return result !== false;\n}\n","/** Inline or session-only URLs that must not be stored on message payloads or sent to APIs. */\nexport function isNonPersistableMediaUrl(url: string | undefined): boolean {\n  if (!url) {\n    return false;\n  }\n  const value = url.trim().toLowerCase();\n  return value.startsWith('data:') || value.startsWith('blob:');\n}\n\n/** Thumbnail for persistence/API (never data: or blob:). */\nexport function resolvePersistedThumbnailUrl(\n  thumbnailUrl: string | undefined,\n  contentUrl?: string,\n): string | undefined {\n  if (thumbnailUrl && !isNonPersistableMediaUrl(thumbnailUrl)) {\n    return thumbnailUrl;\n  }\n  if (contentUrl && !isNonPersistableMediaUrl(contentUrl)) {\n    return contentUrl;\n  }\n  return undefined;\n}\n\n/** Content URL safe to persist or bind on reload (blob:/data: are session-only). */\nexport function resolvePersistableMediaUrl(url: string | undefined): string | undefined {\n  const trimmed = url?.trim();\n  if (!trimmed || isNonPersistableMediaUrl(trimmed)) {\n    return undefined;\n  }\n  return trimmed;\n}\n\n/** First non-empty URL for img/video/audio at runtime (includes resolved blob: URLs). */\nexport function pickDisplayMediaUrl(...candidates: (string | null | undefined)[]): string {\n  for (const candidate of candidates) {\n    const trimmed = candidate?.trim();\n    if (trimmed) {\n      return trimmed;\n    }\n  }\n  return '';\n}\n","import type { AXConversationAudioMediaItem, AXConversationAudioPayload } from '../../../../models';\nimport { resolvePersistableMediaUrl } from '../../../composer/components/shared/persisted-media-url';\n\ntype AXConversationLooseRecord = Record<string, unknown>;\n\nfunction loose(payload: AXConversationAudioPayload): AXConversationLooseRecord {\n  return payload as unknown as AXConversationLooseRecord;\n}\n\nfunction str(value: unknown): string | undefined {\n  return typeof value === 'string' && value.length > 0 ? value : undefined;\n}\n\nfunction num(value: unknown, fallback = 0): number {\n  return typeof value === 'number' && Number.isFinite(value) ? value : fallback;\n}\n\nfunction sanitizeAudioItem(item: AXConversationAudioMediaItem): AXConversationAudioMediaItem {\n  const url = resolvePersistableMediaUrl(item.url);\n  if (url === item.url) {\n    return item;\n  }\n  return { ...item, url };\n}\n\nexport function normalizeAudioPayload(payload: AXConversationAudioPayload): AXConversationAudioPayload {\n  const raw = loose(payload);\n  const existing = raw['audios'];\n  if (Array.isArray(existing) && existing.length > 0) {\n    return {\n      type: 'audio',\n      audios: (existing as AXConversationAudioMediaItem[]).map(sanitizeAudioItem),\n      caption: payload.caption,\n    };\n  }\n\n  const url = resolvePersistableMediaUrl(str(raw['url']));\n  const mediaId = str(raw['mediaId']);\n  if (url || mediaId) {\n    return {\n      type: 'audio',\n      caption: payload.caption,\n      audios: [\n        {\n          ...(url ? { url } : {}),\n          title: str(raw['title']),\n          duration: num(raw['duration']),\n          mimeType: str(raw['mimeType']),\n          size: typeof raw['size'] === 'number' ? raw['size'] : undefined,\n          mediaId,\n          artist: str(raw['artist']),\n          coverUrl: str(raw['coverUrl']),\n          waveform: Array.isArray(raw['waveform']) ? (raw['waveform'] as number[]) : undefined,\n        },\n      ],\n    };\n  }\n\n  return { type: 'audio', audios: [], caption: payload.caption };\n}\n","import type { AXConversationFileMediaItem, AXConversationFilePayload } from '../../../../models';\nimport {\n  resolvePersistableMediaUrl,\n  resolvePersistedThumbnailUrl,\n} from '../../../composer/components/shared/persisted-media-url';\n\ntype AXConversationLooseRecord = Record<string, unknown>;\n\nfunction loose(payload: AXConversationFilePayload): AXConversationLooseRecord {\n  return payload as unknown as AXConversationLooseRecord;\n}\n\nfunction str(value: unknown): string | undefined {\n  return typeof value === 'string' && value.length > 0 ? value : undefined;\n}\n\nfunction sanitizeFileItem(item: AXConversationFileMediaItem): AXConversationFileMediaItem {\n  const url = resolvePersistableMediaUrl(item.url);\n  const thumbnailUrl = resolvePersistedThumbnailUrl(item.thumbnailUrl, url);\n  if (url === item.url && thumbnailUrl === item.thumbnailUrl) {\n    return item;\n  }\n  return { ...item, url, thumbnailUrl };\n}\n\nexport function normalizeFilePayload(payload: AXConversationFilePayload): AXConversationFilePayload {\n  const raw = loose(payload);\n  const existing = raw['files'];\n  if (Array.isArray(existing) && existing.length > 0) {\n    return {\n      type: 'file',\n      files: (existing as AXConversationFileMediaItem[]).map(sanitizeFileItem),\n      caption: payload.caption,\n    };\n  }\n\n  const url = resolvePersistableMediaUrl(str(raw['url']));\n  const mediaId = str(raw['mediaId']);\n  if (url || mediaId) {\n    return {\n      type: 'file',\n      caption: payload.caption,\n      files: [\n        {\n          ...(url ? { url } : {}),\n          name: str(raw['name']) ?? 'file',\n          mimeType: str(raw['mimeType']) ?? 'application/octet-stream',\n          size: typeof raw['size'] === 'number' ? raw['size'] : undefined,\n          mediaId,\n          thumbnailUrl: resolvePersistedThumbnailUrl(str(raw['thumbnailUrl']), url),\n          extension: str(raw['extension']),\n        },\n      ],\n    };\n  }\n\n  return { type: 'file', files: [], caption: payload.caption };\n}\n","import type { AXConversationImageMediaItem, AXConversationImagePayload } from '../../../../models';\nimport {\n  resolvePersistableMediaUrl,\n  resolvePersistedThumbnailUrl,\n} from '../../../composer/components/shared/persisted-media-url';\n\ntype AXConversationLooseRecord = Record<string, unknown>;\n\nfunction loose(payload: AXConversationImagePayload): AXConversationLooseRecord {\n  return payload as unknown as AXConversationLooseRecord;\n}\n\nfunction str(value: unknown): string | undefined {\n  return typeof value === 'string' && value.length > 0 ? value : undefined;\n}\n\nfunction num(value: unknown, fallback = 0): number {\n  return typeof value === 'number' && Number.isFinite(value) ? value : fallback;\n}\n\nfunction sanitizeImageItem(item: AXConversationImageMediaItem): AXConversationImageMediaItem {\n  const url = resolvePersistableMediaUrl(item.url);\n  const thumbnailUrl = resolvePersistedThumbnailUrl(item.thumbnailUrl, url);\n  if (url === item.url && thumbnailUrl === item.thumbnailUrl) {\n    return item;\n  }\n  return { ...item, url, thumbnailUrl };\n}\n\n/** Format image message payload for rendering (array shape, safe thumbnails). */\nexport function normalizeImagePayload(payload: AXConversationImagePayload): AXConversationImagePayload {\n  const raw = loose(payload);\n  const existing = raw['images'];\n  if (Array.isArray(existing) && existing.length > 0) {\n    return {\n      type: 'image',\n      images: (existing as AXConversationImageMediaItem[]).map(sanitizeImageItem),\n      caption: payload.caption,\n    };\n  }\n\n  const url = resolvePersistableMediaUrl(str(raw['url']));\n  const mediaId = str(raw['mediaId']);\n  if (url || mediaId) {\n    return {\n      type: 'image',\n      caption: payload.caption,\n      images: [\n        {\n          ...(url ? { url } : {}),\n          thumbnailUrl: resolvePersistedThumbnailUrl(str(raw['thumbnailUrl']), url),\n          width: num(raw['width']),\n          height: num(raw['height']),\n          mimeType: str(raw['mimeType']),\n          size: typeof raw['size'] === 'number' ? raw['size'] : undefined,\n          mediaId,\n          blurhash: str(raw['blurhash']),\n        },\n      ],\n    };\n  }\n\n  return { type: 'image', images: [], caption: payload.caption };\n}\n\n/** Preferred URL for grid / lightbox (never inline base64 thumbnails). */\nexport function resolveImageDisplayUrl(image: AXConversationImageMediaItem): string | undefined {\n  return resolvePersistedThumbnailUrl(image.thumbnailUrl, image.url) ?? image.url;\n}\n","import type { AXConversationVideoMediaItem, AXConversationVideoPayload } from '../../../../models';\nimport {\n  resolvePersistableMediaUrl,\n  resolvePersistedThumbnailUrl,\n} from '../../../composer/components/shared/persisted-media-url';\n\ntype AXConversationLooseRecord = Record<string, unknown>;\n\nfunction loose(payload: AXConversationVideoPayload): AXConversationLooseRecord {\n  return payload as unknown as AXConversationLooseRecord;\n}\n\nfunction str(value: unknown): string | undefined {\n  return typeof value === 'string' && value.length > 0 ? value : undefined;\n}\n\nfunction num(value: unknown, fallback = 0): number {\n  return typeof value === 'number' && Number.isFinite(value) ? value : fallback;\n}\n\nfunction sanitizeVideoItem(item: AXConversationVideoMediaItem): AXConversationVideoMediaItem {\n  const url = resolvePersistableMediaUrl(item.url);\n  const thumbnailUrl = resolvePersistedThumbnailUrl(item.thumbnailUrl, url);\n  if (url === item.url && thumbnailUrl === item.thumbnailUrl) {\n    return item;\n  }\n  return { ...item, url, thumbnailUrl };\n}\n\nexport function normalizeVideoPayload(payload: AXConversationVideoPayload): AXConversationVideoPayload {\n  const raw = loose(payload);\n  const existing = raw['videos'];\n  if (Array.isArray(existing) && existing.length > 0) {\n    return {\n      type: 'video',\n      videos: (existing as AXConversationVideoMediaItem[]).map(sanitizeVideoItem),\n      caption: payload.caption,\n    };\n  }\n\n  const url = resolvePersistableMediaUrl(str(raw['url']));\n  const mediaId = str(raw['mediaId']);\n  if (url || mediaId) {\n    return {\n      type: 'video',\n      caption: payload.caption,\n      videos: [\n        {\n          ...(url ? { url } : {}),\n          thumbnailUrl: resolvePersistedThumbnailUrl(str(raw['thumbnailUrl']), url),\n          duration: num(raw['duration']),\n          width: num(raw['width']),\n          height: num(raw['height']),\n          mimeType: str(raw['mimeType']),\n          size: typeof raw['size'] === 'number' ? raw['size'] : undefined,\n          mediaId,\n        },\n      ],\n    };\n  }\n\n  return { type: 'video', videos: [], caption: payload.caption };\n}\n","import type {\n  AXConversationAudioMediaItem,\n  AXConversationAudioPayload,\n  AXConversationFilePayload,\n  AXConversationImageMediaItem,\n  AXConversationImagePayload,\n  AXConversationMessage,\n  AXConversationStickerPayload,\n  AXConversationTextPayload,\n  AXConversationVideoMediaItem,\n  AXConversationVideoPayload,\n} from '../models';\nimport type { AXConversation, AXConversationParticipant } from '../models';\nimport type { AXConversationApi } from '../services/api';\nimport { resolvePrivatePeerUserId } from './avatar-context.utils';\nimport { resolveParticipantProfile } from './participant-profile.utils';\nimport { resolvePersistedThumbnailUrl } from '../plugins/composer/components/shared/persisted-media-url';\nimport { normalizeAudioPayload } from '../plugins/message-list/components/audio-renderer/audio.payload';\nimport { normalizeFilePayload } from '../plugins/message-list/components/file-renderer/file.payload';\nimport { normalizeImagePayload, resolveImageDisplayUrl } from '../plugins/message-list/components/image-renderer/image.payload';\nimport { normalizeVideoPayload } from '../plugins/message-list/components/video-renderer/video.payload';\n\nexport interface AXConversationInfoProfileField {\n  id: string;\n  labelKey: string;\n  value: string;\n  icon: string;\n}\n\nexport type AXConversationMediaCategoryId =\n  | 'image'\n  | 'video'\n  | 'file'\n  | 'audio'\n  | 'voice'\n  | 'sticker'\n  | 'location'\n  | 'link';\n\nexport interface AXConversationMediaCategory {\n  id: AXConversationMediaCategoryId;\n  labelKey: string;\n  countLabelKey: string;\n  icon: string;\n  count: number;\n}\n\nconst AX_CONVERSATION_URL_PATTERN = /https?:\\/\\/[^\\s<>\"']+/i;\n\nexport function messageContainsLink(message: AXConversationMessage): boolean {\n  return countLinksInMessage(message) > 0;\n}\n\nfunction countLinksInMessage(message: AXConversationMessage): number {\n  if (message.type !== 'text') {\n    return 0;\n  }\n  const payload = message.payload as AXConversationTextPayload;\n  if (payload.links?.length) {\n    return payload.links.length;\n  }\n  const text = payload.text ?? '';\n  const matches = text.match(new RegExp(AX_CONVERSATION_URL_PATTERN.source, 'gi'));\n  return matches?.length ?? 0;\n}\n\nfunction countMediaItemsInMessage(message: AXConversationMessage): Partial<Record<AXConversationMediaCategoryId, number>> {\n  const linkCount = countLinksInMessage(message);\n  if (linkCount > 0) {\n    return { link: linkCount };\n  }\n\n  switch (message.type) {\n    case 'image': {\n      const count = normalizeImagePayload(message.payload as AXConversationImagePayload).images.length;\n      return count > 0 ? { image: count } : {};\n    }\n    case 'video': {\n      const count = normalizeVideoPayload(message.payload as AXConversationVideoPayload).videos.length;\n      return count > 0 ? { video: count } : {};\n    }\n    case 'audio': {\n      const count = normalizeAudioPayload(message.payload as AXConversationAudioPayload).audios.length;\n      return count > 0 ? { audio: count } : {};\n    }\n    case 'file': {\n      const count = normalizeFilePayload(message.payload as AXConversationFilePayload).files.length;\n      return count > 0 ? { file: count } : {};\n    }\n    case 'voice':\n      return { voice: 1 };\n    case 'sticker':\n      return { sticker: 1 };\n    case 'location':\n      return { location: 1 };\n    default:\n      return {};\n  }\n}\n\nexport function getPrivatePeerParticipant(\n  conversation: AXConversation,\n  currentUserId?: string,\n): AXConversationParticipant | undefined {\n  const peerId = resolvePrivatePeerUserId(conversation, currentUserId);\n  if (!peerId) return undefined;\n  return conversation.participants.find((p) => p.id === peerId);\n}\n\nexport function getConversationProfileFields(\n  conversation: AXConversation,\n  currentUserId?: string,\n): AXConversationInfoProfileField[] {\n  const fields: AXConversationInfoProfileField[] = [];\n\n  if (conversation.type === 'private') {\n    const peer = getPrivatePeerParticipant(conversation, currentUserId);\n    const profile = resolveParticipantProfile(peer);\n\n    const addField = (id: string, labelKey: string, icon: string, value: string | undefined): void => {\n      if (value?.trim()) {\n        fields.push({ id, labelKey, icon, value: value.trim() });\n      }\n    };\n\n    addField('bio', '@acorex:chat.info-panel.profile.bio', 'fa-light fa-align-left', profile.bio);\n    addField('phone', '@acorex:chat.info-panel.profile.phone', 'fa-light fa-phone', profile.phone);\n    addField('email', '@acorex:chat.info-panel.profile.email', 'fa-light fa-envelope', profile.email);\n    addField('username', '@acorex:chat.info-panel.profile.username', 'fa-light fa-at', profile.username);\n    addField('location', '@acorex:chat.info-panel.profile.location', 'fa-light fa-location-dot', profile.location);\n    addField('company', '@acorex:chat.info-panel.profile.company', 'fa-light fa-building', profile.company);\n    addField('title', '@acorex:chat.info-panel.profile.title', 'fa-light fa-briefcase', profile.title);\n\n    if (peer?.description?.trim()) {\n      fields.unshift({\n        id: 'description',\n        labelKey: '@acorex:chat.info-panel.profile.about',\n        icon: 'fa-light fa-user',\n        value: peer.description.trim(),\n      });\n    }\n  } else if (conversation.description?.trim()) {\n    fields.push({\n      id: 'description',\n      labelKey: '@acorex:chat.info-panel.profile.about',\n      icon: 'fa-light fa-align-left',\n      value: conversation.description.trim(),\n    });\n  }\n\n  const groupInfo = (conversation.metadata?.['profile'] as { groupInfo?: { purpose?: string } } | undefined)?.groupInfo;\n  if (groupInfo?.purpose?.trim()) {\n    fields.push({\n      id: 'purpose',\n      labelKey: '@acorex:chat.info-panel.profile.purpose',\n      icon: 'fa-light fa-bullseye',\n      value: groupInfo.purpose.trim(),\n    });\n  }\n\n  return fields;\n}\n\nexport function getConversationMediaCategories(messages: AXConversationMessage[]): AXConversationMediaCategory[] {\n  const counts: Record<AXConversationMediaCategoryId, number> = {\n    image: 0,\n    video: 0,\n    file: 0,\n    audio: 0,\n    voice: 0,\n    sticker: 0,\n    location: 0,\n    link: 0,\n  };\n\n  for (const message of messages) {\n    const itemCounts = countMediaItemsInMessage(message);\n    for (const [categoryId, count] of Object.entries(itemCounts) as Array<[AXConversationMediaCategoryId, number]>) {\n      counts[categoryId] += count;\n    }\n  }\n\n  const definitions: Array<Omit<AXConversationMediaCategory, 'count'>> = [\n    {\n      id: 'image',\n      labelKey: '@acorex:chat.info-panel.media.photos',\n      countLabelKey: '@acorex:chat.info-panel.media.count-photos',\n      icon: 'fa-light fa-image',\n    },\n    {\n      id: 'video',\n      labelKey: '@acorex:chat.info-panel.media.videos',\n      countLabelKey: '@acorex:chat.info-panel.media.count-videos',\n      icon: 'fa-light fa-video',\n    },\n    {\n      id: 'file',\n      labelKey: '@acorex:chat.info-panel.media.files',\n      countLabelKey: '@acorex:chat.info-panel.media.count-files',\n      icon: 'fa-light fa-file',\n    },\n    {\n      id: 'audio',\n      labelKey: '@acorex:chat.info-panel.media.audio',\n      countLabelKey: '@acorex:chat.info-panel.media.count-audio',\n      icon: 'fa-light fa-headphones',\n    },\n    {\n      id: 'link',\n      labelKey: '@acorex:chat.info-panel.media.links',\n      countLabelKey: '@acorex:chat.info-panel.media.count-links',\n      icon: 'fa-light fa-link',\n    },\n    {\n      id: 'voice',\n      labelKey: '@acorex:chat.info-panel.media.voice',\n      countLabelKey: '@acorex:chat.info-panel.media.count-voice',\n      icon: 'fa-light fa-microphone',\n    },\n    {\n      id: 'sticker',\n      labelKey: '@acorex:chat.info-panel.media.stickers',\n      countLabelKey: '@acorex:chat.info-panel.media.count-stickers',\n      icon: 'fa-light fa-note-sticky',\n    },\n    {\n      id: 'location',\n      labelKey: '@acorex:chat.info-panel.media.locations',\n      countLabelKey: '@acorex:chat.info-panel.media.count-locations',\n      icon: 'fa-light fa-location-dot',\n    },\n  ];\n\n  return definitions\n    .map((definition) => ({ ...definition, count: counts[definition.id] }))\n    .filter((category) => category.count > 0);\n}\n\nexport function filterMessagesByMediaCategory(\n  messages: AXConversationMessage[],\n  categoryId: AXConversationMediaCategoryId,\n): AXConversationMessage[] {\n  return messages.filter((message) => {\n    if (categoryId === 'link') {\n      return messageContainsLink(message);\n    }\n    return message.type === categoryId;\n  });\n}\n\nexport function isGridMediaCategory(categoryId: AXConversationMediaCategoryId): boolean {\n  return categoryId === 'image' || categoryId === 'sticker';\n}\n\nexport function isAttachmentListCategory(categoryId: AXConversationMediaCategoryId): boolean {\n  return categoryId === 'video' || categoryId === 'audio';\n}\n\nexport interface AXConversationMediaGalleryTile {\n  key: string;\n  message: AXConversationMessage;\n  kind: 'image' | 'video' | 'sticker';\n  image?: AXConversationImageMediaItem;\n  video?: AXConversationVideoMediaItem;\n  stickerUrl?: string;\n  stickerAlt?: string;\n}\n\nexport function buildMediaGalleryTiles(\n  messages: AXConversationMessage[],\n  categoryId: AXConversationMediaCategoryId,\n): AXConversationMediaGalleryTile[] {\n  const filtered = filterMessagesByMediaCategory(messages, categoryId);\n  const tiles: AXConversationMediaGalleryTile[] = [];\n\n  for (const message of filtered) {\n    if (categoryId === 'image') {\n      const payload = normalizeImagePayload(message.payload as AXConversationImagePayload);\n      for (const image of payload.images) {\n        tiles.push({\n          key: `${message.id}:${image.mediaId ?? image.url ?? tiles.length}`,\n          message,\n          kind: 'image',\n          image,\n        });\n      }\n      continue;\n    }\n\n    if (categoryId === 'video') {\n      const payload = normalizeVideoPayload(message.payload as AXConversationVideoPayload);\n      for (const video of payload.videos) {\n        tiles.push({\n          key: `${message.id}:${video.mediaId ?? video.url ?? tiles.length}`,\n          message,\n          kind: 'video',\n          video,\n        });\n      }\n      continue;\n    }\n\n    if (categoryId === 'sticker') {\n      const payload = message.payload as AXConversationStickerPayload;\n      tiles.push({\n        key: message.id,\n        message,\n        kind: 'sticker',\n        stickerUrl: payload.url,\n        stickerAlt: payload.emoji || 'Sticker',\n      });\n    }\n  }\n\n  return tiles;\n}\n\nexport function resolveVideoThumbnailUrl(video: AXConversationVideoMediaItem): string | undefined {\n  return resolvePersistedThumbnailUrl(video.thumbnailUrl, video.url) ?? video.url;\n}\n\nexport function resolveGalleryImageUrl(image: AXConversationImageMediaItem): string | undefined {\n  return resolveImageDisplayUrl(image);\n}\n\nexport function getMessageVideoItems(message: AXConversationMessage): AXConversationVideoMediaItem[] {\n  if (message.type !== 'video') {\n    return [];\n  }\n  return normalizeVideoPayload(message.payload as AXConversationVideoPayload).videos;\n}\n\nexport function getMessageAudioItems(message: AXConversationMessage): AXConversationAudioMediaItem[] {\n  if (message.type !== 'audio') {\n    return [];\n  }\n  return normalizeAudioPayload(message.payload as AXConversationAudioPayload).audios;\n}\n\nexport interface AXConversationMediaPageResult {\n  items: AXConversationMessage[];\n  hasMore: boolean;\n  nextCursor?: string;\n  page: number;\n}\n\nconst AX_INFO_PANEL_MEDIA_PAGE_SIZE = 50;\n\nexport async function fetchConversationMediaPage(\n  conversationApi: AXConversationApi,\n  conversationId: string,\n  page: number,\n  pageSize = AX_INFO_PANEL_MEDIA_PAGE_SIZE,\n  cursor?: string,\n): Promise<AXConversationMediaPageResult> {\n  const result = await conversationApi.getConversationMedia(conversationId, {\n    page,\n    pageSize,\n    cursor,\n  });\n\n  const items: AXConversationMessage[] = [];\n  const seenIds = new Set<string>();\n\n  for (const item of result.items) {\n    const message = item as AXConversationMessage;\n    if (message?.id && !seenIds.has(message.id)) {\n      seenIds.add(message.id);\n      items.push(message);\n    }\n  }\n\n  return {\n    items,\n    hasMore: result.hasMore,\n    nextCursor: result.nextCursor,\n    page,\n  };\n}\n\n/** Merge media API results with in-memory messages needed for link/sticker/voice/location tabs. */\nexport function mergeInfoPanelMessages(\n  mediaMessages: AXConversationMessage[],\n  supplemental: AXConversationMessage[],\n): AXConversationMessage[] {\n  const byId = new Map<string, AXConversationMessage>();\n  for (const message of mediaMessages) {\n    byId.set(message.id, message);\n  }\n  for (const message of supplemental) {\n    if (!byId.has(message.id)) {\n      byId.set(message.id, message);\n    }\n  }\n  return Array.from(byId.values()).sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime());\n}\n\nexport function filterSupplementalInfoPanelMessages(messages: AXConversationMessage[]): AXConversationMessage[] {\n  return messages.filter(\n    (message) =>\n      message.type === 'voice' ||\n      message.type === 'sticker' ||\n      message.type === 'location' ||\n      (message.type === 'text' && messageContainsLink(message)),\n  );\n}\n","/**\n * AXConversationMessageListService\n * Facade/service for Message List to interact with conversation and registries.\n */\nimport { computed, inject, Injectable, signal } from '@angular/core';\nimport { AXConversationMessage } from '../../models';\nimport type { AXConversationMessageRendererComponent } from '../../registries/message-renderer.registry';\nimport { AXConversationService } from '../../services';\nimport { AXConversationDateUtilsService } from '../../utils';\n\n@Injectable()\nexport class AXConversationMessageListService {\n  private readonly conversationService = inject(AXConversationService);\n\n  // Access registry through conversation service\n  private get registry() {\n    return this.conversationService.registry;\n  }\n\n  readonly activeConversation = this.conversationService.activeConversation;\n  readonly activeMessages = this.conversationService.activeMessages;\n  readonly currentUser = this.conversationService.currentUser;\n\n  /** Initial message history load (conversation switch) */\n  readonly loading = this.conversationService.loadingActiveMessages;\n\n  /** Loading older messages (scroll-up pagination) */\n  readonly loadingMore = signal(false);\n\n  /** Whether older messages can be loaded */\n  readonly hasMoreMessages = computed(() => this.conversationService.activeMessagesPagination().hasMore);\n\n  /** Show scroll to bottom button */\n  readonly showScrollButton = signal(false);\n\n  /** Scroll requests counter */\n  readonly scrollRequests = signal(0);\n\n  /** Live renderer instances keyed by message id (for message actions). */\n  private readonly _rendererInstances = new Map<string, AXConversationMessageRendererComponent>();\n\n  /**\n   * Reply counts merged from API fields and loaded messages.\n   */\n  readonly replyCounts = computed(() => this.buildCountMap('reply'));\n\n  /**\n   * Forward counts merged from API fields and loaded messages.\n   */\n  readonly forwardCounts = computed(() => this.buildCountMap('forward'));\n\n  registerRendererInstance(messageId: string, instance: AXConversationMessageRendererComponent): void {\n    this._rendererInstances.set(messageId, instance);\n  }\n\n  unregisterRendererInstance(messageId: string): void {\n    this._rendererInstances.delete(messageId);\n  }\n\n  getRendererInstance(messageId: string): AXConversationMessageRendererComponent | undefined {\n    return this._rendererInstances.get(messageId);\n  }\n\n  getReplyCount(messageId: string): number {\n    return this.replyCounts().get(messageId) ?? 0;\n  }\n\n  getForwardCount(messageId: string): number {\n    return this.forwardCounts().get(messageId) ?? 0;\n  }\n\n  /** Message grouped by date */\n  readonly messageGroups = computed(() => {\n    const messages = this.activeMessages();\n    const groups = new Map<string, AXConversationMessage[]>();\n\n    messages.forEach((message) => {\n      const dateKey = AXConversationDateUtilsService.getDateKey(message.timestamp);\n      if (!groups.has(dateKey)) {\n        groups.set(dateKey, []);\n      }\n      const group = groups.get(dateKey);\n      if (group) {\n        group.push(message);\n      }\n    });\n\n    return Array.from(groups.entries()).map(([dateKey, messages]) => ({\n      date: dateKey,\n      dateLabel: AXConversationDateUtilsService.formatDateLabel(new Date(dateKey)),\n      messages,\n    }));\n  });\n\n  /**\n   * Load older messages when the user scrolls near the top.\n   */\n  async loadMoreMessages(): Promise<boolean> {\n    if (!this.hasMoreMessages() || this.loadingMore() || this.loading()) {\n      return false;\n    }\n\n    const conversation = this.activeConversation();\n    if (!conversation) {\n      return false;\n    }\n\n    const { page } = this.conversationService.activeMessagesPagination();\n    const nextPage = page + 1;\n\n    this.loadingMore.set(true);\n    try {\n      const result = await this.conversationService.loadMessages(conversation.id, nextPage);\n      return result.items.length > 0 || result.hasMore;\n    } finally {\n      this.loadingMore.set(false);\n    }\n  }\n\n  /**\n   * Reset pagination when switching conversations (page 0 is loaded by {@link AXConversationService.selectConversation}).\n   */\n  resetPagination(): void {\n    // Pagination state lives on AXConversationService; this hook remains for conversation-switch effects.\n  }\n\n  getMenuActions(message: AXConversationMessage) {\n    const user = this.currentUser();\n    if (!user) return [];\n    return this.registry.messageActions.getMenuActions(message, user);\n  }\n\n  async executeAction(message: AXConversationMessage, actionId: string): Promise<void> {\n    const user = this.currentUser();\n    if (!user) return;\n    const conversation = this.activeConversation();\n\n    await this.registry.messageActions.executeAction(actionId, {\n      message,\n      currentUser: user,\n      participants: conversation?.participants || [],\n      renderer: this.getRendererInstance(message.id),\n    });\n  }\n\n  reactToMessage(messageId: string, emoji: string): Promise<void> {\n    return this.conversationService.reactToMessage(messageId, emoji);\n  }\n\n  /** Request message list to scroll to bottom */\n  requestScrollToBottom(): void {\n    this.scrollRequests.update((n) => n + 1);\n  }\n\n  private buildCountMap(kind: 'reply' | 'forward'): Map<string, number> {\n    const messages = this.activeMessages();\n    const counts = new Map<string, number>();\n\n    for (const message of messages) {\n      const fromApi = kind === 'reply' ? message.replyCount : message.forwardCount;\n      if (fromApi != null) {\n        counts.set(message.id, fromApi);\n      }\n    }\n\n    for (const message of messages) {\n      if (kind === 'reply' && message.replyTo?.id) {\n        const targetId = message.replyTo.id;\n        counts.set(targetId, (counts.get(targetId) ?? 0) + 1);\n      }\n      if (kind === 'forward' && message.forwardedFrom?.messageId) {\n        const targetId = message.forwardedFrom.messageId;\n        counts.set(targetId, (counts.get(targetId) ?? 0) + 1);\n      }\n    }\n\n    return counts;\n  }\n}\n","import { NgComponentOutlet } from '@angular/common';\nimport { Component, ViewEncapsulation, effect, input, signal, Type } from '@angular/core';\n\nexport interface AXConversationRegistryComponentRef {\n  component?: Type<unknown>;\n  componentLoader?: () => Promise<Type<unknown>>;\n}\n\n@Component({\n  selector: 'ax-conversation-registry-component-outlet',\n  encapsulation: ViewEncapsulation.None,\n\n  imports: [NgComponentOutlet],\n  templateUrl: './registry-component-outlet.component.html',\n  styleUrl: './registry-component-outlet.component.css',\n})\nexport class AXConversationRegistryComponentOutletComponent {\n  readonly component = input<Type<unknown> | undefined>();\n  readonly componentLoader = input<(() => Promise<Type<unknown>>) | undefined>();\n  readonly inputs = input<Record<string, unknown>>({});\n\n  readonly resolvedComponent = signal<Type<unknown> | null>(null);\n\n  /** Avoid re-loading when the parent re-binds the same lazy loader reference. */\n  private activeLoader: (() => Promise<Type<unknown>>) | null = null;\n\n  constructor() {\n    effect(() => {\n      const direct = this.component();\n      const loader = this.componentLoader();\n\n      if (direct) {\n        this.activeLoader = null;\n        this.resolvedComponent.set(direct);\n        return;\n      }\n\n      if (!loader) {\n        this.activeLoader = null;\n        this.resolvedComponent.set(null);\n        return;\n      }\n\n      if (this.resolvedComponent() && this.activeLoader === loader) {\n        return;\n      }\n\n      this.activeLoader = loader;\n      void loader().then((loaded) => {\n        if (this.activeLoader !== loader) {\n          return;\n        }\n        this.resolvedComponent.set(loaded);\n      });\n    });\n  }\n}\n\n/** Resolve a registry component reference, preferring lazy loaders when provided. */\nexport function hasRegistryComponent(ref?: AXConversationRegistryComponentRef): boolean {\n  return !!ref?.component || !!ref?.componentLoader;\n}\n","@if (resolvedComponent(); as component) {\n  <ng-container *ngComponentOutlet=\"component; inputs: inputs()\" />\n}\n","import type { AXPopupService } from '@acorex/components/popup';\nimport type { AXConversation } from '../../models';\nimport { resolveComposerMaxFiles } from '../../plugins/composer/composer-upload.config';\nimport type { AXConversationComposerAction } from '../../registries/composer-action.registry';\nimport type { AXConversationConfig } from '../../tokens/conversation-config.interface';\nimport type { AXConversationComposerService } from './composer.service';\n\nexport type ComposerActionOverlayCloser = () => void;\n\nexport interface OpenComposerActionOverlayOptions {\n  popupService: AXPopupService;\n  composerService: AXConversationComposerService;\n  action: AXConversationComposerAction;\n  conversation: AXConversation;\n  config: Pick<Required<AXConversationConfig>, 'maxFilesPerMessage'>;\n  inputs?: Record<string, unknown>;\n  initialFiles?: File[];\n  onClosed?: () => void;\n}\n\nexport async function openComposerActionOverlay(\n  options: OpenComposerActionOverlayOptions,\n): Promise<ComposerActionOverlayCloser | undefined> {\n  const {\n    popupService,\n    composerService,\n    action,\n    conversation,\n    config,\n    inputs = {},\n    initialFiles,\n    onClosed,\n  } = options;\n\n  const component = action.component ?? (action.componentLoader ? await action.componentLoader() : undefined);\n  if (!component) {\n    return undefined;\n  }\n\n  const hasInitialFiles = !!initialFiles?.length;\n  const shouldAutoRun = action.autoRun === true && !hasInitialFiles;\n\n  const contentInputs: Record<string, unknown> = {\n    conversation,\n    maxFiles: resolveComposerMaxFiles(action, config),\n    service: composerService,\n    autoRun: shouldAutoRun,\n    ...inputs,\n  };\n\n  if (hasInitialFiles) {\n    contentInputs['initialFiles'] = initialFiles;\n  }\n\n  const isLocationPicker = action.id === 'location';\n  const pickerPanelClass = isLocationPicker\n    ? ['ax-conversation-composer-picker-popup', 'ax-conversation-composer-picker-popup--location']\n    : ['ax-conversation-composer-picker-popup'];\n\n  const popupRef = await popupService.openRef(component, {\n    size: 'md',\n    closeButton: false,\n    header: false,\n    closeOnBackdropClick: true,\n    panelClass: pickerPanelClass,\n    inputs: contentInputs,\n  });\n\n  popupRef.onClose.subscribe(() => onClosed?.());\n\n  return () => popupRef.close();\n}\n","/**\n * AXConversationComposerService\n * Facade/service for Composer to interact with conversation and manage reply/edit state.\n */\nimport { AXPopupService } from '@acorex/components/popup';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { computed, inject, Injectable, signal } from '@angular/core';\nimport { AXConversationMessage, AXConversationSendMessageCommand } from '../../models';\nimport type { AXConversationSendMessageOptions } from '../../models/conversation-upload.types';\nimport { AXConversationComposerAction, AXConversationComposerActionContext } from '../../registries';\nimport { AXConversationService } from '../../services';\nimport { AXConversationComposerGenerationStateService } from '../../services/composer-generation-state.service';\nimport { AX_CONVERSATION_CONFIG } from '../../tokens';\nimport { openComposerActionOverlay } from './open-composer-action-overlay';\n\n/** Primary composer button mode (send / cancel / stopping / default action / locked). */\nexport type AXConversationComposerPrimaryButtonMode = 'send' | 'cancel' | 'stopping' | 'default-action' | 'locked';\n\n@Injectable()\nexport class AXConversationComposerService {\n  private readonly conversationService = inject(AXConversationService);\n  private readonly generationState = inject(AXConversationComposerGenerationStateService);\n  private readonly translation = inject(AXTranslationService);\n  private readonly popupService = inject(AXPopupService);\n  private readonly config = inject(AX_CONVERSATION_CONFIG);\n\n  private readonly _activeActionOverlay = signal<{ actionId: string; close: () => void } | null>(null);\n\n  // Access registry through conversation service\n  private get registry() {\n    return this.conversationService.registry;\n  }\n\n  // Reply/Edit state signals (public as readonly)\n  private readonly _replyMessage = signal<AXConversationMessage | null>(null);\n  private readonly _editMessage = signal<AXConversationMessage | null>(null);\n\n  readonly replyMessage = this._replyMessage.asReadonly();\n  readonly editMessage = this._editMessage.asReadonly();\n\n  readonly activeConversation = this.conversationService.activeConversation;\n  readonly activeMessages = this.conversationService.activeMessages;\n\n  /** Draft text */\n  readonly draftText = signal('');\n\n  /** Attachments */\n  readonly attachments = signal<File[]>([]);\n\n  /** Incremented to request focus on the composer text area (handled by AXConversationComposerComponent). */\n  private readonly _focusRequest = signal(0);\n  readonly focusRequest = this._focusRequest.asReadonly();\n\n  /** Input placeholder */\n  readonly placeholder = computed(() => {\n    const conversation = this.activeConversation();\n    if (!conversation) return this.translation.translateSync('@acorex:chat.placeholders.select-conversation');\n    return this.translation.translateSync('@acorex:chat.placeholders.type-message');\n  });\n\n  /** Number of input rows */\n  readonly inputRows = computed(() => {\n    const text = this.draftText();\n    const lines = text.split('\\n').length;\n    return Math.min(Math.max(lines, 1), 12);\n  });\n\n  /** Can send message (draft has content; does not include generation state). */\n  readonly canSend = computed(() => {\n    const text = this.draftText().trim();\n    const attachments = this.attachments();\n    return text.length > 0 || attachments.length > 0;\n  });\n\n  /** Whether a background generation (e.g. AI response) is in progress. */\n  readonly isGenerating = this.generationState.isGenerating;\n\n  /** Whether cancel cleanup is in progress (spinner on primary button). */\n  readonly isStopping = this.generationState.isStopping;\n\n  /** Primary end-button mode for send / cancel / stopping / voice / locked. */\n  readonly primaryButtonMode = computed((): AXConversationComposerPrimaryButtonMode => {\n    if (this.isStopping()) {\n      return 'stopping';\n    }\n    if (this.isGenerating()) {\n      return 'cancel';\n    }\n    if (this.canSend()) {\n      return 'send';\n    }\n    if (this.defaultAction()) {\n      return 'default-action';\n    }\n    return 'locked';\n  });\n\n  /** Composer action context */\n  readonly actionContext = computed((): AXConversationComposerActionContext => {\n    const conversation = this.activeConversation();\n    const editMsg = this.editMessage();\n    const replyMsg = this.replyMessage();\n\n    return {\n      draftText: this.draftText(),\n      conversationId: conversation?.id || '',\n      isEditing: !!editMsg,\n      editingMessageId: editMsg?.id,\n      isReplying: !!replyMsg,\n      replyingToMessageId: replyMsg?.id,\n      isGenerating: this.isGenerating(),\n      isStopping: this.isStopping(),\n    };\n  });\n\n  /** Start actions from registry */\n  readonly startActions = computed(() => {\n    const context = this.actionContext();\n    return this.registry.composerActions\n      .getVisibleActions('start', context)\n      .sort((a, b) => (a.priority ?? 0) - (b.priority ?? 0));\n  });\n\n  /** End actions from registry */\n  readonly endActions = computed(() => {\n    const context = this.actionContext();\n    return this.registry.composerActions\n      .getVisibleActions('end', context)\n      .sort((a, b) => (a.priority ?? 0) - (b.priority ?? 0));\n  });\n\n  /** Start inline actions (location = 'inline' or undefined) */\n  readonly startInlineActions = computed(() => {\n    return this.startActions()\n      .filter((action) => action.location !== 'menu')\n      .sort((a, b) => (a.priority ?? 0) - (b.priority ?? 0));\n  });\n\n  /** Start menu actions — shown in the attachment popup */\n  readonly startMenuActions = computed(() => {\n    return this.startActions()\n      .filter((action) => action.location === 'menu')\n      .sort((a, b) => (a.priority ?? 0) - (b.priority ?? 0));\n  });\n\n  /** End inline actions inside the input pill (excludes default action) */\n  readonly endInlineActions = computed(() => {\n    return this.endActions()\n      .filter((action) => action.location !== 'menu' && !action.default)\n      .sort((a, b) => (a.priority ?? 0) - (b.priority ?? 0));\n  });\n\n  /** End menu actions (location = 'menu') */\n  readonly endMenuActions = computed(() => {\n    return this.endActions()\n      .filter((action) => action.location === 'menu')\n      .sort((a, b) => (a.priority ?? 0) - (b.priority ?? 0));\n  });\n\n  /** Default end action (voice/send morph button) */\n  readonly defaultAction = computed(() => {\n    const context = this.actionContext();\n    return this.registry.composerActions.getVisibleActions('end', context).find((action) => action.default);\n  });\n\n  cancelGeneration(): void {\n    this.generationState.cancel();\n  }\n\n  startReply(message: AXConversationMessage): void {\n    this._editMessage.set(null);\n    this._replyMessage.set(message);\n    this.focusComposer();\n  }\n\n  startEdit(message: AXConversationMessage): void {\n    this._replyMessage.set(null);\n    this._editMessage.set(message);\n    this.focusComposer();\n  }\n\n  /** Focus the composer text area when the composer component is mounted. */\n  focusComposer(): void {\n    this._focusRequest.update((n) => n + 1);\n  }\n\n  clear(): void {\n    this.hideComponent();\n    this._replyMessage.set(null);\n    this._editMessage.set(null);\n  }\n\n  /**\n   * Persist draft for the previous conversation and reset composer UI state when switching conversations.\n   */\n  onConversationChanged(previousConversationId: string | null, currentConversationId: string | null): void {\n    if (previousConversationId && previousConversationId !== currentConversationId && !this.editMessage()) {\n      this.saveDraft(previousConversationId, this.draftText());\n    }\n\n    this.clear();\n    this.attachments.set([]);\n    this.draftText.set(currentConversationId ? this.loadDraft(currentConversationId) : '');\n    this.generationState.setGenerating(false);\n  }\n\n  async sendTypingIndicator(conversationId: string): Promise<void> {\n    await this.conversationService.sendTypingIndicator(conversationId);\n  }\n\n  async sendMessage(\n    command: AXConversationSendMessageCommand,\n    options?: AXConversationSendMessageOptions,\n  ): Promise<void> {\n    const replyToId = command.replyToId ?? this._replyMessage()?.id;\n    const sendCommand = replyToId ? { ...command, replyToId } : command;\n    this.clearComposerInput(command.conversationId);\n    await this.conversationService.sendMessage(sendCommand, options);\n  }\n\n  /**\n   * Resets composer input immediately when a send starts so upload/API work continues in the background.\n   */\n  clearComposerInput(conversationId?: string): void {\n    this.draftText.set('');\n    this.attachments.set([]);\n    this.hideComponent();\n    this._replyMessage.set(null);\n    this._editMessage.set(null);\n    if (conversationId) {\n      this.clearDraft(conversationId);\n    }\n    this.focusComposer();\n  }\n\n  /**\n   * Open a composer action component in a popup (desktop) or action sheet (mobile).\n   */\n  async openActionComponent(\n    action: AXConversationComposerAction,\n    inputs?: Record<string, unknown>,\n    options?: { toggleable?: boolean; initialFiles?: File[] },\n  ): Promise<void> {\n    if (options?.toggleable) {\n      const current = this._activeActionOverlay();\n      if (current?.actionId === action.id) {\n        this.hideComponent();\n        return;\n      }\n    }\n\n    this.hideComponent();\n\n    const conversation = this.activeConversation();\n    if (!conversation) {\n      return;\n    }\n\n    const close = await openComposerActionOverlay({\n      popupService: this.popupService,\n      composerService: this,\n      action,\n      conversation,\n      config: this.config,\n      inputs,\n      initialFiles: options?.initialFiles,\n      onClosed: () => this._activeActionOverlay.set(null),\n    });\n\n    if (!close) {\n      return;\n    }\n\n    this._activeActionOverlay.set({\n      actionId: action.id,\n      close: () => {\n        close();\n        this._activeActionOverlay.set(null);\n      },\n    });\n  }\n\n  /**\n   * Hide the active action overlay.\n   */\n  hideComponent(): void {\n    const overlay = this._activeActionOverlay();\n    if (overlay) {\n      overlay.close();\n    }\n  }\n\n  /**\n   * Get actions for the active conversation\n   */\n  getActionsForPosition(position: 'start' | 'end', context: AXConversationComposerActionContext) {\n    return this.registry.composerActions.getVisibleActions(position, context);\n  }\n\n  /**\n   * Execute an action\n   */\n  async executeAction(actionId: string, context: AXConversationComposerActionContext): Promise<void> {\n    return this.registry.composerActions.executeAction(actionId, context);\n  }\n\n  /**\n   * Save draft to localStorage\n   */\n  saveDraft(conversationId: string, text: string): void {\n    const key = `ax_conversation_draft_${conversationId}`;\n    if (text.trim()) {\n      try {\n        localStorage.setItem(key, text);\n      } catch (error) {\n        console.warn('Failed to save draft:', error);\n      }\n    } else {\n      localStorage.removeItem(key);\n    }\n  }\n\n  /**\n   * Load draft from localStorage\n   */\n  loadDraft(conversationId: string): string {\n    const key = `ax_conversation_draft_${conversationId}`;\n    try {\n      return localStorage.getItem(key) ?? '';\n    } catch (error) {\n      console.warn('Failed to load draft:', error);\n      return '';\n    }\n  }\n\n  /**\n   * Clear draft from localStorage\n   */\n  clearDraft(conversationId: string): void {\n    const key = `ax_conversation_draft_${conversationId}`;\n    try {\n      localStorage.removeItem(key);\n    } catch (error) {\n      console.warn('Failed to clear draft:', error);\n    }\n  }\n}\n","/**\n * Composer Component\n * Input area for composing and sending messages\n */\n\nimport { AXClickEvent, AXCommonModule, AXHtmlEvent } from '@acorex/cdk/common';\nimport { AXButtonComponent, AXButtonItemComponent, AXButtonItemListComponent } from '@acorex/components/button';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXPopoverComponent } from '@acorex/components/popover';\nimport { AXTextAreaComponent } from '@acorex/components/text-area';\nimport { AXTranslationModule, AXTranslationService } from '@acorex/core/translation';\nimport { CommonModule } from '@angular/common';\nimport {\n  Component,\n  computed,\n  effect,\n  ElementRef,\n  inject,\n  OnDestroy,\n  output,\n  signal,\n  viewChild,\n  ViewEncapsulation,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { AXConversationMessage, AXConversationSendMessageCommand, AXConversationStickerPayload } from '../../models';\nimport { resolveComposerMaxFiles } from '../../plugins/composer/composer-upload.config';\nimport type { AXConversationComposerAction } from '../../registries';\nimport { AXConversationService } from '../../services';\nimport { AX_CONVERSATION_CONFIG } from '../../tokens';\nimport { AXConversationMessageUtilsService } from '../../utils/message-utils.service';\nimport { AXConversationMessageListService } from '../message-list/message-list.service';\nimport { AXConversationRegistryComponentOutletComponent } from '../shared/registry-component-outlet.component';\nimport { AXConversationComposerService } from './composer.service';\n\nconst ATTACH_MENU_CLOSE_DELAY_MS = 500;\n\n@Component({\n  selector: 'ax-conversation-composer',\n  encapsulation: ViewEncapsulation.None,\n\n  imports: [\n    CommonModule,\n    AXConversationRegistryComponentOutletComponent,\n    FormsModule,\n    AXTextAreaComponent,\n    AXCommonModule,\n    AXButtonComponent,\n    AXDecoratorModule,\n    AXPopoverComponent,\n    AXTranslationModule,\n    AXButtonItemComponent,\n    AXButtonItemListComponent,\n    AXDecoratorModule,\n  ],\n  templateUrl: './composer.component.html',\n  styleUrl: './composer.component.css',\n})\nexport class AXConversationComposerComponent implements OnDestroy {\n  private readonly conversationService = inject(AXConversationService);\n  private readonly composerService = inject(AXConversationComposerService);\n  private readonly messageListService = inject(AXConversationMessageListService);\n  private readonly config = inject(AX_CONVERSATION_CONFIG);\n  private readonly translation = inject(AXTranslationService);\n\n  /** Access registry through conversation service */\n  protected get composerActionRegistry() {\n    return this.conversationService.registry.composerActions;\n  }\n\n  /** Composer text area reference */\n  private readonly textAreaRef = viewChild('inputElement', { read: AXTextAreaComponent });\n\n  /** Draft text - use service */\n  readonly draftText = this.composerService.draftText;\n\n  /** Attachments - use service */\n  readonly attachments = this.composerService.attachments;\n\n  /** Editing message */\n  readonly editingMessage = signal<any>(null);\n\n  /** Replying to message */\n  readonly replyingToMessage = signal<AXConversationMessage>(null);\n\n  /** Message sent event */\n  readonly messageSent = output<AXConversationSendMessageCommand>();\n\n  /** Emitted when the user cancels an in-progress generation from the composer. */\n  readonly generationCancelled = output<void>();\n\n  /** Emoji clicked event */\n  readonly emojiClick = output<void>();\n\n  /** Attach clicked event */\n  readonly attachClick = output<void>();\n\n  /** Voice clicked event */\n  readonly voiceClick = output<void>();\n\n  /** Active conversation */\n  readonly activeConversation = this.conversationService.activeConversation;\n  readonly activeMessages = this.conversationService.activeMessages;\n\n  /** Emoji popover state */\n  private readonly emojiPopoverRef = viewChild<any>('emojiPopover');\n  readonly emojiPopoverTarget = signal<HTMLElement | null>(null);\n\n  /** Attachment menu popover state */\n  private readonly attachPopoverRef = viewChild<AXPopoverComponent>('attachPopover');\n  private readonly attachMenuButtonRef = viewChild<ElementRef<HTMLElement>>('attachMenuButton');\n  readonly attachMenuTarget = computed(() => this.attachMenuButtonRef()?.nativeElement ?? null);\n  private attachMenuCloseTimer?: ReturnType<typeof setTimeout>;\n  readonly composerPopupLoader = () =>\n    import('./composer-popup.component').then((m) => m.AXConversationComposerPopupComponent);\n\n  /** Input placeholder - use service */\n  readonly placeholder = this.composerService.placeholder;\n\n  constructor() {\n    // Focus text area when requested via AXConversationComposerService.focusComposer()\n    effect(() => {\n      if (this.composerService.focusRequest() === 0) return;\n      this.focusTextArea();\n    });\n\n    // React to controller signals (reply/edit)\n    effect(() => {\n      const reply = this.composerService.replyMessage();\n      const edit = this.composerService.editMessage();\n\n      if (reply) {\n        this.startReply(reply);\n      } else if (edit) {\n        this.startEdit(edit);\n      } else {\n        this.editingMessage.set(null);\n        this.replyingToMessage.set(null);\n      }\n    });\n\n    // Close composer popovers when conversation changes (draft/reply/edit reset is handled by message-list).\n    let previousConversationId: string | undefined = undefined;\n    effect(() => {\n      const currentId = this.activeConversation()?.id;\n\n      if (previousConversationId !== undefined && previousConversationId !== currentId) {\n        if (previousConversationId) {\n          this.conversationService.notifyComposerStoppedTyping(previousConversationId);\n        }\n        this.emojiPopoverTarget.set(null);\n        this.attachPopoverRef()?.close();\n        this.editingMessage.set(null);\n        this.replyingToMessage.set(null);\n      }\n\n      previousConversationId = currentId;\n    });\n\n    // Auto-save draft on text change\n    effect(() => {\n      const text = this.draftText();\n      const conversation = this.activeConversation();\n      const isEditing = !!this.composerService.editMessage();\n\n      if (conversation?.id && !isEditing) {\n        const conversationId = conversation.id;\n        if (this.draftSaveTimeout) {\n          clearTimeout(this.draftSaveTimeout);\n        }\n        this.draftSaveTimeout = window.setTimeout(() => {\n          if (this.activeConversation()?.id !== conversationId || this.composerService.editMessage()) {\n            return;\n          }\n          this.composerService.saveDraft(conversationId, text);\n        }, 500);\n      }\n    });\n  }\n\n  private draftSaveTimeout?: number;\n\n  /** Number of input rows - use service */\n  readonly inputRows = this.composerService.inputRows;\n\n  /** Can send message - use service */\n  readonly canSend = this.composerService.canSend;\n\n  /** Whether AI/generation is in progress */\n  readonly isGenerating = this.composerService.isGenerating;\n\n  /** Whether cancel cleanup is in progress */\n  readonly isStopping = this.composerService.isStopping;\n\n  /** Primary button mode */\n  readonly primaryButtonMode = this.composerService.primaryButtonMode;\n\n  /** Start actions from registry - use service */\n  readonly startActions = this.composerService.startActions;\n\n  /** End actions from registry - use service */\n  readonly endActions = this.composerService.endActions;\n\n  /** Start inline actions */\n  readonly startInlineActions = this.composerService.startInlineActions;\n\n  /** Start menu actions (attachment popup) */\n  readonly startMenuActions = this.composerService.startMenuActions;\n\n  /** End inline actions inside input pill */\n  readonly endInlineActions = this.composerService.endInlineActions;\n\n  /** End menu actions */\n  readonly endMenuActions = this.composerService.endMenuActions;\n\n  /** Default end action (voice/send morph) */\n  readonly defaultAction = this.composerService.defaultAction;\n\n  /** Handle key down (send on Enter; typing is driven by draft changes only). */\n  onKeyDown(event: AXHtmlEvent<KeyboardEvent>): void {\n    const key = event?.nativeEvent?.key;\n    const shiftKey = event?.nativeEvent?.shiftKey;\n\n    if (key === 'Enter' && !shiftKey) {\n      event?.nativeEvent?.preventDefault();\n      if (this.primaryButtonMode() === 'send') {\n        void this.onSendClick();\n      }\n    }\n  }\n\n  /** Handle draft text changes — throttled typing indicator via conversation service. */\n  onDraftChanged(): void {\n    const conversation = this.activeConversation();\n    if (!conversation) {\n      return;\n    }\n\n    const conversationId = conversation.id;\n    if (!this.draftText().trim()) {\n      this.conversationService.notifyComposerStoppedTyping(conversationId);\n      return;\n    }\n\n    this.conversationService.notifyComposerTyping(conversationId);\n  }\n\n  /** Cleanup on destroy */\n  ngOnDestroy(): void {\n    const conversation = this.activeConversation();\n    if (conversation?.id) {\n      this.conversationService.notifyComposerStoppedTyping(conversation.id);\n      if (!this.composerService.editMessage()) {\n        this.composerService.saveDraft(conversation.id, this.draftText());\n      }\n    }\n\n    if (this.draftSaveTimeout) {\n      clearTimeout(this.draftSaveTimeout);\n    }\n    this.clearAttachMenuCloseTimer();\n  }\n\n  /** Handle send click */\n  async onSendClick(): Promise<void> {\n    if (!this.canSend() || this.isGenerating() || this.isStopping()) return;\n\n    const conversation = this.activeConversation();\n    if (!conversation) return;\n\n    const text = this.draftText().trim();\n    const editingMsg = this.editingMessage();\n\n    if (editingMsg) {\n      try {\n        await this.conversationService.editMessage(editingMsg.id, { type: 'text', text });\n        this.draftText.set('');\n        this.attachments.set([]);\n        this.cancelEditReply();\n        this.composerService.clearDraft(conversation.id);\n        this.composerService.focusComposer();\n      } catch (error) {\n        console.error('Failed to edit message:', error);\n      }\n      return;\n    }\n\n    const command: AXConversationSendMessageCommand = {\n      conversationId: conversation.id,\n      type: 'text',\n      payload: { type: 'text', text },\n      replyToId: this.replyingToMessage()?.id,\n    };\n\n    this.editingMessage.set(null);\n    this.replyingToMessage.set(null);\n    this.conversationService.notifyComposerStoppedTyping(conversation.id);\n\n    void this.composerService\n      .sendMessage(command)\n      .then(() => {\n        this.messageSent.emit(command);\n        this.messageListService.requestScrollToBottom();\n      })\n      .catch((error) => {\n        console.error('Failed to send message:', error);\n      });\n  }\n\n  /** Handle emoji click */\n  async onEmojiClick(event?: AXClickEvent | MouseEvent): Promise<void> {\n    this.emojiClick.emit();\n\n    const target = this.getClickTarget(event);\n    if (!target) return;\n\n    const popover = this.emojiPopoverRef();\n    if (popover?.isOpen) {\n      popover.close();\n    } else {\n      this.emojiPopoverTarget.set(target);\n      setTimeout(() => {\n        this.emojiPopoverRef()?.open();\n      }, 0);\n    }\n  }\n\n  /** Handle emoji popover closed */\n  onEmojiPopoverClosed(): void {\n    this.emojiPopoverTarget.set(null);\n  }\n\n  /** Handle emoji/sticker selection from popup */\n  onEmojiItemSelected(item: string | AXConversationStickerPayload): void {\n    if (typeof item === 'string') {\n      this.draftText.update((text) => text + item);\n      this.onDraftChanged();\n    } else if (item && 'url' in item) {\n      this.sendSticker(item);\n    }\n    this.emojiPopoverRef()?.close();\n  }\n\n  /** Send sticker message */\n  private async sendSticker(sticker: AXConversationStickerPayload): Promise<void> {\n    const conversation = this.activeConversation();\n    if (!conversation) return;\n\n    const command: AXConversationSendMessageCommand = {\n      conversationId: conversation.id,\n      type: 'sticker',\n      payload: {\n        type: 'sticker',\n        id: sticker.id,\n        packId: 'giphy',\n        url: sticker.url,\n        animated: sticker.url.endsWith('.gif'),\n        width: sticker.width,\n        height: sticker.height,\n      },\n      replyToId: this.replyingToMessage()?.id,\n    };\n\n    void this.composerService\n      .sendMessage(command)\n      .then(() => {\n        this.messageListService.requestScrollToBottom();\n      })\n      .catch((error) => {\n        console.error('Failed to send sticker:', error);\n      });\n  }\n\n  /** Get inputs for emoji popup component */\n  getEmojiPopupInputs(): Record<string, unknown> {\n    return {\n      onItemSelected: (item: any) => this.onEmojiItemSelected(item),\n    };\n  }\n\n  /** Handle attach menu hover */\n  onAttachMenuMouseEnter(): void {\n    this.clearAttachMenuCloseTimer();\n    this.attachPopoverRef()?.open();\n  }\n\n  onAttachMenuMouseLeave(): void {\n    this.scheduleAttachMenuClose();\n  }\n\n  onAttachMenuPanelMouseEnter(): void {\n    this.clearAttachMenuCloseTimer();\n  }\n\n  onAttachMenuPanelMouseLeave(): void {\n    this.scheduleAttachMenuClose();\n  }\n\n  private scheduleAttachMenuClose(): void {\n    this.clearAttachMenuCloseTimer();\n    this.attachMenuCloseTimer = setTimeout(() => {\n      this.attachPopoverRef()?.close();\n      this.attachMenuCloseTimer = undefined;\n    }, ATTACH_MENU_CLOSE_DELAY_MS);\n  }\n\n  private clearAttachMenuCloseTimer(): void {\n    if (this.attachMenuCloseTimer) {\n      clearTimeout(this.attachMenuCloseTimer);\n      this.attachMenuCloseTimer = undefined;\n    }\n  }\n\n  /** Handle attach menu click */\n  onAttachMenuClick(event: AXClickEvent): void {\n    this.attachClick.emit();\n    event?.nativeEvent?.preventDefault();\n    event?.nativeEvent?.stopPropagation();\n\n    const popover = this.attachPopoverRef();\n    if (popover?.isOpen) {\n      this.clearAttachMenuCloseTimer();\n      popover.close();\n    } else {\n      this.clearAttachMenuCloseTimer();\n      popover?.open();\n    }\n  }\n\n  /** Handle attachment menu action selection */\n  async onAttachMenuAction(actionId: string): Promise<void> {\n    this.clearAttachMenuCloseTimer();\n    this.attachPopoverRef()?.close();\n    await this.onActionClick(actionId);\n  }\n\n  /** Handle primary button click (send / cancel / stopping / voice / locked). */\n  async onPrimaryButtonClick(): Promise<void> {\n    switch (this.primaryButtonMode()) {\n      case 'stopping':\n        break;\n      case 'cancel':\n        this.composerService.cancelGeneration();\n        this.generationCancelled.emit();\n        break;\n      case 'send':\n        await this.onSendClick();\n        break;\n      case 'default-action': {\n        const action = this.defaultAction();\n        if (action) {\n          await this.onActionClick(action.id);\n        }\n        break;\n      }\n      case 'locked':\n        break;\n    }\n  }\n\n  /** @deprecated Use onPrimaryButtonClick */\n  async onDefaultActionClick(): Promise<void> {\n    await this.onPrimaryButtonClick();\n  }\n\n  getPrimaryButtonIcon(): string {\n    switch (this.primaryButtonMode()) {\n      case 'stopping':\n        return 'fa-light fa-spinner';\n      case 'cancel':\n        return 'fa-light fa-stop';\n      case 'send':\n        return this.editingMessage() ? 'fa-light fa-check' : 'fa-solid fa-paper-plane';\n      case 'default-action':\n        return this.defaultAction()?.icon ?? 'fa-solid fa-paper-plane';\n      case 'locked':\n        return 'fa-solid fa-paper-plane';\n    }\n  }\n\n  getPrimaryButtonLabel(): string {\n    switch (this.primaryButtonMode()) {\n      case 'stopping':\n        return this.translation.translateSync('@acorex:chat.actions.stopping');\n      case 'cancel':\n        return this.translation.translateSync('@acorex:chat.actions.stop');\n      case 'send':\n        return this.editingMessage()\n          ? this.translation.translateSync('@acorex:chat.actions.save')\n          : this.translation.translateSync('@acorex:chat.actions.send');\n      case 'default-action':\n        return this.defaultAction() ? this.getActionLabel(this.defaultAction()!) : '';\n      case 'locked':\n        return this.translation.translateSync('@acorex:chat.actions.send');\n    }\n  }\n\n  isPrimaryButtonDisabled(): boolean {\n    const mode = this.primaryButtonMode();\n    if (mode === 'locked' || mode === 'stopping') {\n      return true;\n    }\n    if (mode === 'default-action') {\n      const action = this.defaultAction();\n      return action ? !this.isActionEnabled(action) : true;\n    }\n    return false;\n  }\n\n  /** @deprecated Use getPrimaryButtonIcon */\n  getDefaultActionIcon(): string {\n    return this.getPrimaryButtonIcon();\n  }\n\n  /** Handle voice click */\n  onVoiceClick(): void {\n    this.voiceClick.emit();\n  }\n\n  /** Remove attachment */\n  removeAttachment(index: number): void {\n    this.attachments.update((files) => files.filter((_, i) => i !== index));\n  }\n\n  /** Cancel edit/reply mode */\n  cancelEditReply(): void {\n    this.editingMessage.set(null);\n    this.replyingToMessage.set(null);\n    this.composerService.clear();\n  }\n\n  /** Start editing a message */\n  startEdit(message: any): void {\n    this.editingMessage.set(message);\n    this.replyingToMessage.set(null);\n    this.draftText.set(message.payload?.text || '');\n    this.onDraftChanged();\n  }\n\n  /** Start replying to a message */\n  startReply(message: AXConversationMessage): void {\n    this.replyingToMessage.set(message);\n    this.editingMessage.set(null);\n  }\n\n  /** Focus the native textarea inside ax-text-area */\n  private focusTextArea(): void {\n    setTimeout(() => {\n      this.textAreaRef()?.input?.nativeElement?.focus();\n    }, 0);\n  }\n\n  private getClickTarget(event?: AXClickEvent | MouseEvent): HTMLElement | undefined {\n    if (!event) return undefined;\n    if (event instanceof MouseEvent) {\n      return event.currentTarget as HTMLElement;\n    }\n    return event.htmlElement as HTMLElement;\n  }\n\n  /** Handle action click */\n  async onActionClick(actionId: string, event?: AXClickEvent | MouseEvent, initialFiles?: File[]): Promise<void> {\n    const action = this.composerActionRegistry.getActionById(actionId);\n    if (!action) return;\n\n    const context = this.composerService.actionContext();\n\n    if (actionId === 'emoji') {\n      this.onEmojiClick(event);\n      return;\n    }\n\n    const hasComponent = !!(action.component || action.componentLoader);\n\n    if (hasComponent) {\n      await this.composerService.openActionComponent(action, this.buildPickerInputs(action), {\n        toggleable: !!action.toggleable,\n        initialFiles,\n      });\n      return;\n    }\n\n    if (action.handler) {\n      try {\n        await this.composerActionRegistry.executeAction(actionId, context);\n      } catch (error) {\n        console.error('Failed to execute action:', error);\n      }\n    }\n  }\n\n  /** Check if action is enabled */\n  isActionEnabled(action: any): boolean {\n    const context = this.composerService.actionContext();\n    return this.composerActionRegistry.isActionEnabled(action, context);\n  }\n\n  /** Get replying sender name */\n  getReplyingSenderName(): string {\n    const message = this.replyingToMessage();\n    if (!message) return '';\n\n    const conversation = this.activeConversation();\n    const participant = conversation?.participants.find((p) => p.id === message.senderId);\n    return participant?.name || this.translation.translateSync('@acorex:chat.fallbacks.unknown-user');\n  }\n\n  getActionLabel(action: { label: string }): string {\n    return this.composerActionRegistry.getActionLabel(action as any);\n  }\n\n  getActionButtonClass(action: { className?: string }): string {\n    const base = 'rounded-full text-xl';\n    return action.className ? `${base} ${action.className}` : base;\n  }\n\n  /** Get replying message text */\n  getReplyingMessageText(): string {\n    const message = this.replyingToMessage();\n    if (!message) return '';\n\n    if (message.type === 'text') {\n      const text = (message.payload as any)?.text || '';\n      return text.length > 50 ? text.substring(0, 50) + '...' : text;\n    }\n    return `[${message.type}]`;\n  }\n\n  /** Preview object for replying banner (type, icon, value) */\n  getReplyingPreview(): { value: string; type: string; icon: string } | null {\n    const message = this.replyingToMessage();\n    if (!message) return null;\n    return AXConversationMessageUtilsService.getPreviewText(message, 100);\n  }\n\n  /** Preview object for editing banner (type, icon, value) */\n  getEditingPreview(): { value: string; type: string; icon: string } | null {\n    const message = this.editingMessage() as AXConversationMessage | null;\n    if (!message) return null;\n    return AXConversationMessageUtilsService.getPreviewText(message, 100);\n  }\n\n  getComposerPreviewLabel(preview: { value: string; type: string }): string {\n    if (preview.type === 'text') {\n      return preview.value;\n    }\n    const keyByType: Record<string, string> = {\n      image: '@acorex:chat.image',\n      video: '@acorex:chat.video',\n      audio: '@acorex:chat.voice',\n      voice: '@acorex:chat.voice',\n      file: '@acorex:chat.file',\n      location: '@acorex:chat.location',\n      sticker: '@acorex:chat.sticker',\n    };\n    const key = keyByType[preview.type] ?? '@acorex:chat.message';\n    return this.translation.translateSync(key);\n  }\n\n  /** Handle reply preview click - scroll to original message */\n  onReplyPreviewClick(): void {\n    const message = this.replyingToMessage();\n    if (!message) return;\n\n    const messageElement = document.getElementById(`message-${message.id}`);\n    if (messageElement) {\n      messageElement.scrollIntoView({ behavior: 'smooth', block: 'center' });\n\n      messageElement.classList.add('message-highlight');\n      setTimeout(() => {\n        messageElement.classList.remove('message-highlight');\n      }, this.config.messageHighlightDuration);\n    }\n  }\n\n  /** Inputs for picker components opened in popup / action sheet */\n  private buildPickerInputs(action: AXConversationComposerAction): Record<string, unknown> {\n    return {\n      conversation: this.activeConversation(),\n      maxFiles: resolveComposerMaxFiles(action, this.config),\n      service: this.composerService,\n    };\n  }\n}\n","@if (activeConversation()) {\n  <div class=\"composer\">\n    <!-- Edit/Reply Banner -->\n    @if (editingMessage() || replyingToMessage()) {\n      <div\n        class=\"ax-conversation-composer-banner\"\n        [class.ax-conversation-composer-banner--edit]=\"!!editingMessage()\"\n        [class.ax-conversation-composer-banner--reply]=\"!!replyingToMessage()\"\n      >\n        <div class=\"ax-conversation-composer-banner__accent\" aria-hidden=\"true\"></div>\n        @if (editingMessage()) {\n          <div class=\"ax-conversation-composer-banner__content\">\n            <span class=\"ax-conversation-composer-banner__icon\" aria-hidden=\"true\"\n              ><i class=\"fa-light fa-pen-to-square\"></i\n            ></span>\n            <div class=\"ax-conversation-composer-banner__body\">\n              <span class=\"ax-conversation-composer-banner__label\">{{\n                '@acorex:chat.composer.editing-message' | translate | async\n              }}</span>\n              @if (getEditingPreview(); as preview) {\n                <span class=\"ax-conversation-composer-banner__preview\">\n                  @if (preview.type !== 'text') {\n                    <i [class]=\"preview.icon\"></i>\n                  }\n                  {{ getComposerPreviewLabel(preview) }}\n                </span>\n              }\n            </div>\n          </div>\n        } @else if (replyingToMessage()) {\n          <div class=\"ax-conversation-composer-banner__content\">\n            <span class=\"ax-conversation-composer-banner__icon\" aria-hidden=\"true\"\n              ><i class=\"fa-light fa-reply\"></i\n            ></span>\n            <div\n              class=\"ax-conversation-composer-banner__body ax-conversation-composer-banner__body--clickable\"\n              (click)=\"onReplyPreviewClick()\"\n            >\n              <span class=\"ax-conversation-composer-banner__label\">\n                {{ '@acorex:chat.composer.replying-to' | translate | async }} {{ getReplyingSenderName() }}\n              </span>\n              @if (getReplyingPreview(); as preview) {\n                <span class=\"ax-conversation-composer-banner__preview\">\n                  @if (preview.type !== 'text') {\n                    <i [class]=\"preview.icon\"></i>\n                  }\n                  {{ getComposerPreviewLabel(preview) }}\n                </span>\n              }\n            </div>\n          </div>\n        }\n        <button\n          type=\"button\"\n          class=\"ax-conversation-composer-banner__close\"\n          (click)=\"cancelEditReply()\"\n          [attr.aria-label]=\"'@acorex:chat.actions.cancel' | translate | async\"\n        >\n          <i class=\"fa-light fa-xmark\"></i>\n        </button>\n      </div>\n    }\n\n    <!-- Input Area -->\n    <div class=\"composer-input-container\">\n      <!-- Start actions -->\n      <div class=\"composer-actions-left\">\n        @if (startMenuActions().length > 0) {\n          <span\n            #attachMenuButton\n            class=\"composer-attach-menu-trigger\"\n            (mouseenter)=\"onAttachMenuMouseEnter()\"\n            (mouseleave)=\"onAttachMenuMouseLeave()\"\n          >\n            <ax-button\n              class=\"rounded-full text-xl\"\n              look=\"blank\"\n              [iconOnly]=\"true\"\n              [text]=\"('@acorex:chat.tooltips.attach-file' | translate | async) ?? ''\"\n              (onClick)=\"onAttachMenuClick($event)\"\n            >\n              <ax-prefix>\n                <i class=\"fa-light fa-paperclip\"></i>\n              </ax-prefix>\n            </ax-button>\n          </span>\n        }\n\n        @for (action of startInlineActions(); track action.id) {\n          <ax-button\n            look=\"blank\"\n            [iconOnly]=\"true\"\n            [text]=\"getActionLabel(action)\"\n            [disabled]=\"!isActionEnabled(action)\"\n            [class]=\"getActionButtonClass(action)\"\n            (onClick)=\"onActionClick(action.id, $event)\"\n          >\n            <ax-icon>\n              <i [class]=\"action.icon\"></i>\n            </ax-icon>\n          </ax-button>\n        }\n      </div>\n\n      <!-- Text Input -->\n      <div class=\"composer-input-wrapper\">\n        <ax-text-area\n          #inputElement\n          [(ngModel)]=\"draftText\"\n          (onKeyDown)=\"onKeyDown($event)\"\n          (onValueChanged)=\"onDraftChanged()\"\n          [placeholder]=\"placeholder()\"\n          [rows]=\"inputRows()\"\n        ></ax-text-area>\n      </div>\n\n      <!-- End actions -->\n      <div class=\"composer-actions-right\">\n        @for (action of endInlineActions(); track action.id) {\n          <ax-button\n            look=\"blank\"\n            [iconOnly]=\"true\"\n            [text]=\"getActionLabel(action)\"\n            [disabled]=\"!isActionEnabled(action)\"\n            [class]=\"getActionButtonClass(action)\"\n            (onClick)=\"onActionClick(action.id, $event)\"\n          >\n            <ax-icon>\n              <i [class]=\"action.icon\"></i>\n            </ax-icon>\n          </ax-button>\n        }\n\n        <div class=\"composer-primary-button-slot\">\n          @switch (primaryButtonMode()) {\n            @case ('cancel') {\n              <ax-button\n                class=\"composer-primary-button rounded-full text-xl\"\n                [iconOnly]=\"true\"\n                look=\"blank\"\n                [text]=\"getPrimaryButtonLabel()\"\n                (onClick)=\"onPrimaryButtonClick()\"\n              >\n                <ax-prefix>\n                  <i [class]=\"getPrimaryButtonIcon()\"></i>\n                </ax-prefix>\n              </ax-button>\n            }\n            @case ('stopping') {\n              <ax-button\n                class=\"composer-primary-button composer-primary-button--stopping rounded-full text-xl\"\n                [iconOnly]=\"true\"\n                look=\"blank\"\n                [text]=\"getPrimaryButtonLabel()\"\n                [disabled]=\"true\"\n              >\n                <ax-prefix>\n                  <i [class]=\"getPrimaryButtonIcon()\"></i>\n                </ax-prefix>\n              </ax-button>\n            }\n            @default {\n              <ax-button\n                class=\"composer-primary-button rounded-full text-xl\"\n                [iconOnly]=\"true\"\n                look=\"blank\"\n                [text]=\"getPrimaryButtonLabel()\"\n                [disabled]=\"isPrimaryButtonDisabled()\"\n                (onClick)=\"onPrimaryButtonClick()\"\n              >\n                <ax-prefix>\n                  <i [class]=\"getPrimaryButtonIcon()\"></i>\n                </ax-prefix>\n              </ax-button>\n            }\n          }\n        </div>\n      </div>\n    </div>\n\n    <!-- Attachments Preview -->\n    @if (attachments().length > 0) {\n      <div class=\"composer-attachments\">\n        @for (attachment of attachments(); track $index) {\n          <div class=\"attachment-item\">\n            <span class=\"attachment-icon\"><i class=\"fa-light fa-paperclip\"></i></span>\n            <span class=\"attachment-name\">{{ attachment.name }}</span>\n            <button\n              type=\"button\"\n              class=\"attachment-remove\"\n              (click)=\"removeAttachment($index)\"\n              [attr.aria-label]=\"'@acorex:chat.actions.remove-attachment' | translate | async\"\n            >\n              <i class=\"fa-light fa-xmark\"></i>\n            </button>\n          </div>\n        }\n      </div>\n    }\n  </div>\n}\n\n<!-- Popover for attachment menu -->\n@if (attachMenuTarget()) {\n  <ax-popover\n    #attachPopover\n    [target]=\"attachMenuTarget()\"\n    [openOn]=\"'manual'\"\n    [closeOn]=\"'clickOut'\"\n    [placement]=\"'top-start'\"\n  >\n    <div\n      class=\"composer-attach-menu-panel\"\n      (mouseenter)=\"onAttachMenuPanelMouseEnter()\"\n      (mouseleave)=\"onAttachMenuPanelMouseLeave()\"\n    >\n      <ax-button-item-list>\n        @for (action of startMenuActions(); track action.id) {\n          <ax-button-item\n            [text]=\"getActionLabel(action)\"\n            (click)=\"onAttachMenuAction(action.id)\"\n            [disabled]=\"!isActionEnabled(action)\"\n          >\n            <ax-prefix>\n              <i [class]=\"action.icon\"></i>\n            </ax-prefix>\n          </ax-button-item>\n        }\n      </ax-button-item-list>\n    </div>\n  </ax-popover>\n}\n\n<!-- Popover for emoji/sticker picker -->\n@if (emojiPopoverTarget()) {\n  <ax-popover\n    #emojiPopover\n    [target]=\"emojiPopoverTarget()\"\n    [openOn]=\"'manual'\"\n    [closeOn]=\"'clickOut'\"\n    [placement]=\"'top-start'\"\n    panelClass=\"composer-emoji-popover-panel\"\n    (onClosed)=\"onEmojiPopoverClosed()\"\n  >\n    <div class=\"composer-emoji-popover\">\n      <ax-conversation-registry-component-outlet\n        [componentLoader]=\"composerPopupLoader\"\n        [inputs]=\"getEmojiPopupInputs()\"\n      />\n    </div>\n  </ax-popover>\n}\n","/**\n * ConversationContainer Component\n * Top-level container that provides context and layout for the conversation system\n */\n\nimport { AXResizableDirective } from '@acorex/cdk/resizable';\nimport { AXActionSheetService } from '@acorex/components/action-sheet';\nimport { AXToastService } from '@acorex/components/toast';\nimport { AXFileService } from '@acorex/core/file';\nimport { AXPlatform } from '@acorex/core/platform';\nimport { AXTranslationModule, AXTranslationService } from '@acorex/core/translation';\nimport { CommonModule, isPlatformBrowser } from '@angular/common';\nimport {\n  Component,\n  ElementRef,\n  HostListener,\n  PLATFORM_ID,\n  ViewEncapsulation,\n  computed,\n  inject,\n  input,\n} from '@angular/core';\nimport { AXConversationService } from '../../services';\nimport { AX_CONVERSATION_CONFIG } from '../../tokens';\nimport { AXConversationComposerService } from '../composer/composer.service';\n\n@Component({\n  selector: 'ax-conversation-container',\n  encapsulation: ViewEncapsulation.None,\n\n  imports: [CommonModule, AXResizableDirective, AXTranslationModule],\n  templateUrl: './conversation-container.component.html',\n  styleUrl: './conversation-container.component.css',\n  host: {\n    '[class.conversation-container-host]': 'true',\n    '[tabindex]': '\"-1\"',\n  },\n})\nexport class AXConversationContainerComponent {\n  private readonly conversationService = inject(AXConversationService);\n  private readonly composerService = inject(AXConversationComposerService);\n  private readonly fileService = inject(AXFileService);\n  private readonly translation = inject(AXTranslationService);\n  private readonly toast = inject(AXToastService);\n  private readonly platform = inject(AXPlatform);\n  private readonly actionSheetService = inject(AXActionSheetService);\n  private readonly hostRef = inject(ElementRef<HTMLElement>);\n  private readonly platformId = inject(PLATFORM_ID);\n  protected readonly config = inject(AX_CONVERSATION_CONFIG);\n\n  constructor() {\n    void this.conversationService.ensureInitialized();\n  }\n\n  private get registry() {\n    return this.conversationService.registry;\n  }\n\n  /** Custom CSS class */\n  readonly customClass = input<string>('');\n\n  /** Loading state */\n  readonly loading = this.conversationService.loading;\n\n  /** Error state */\n  readonly error = this.conversationService.error;\n\n  /** Active conversation */\n  readonly activeConversation = this.conversationService.activeConversation;\n\n  /** Container CSS classes */\n  readonly containerClasses = computed(() => {\n    const classes = ['conversation-container'];\n\n    if (this.loading()) {\n      classes.push('conversation-container-loading');\n    }\n\n    if (this.customClass()) {\n      classes.push(this.customClass());\n    }\n\n    return classes.join(' ');\n  });\n\n  closeActiveConversation(): void {\n    this.conversationService.closeActiveConversation();\n  }\n\n  /**\n   * When the user pastes files copied from the OS (e.g. Ctrl+V after copying in Explorer),\n   * open the same composer picker popup used for message-list drag-and-drop.\n   */\n  @HostListener('document:paste', ['$event'])\n  async onDocumentPaste(event: ClipboardEvent): Promise<void> {\n    if (!isPlatformBrowser(this.platformId) || !this.activeConversation()) {\n      return;\n    }\n\n    const { handleConversationFilePaste } = await import('../message-list/open-composer-picker-for-files');\n    await handleConversationFilePaste(event, this.hostRef.nativeElement, {\n      fileService: this.fileService,\n      composerService: this.composerService,\n      composerActionRegistry: this.registry.composerActions,\n      popupService: this.conversationService.popupService,\n      actionSheetService: this.actionSheetService,\n      platform: this.platform,\n      toast: this.toast,\n      translation: this.translation,\n      conversation: this.activeConversation(),\n      config: this.config,\n    });\n  }\n}\n","    <div\n      [class]=\"containerClasses()\"\n      role=\"main\"\n      [attr.aria-label]=\"'@acorex:chat.aria.conversation-interface' | translate | async\"\n    >\n      <!-- Sidebar -->\n      <div\n        class=\"conversation-sidebar-container\"\n        [axResizable]=\"true\"\n        [minWidth]=\"config.minSidebarWidth\"\n        [maxWidth]=\"config.maxSidebarWidth\"\n        [width]=\"config.defaultSidebarWidth\"\n        role=\"navigation\"\n        [attr.aria-label]=\"'@acorex:chat.aria.conversation-list' | translate | async\"\n      >\n        <ng-content select=\"ax-conversation-sidebar, [ax-conversation-sidebar]\"></ng-content>\n      </div>\n\n      <!-- Main conversation view -->\n      <div\n        class=\"conversation-main-container\"\n        role=\"region\"\n        [attr.aria-label]=\"\n          activeConversation()\n            ? ('@acorex:chat.aria.active-conversation' | translate | async)\n            : ('@acorex:chat.status.no-conversation-selected' | translate | async)\n        \"\n      >\n        @if (activeConversation(); as conversation) {\n          <div class=\"conversation-view\">\n            <!-- Info Bar -->\n            <ng-content select=\"ax-conversation-info-bar, [ax-conversation-info-bar]\"></ng-content>\n\n            <!-- Messages -->\n            <div class=\"conversation-messages\">\n              <ng-content select=\"ax-conversation-message-list, [ax-conversation-message-list]\"></ng-content>\n            </div>\n\n            <!-- Composer -->\n            <ng-content select=\"ax-conversation-composer, [ax-conversation-composer]\"></ng-content>\n          </div>\n        } @else {\n          <div class=\"conversation-empty-state\">\n            <div class=\"empty-state-content\">\n              <ng-content select=\"ax-conversation-empty\">\n                <svg class=\"empty-state-icon\" width=\"120\" height=\"120\" viewBox=\"0 0 120 120\" fill=\"none\">\n                  <circle class=\"text-light\" cx=\"60\" cy=\"60\" r=\"50\" fill=\"currentColor\" />\n                  <path\n                    class=\"text-on-surface/55\"\n                    d=\"M40 50h40M40 70h30\"\n                    stroke=\"currentColor\"\n                    stroke-width=\"3\"\n                    stroke-linecap=\"round\"\n                  />\n                </svg>\n                <h3 class=\"empty-state-title\">\n                  {{ '@acorex:chat.empty.no-conversation-selected-title' | translate | async }}\n                </h3>\n                <p class=\"empty-state-description\">\n                  {{ '@acorex:chat.empty.select-conversation-description' | translate | async }}\n                </p>\n              </ng-content>\n            </div>\n          </div>\n        }\n      </div>\n    </div>\n","/**\n * Conversation Container Directive\n * Provides conversation context without imposing layout structure\n */\n\nimport { AXActionSheetService } from '@acorex/components/action-sheet';\nimport { AXFileService } from '@acorex/core/file';\nimport { AXPlatform } from '@acorex/core/platform';\nimport { isPlatformBrowser } from '@angular/common';\nimport { AXToastService } from '@acorex/components/toast';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { Directive, ElementRef, HostListener, PLATFORM_ID, inject } from '@angular/core';\nimport { AXConversationComposerService } from '../composer/composer.service';\nimport { AXConversationService } from '../../services';\nimport { AX_CONVERSATION_CONFIG } from '../../tokens';\n\n@Directive({\n  selector: '[axConversationContainer]',\n  host: {\n    '[class.ax-conversation-container]': 'true',\n    '[tabindex]': '\"-1\"',\n    '[style.outline]': '\"none\"',\n  },\n})\nexport class AXConversationContainerDirective {\n  private readonly conversationService = inject(AXConversationService);\n  private readonly composerService = inject(AXConversationComposerService);\n  private readonly fileService = inject(AXFileService);\n  private readonly hostRef = inject(ElementRef<HTMLElement>);\n  private readonly platformId = inject(PLATFORM_ID);\n  private readonly translation = inject(AXTranslationService);\n  private readonly toast = inject(AXToastService);\n  private readonly platform = inject(AXPlatform);\n  private readonly actionSheetService = inject(AXActionSheetService);\n  private readonly config = inject(AX_CONVERSATION_CONFIG);\n\n  constructor() {\n    void this.conversationService.ensureInitialized();\n  }\n\n  private get registry() {\n    return this.conversationService.registry;\n  }\n\n  /** Active conversation */\n  readonly activeConversation = this.conversationService.activeConversation;\n\n  /** Loading state */\n  readonly loading = this.conversationService.loading;\n\n  /** Error state */\n  readonly error = this.conversationService.error;\n\n  closeActiveConversation(): void {\n    this.conversationService.closeActiveConversation();\n  }\n\n  @HostListener('document:paste', ['$event'])\n  async onDocumentPaste(event: ClipboardEvent): Promise<void> {\n    if (!isPlatformBrowser(this.platformId) || !this.activeConversation()) {\n      return;\n    }\n\n    const { handleConversationFilePaste } = await import('../message-list/open-composer-picker-for-files');\n    await handleConversationFilePaste(event, this.hostRef.nativeElement, {\n      fileService: this.fileService,\n      composerService: this.composerService,\n      composerActionRegistry: this.registry.composerActions,\n      popupService: this.conversationService.popupService,\n      actionSheetService: this.actionSheetService,\n      platform: this.platform,\n      toast: this.toast,\n      translation: this.translation,\n      conversation: this.activeConversation(),\n      config: this.config,\n    });\n  }\n}\n","import { reflectComponentType, type Type } from '@angular/core';\n\n/** Optional conversation avatar display overrides — not present on every custom avatar. */\nconst OPTIONAL_DISPLAY_INPUTS = new Set(['displayName', 'displayAvatar', 'displayIcon']);\n\nconst componentInputNamesCache = new WeakMap<Type<unknown>, Set<string>>();\n\nfunction getComponentInputNames(component: Type<unknown>): Set<string> | null {\n  const cached = componentInputNamesCache.get(component);\n  if (cached) {\n    return cached;\n  }\n\n  const mirror = reflectComponentType(component);\n  if (!mirror) {\n    return null;\n  }\n\n  const names = new Set(mirror.inputs.map((input) => input.propName));\n  componentInputNamesCache.set(component, names);\n  return names;\n}\n\n/**\n * Returns only inputs that exist on the target component.\n * Prevents NG0303 when optional display overrides are passed to avatars\n * that only declare `userId` and `size`.\n *\n * When runtime reflection is unavailable (common for externally compiled avatar\n * components), optional display overrides are omitted while core inputs such as\n * `userId`, `size`, and `conversationId` are still forwarded.\n */\nexport function pickComponentInputs(\n  component: Type<unknown>,\n  inputs: Record<string, unknown>,\n): Record<string, unknown> {\n  const allowed = getComponentInputNames(component);\n  if (!allowed) {\n    return Object.fromEntries(\n      Object.entries(inputs).filter(([key]) => !OPTIONAL_DISPLAY_INPUTS.has(key)),\n    );\n  }\n\n  return Object.fromEntries(Object.entries(inputs).filter(([key]) => allowed.has(key)));\n}\n","/**\n * Conversation avatar host — renders a registered custom component or built-in fallback.\n */\n\nimport { AXAvatarComponent } from '@acorex/components/avatar';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXImageComponent } from '@acorex/components/image';\nimport { AXLabelComponent } from '@acorex/components/label';\nimport { NgComponentOutlet } from '@angular/common';\nimport { Component, ViewEncapsulation, computed, inject, input, type Type } from '@angular/core';\nimport type { AXConversation } from '../../models/conversation.model';\nimport type { AXConversationMessage } from '../../models/message.model';\nimport { AXConversationService } from '../../services';\nimport {\n  AX_CONVERSATION_CONVERSATION_AVATAR_COMPONENT,\n  AX_CONVERSATION_USER_AVATAR_COMPONENT,\n  type AXConversationAvatarKind,\n} from '../../tokens/conversation-avatar.tokens';\nimport {\n  resolveConversationAvatarDisplay,\n  resolveConversationPeerUserId,\n  resolveUserAvatarDisplay,\n  shouldUseUserAvatarForConversation,\n} from '../../utils/avatar-context.utils';\nimport { pickComponentInputs } from '../../utils/component-inputs.utils';\nimport { AXConversationMessageUtilsService } from '../../utils/message-utils.service';\n\n@Component({\n  selector: 'ax-conversation-avatar',\n  encapsulation: ViewEncapsulation.None,\n\n  imports: [NgComponentOutlet, AXAvatarComponent, AXDecoratorModule, AXImageComponent, AXLabelComponent],\n  templateUrl: './conversation-avatar.component.html',\n  styleUrl: './conversation-avatar.component.css',\n  host: {\n    '[style.--ax-conversation-avatar-size.px]': 'size()',\n  },\n})\nexport class AXConversationAvatarComponent {\n  private readonly conversationService = inject(AXConversationService, { optional: true });\n  private readonly userAvatarComponent = inject(AX_CONVERSATION_USER_AVATAR_COMPONENT, { optional: true });\n  private readonly conversationAvatarComponent = inject(AX_CONVERSATION_CONVERSATION_AVATAR_COMPONENT, {\n    optional: true,\n  });\n\n  readonly kind = input<AXConversationAvatarKind>('auto');\n  readonly userId = input<string | undefined>();\n  readonly conversation = input<AXConversation | undefined>();\n  readonly message = input<AXConversationMessage | undefined>();\n  readonly size = input<number>(40);\n  readonly showStatus = input<boolean>(false);\n\n  readonly name = input<string | undefined>();\n  readonly avatar = input<string | undefined>();\n  readonly icon = input<string | undefined>();\n\n  private readonly currentUserId = computed(() => this.conversationService?.currentUser()?.id);\n\n  readonly resolvedKind = computed((): 'user' | 'conversation' => {\n    const explicitKind = this.kind();\n    if (explicitKind === 'user') {\n      return 'user';\n    }\n    if (explicitKind === 'conversation') {\n      return 'conversation';\n    }\n\n    const conversation = this.conversation();\n    if (conversation && shouldUseUserAvatarForConversation(conversation, this.currentUserId())) {\n      return 'user';\n    }\n\n    return 'conversation';\n  });\n\n  readonly resolvedUserId = computed((): string | undefined => {\n    const explicitUserId = this.userId();\n    if (explicitUserId) {\n      return explicitUserId;\n    }\n\n    const conversation = this.conversation();\n    if (!conversation || this.resolvedKind() !== 'user') {\n      return undefined;\n    }\n\n    return resolveConversationPeerUserId(conversation, this.currentUserId());\n  });\n\n  readonly customComponent = computed((): Type<unknown> | null => {\n    if (this.resolvedKind() === 'user') {\n      return this.resolvedUserId() && this.userAvatarComponent ? this.userAvatarComponent : null;\n    }\n\n    const conversation = this.conversation();\n    return conversation && this.conversationAvatarComponent ? this.conversationAvatarComponent : null;\n  });\n\n  readonly customInputs = computed((): Record<string, unknown> => {\n    if (this.resolvedKind() === 'user') {\n      const userId = this.resolvedUserId() ?? '';\n      const resolved = resolveUserAvatarDisplay(userId, this.conversation(), this.message());\n      const explicitName = this.name();\n      const explicitAvatar = this.avatar();\n      const explicitIcon = this.icon();\n\n      return {\n        userId,\n        size: this.size(),\n        displayName: explicitName ?? resolved.name,\n        displayAvatar: explicitAvatar ?? resolved.avatar,\n        displayIcon: explicitIcon ?? resolved.icon,\n      };\n    }\n\n    const conversation = this.conversation();\n    const explicitName = this.name();\n    const explicitAvatar = this.avatar();\n    const explicitIcon = this.icon();\n    const resolved = conversation\n      ? resolveConversationAvatarDisplay(conversation, this.currentUserId())\n      : { name: explicitName ?? '?', avatar: explicitAvatar, icon: explicitIcon };\n\n    return {\n      conversationId: conversation?.id ?? '',\n      size: this.size(),\n      displayName: explicitName ?? resolved.name,\n      displayAvatar: explicitAvatar ?? resolved.avatar,\n      displayIcon: explicitIcon ?? resolved.icon,\n    };\n  });\n\n  readonly filteredCustomInputs = computed((): Record<string, unknown> => {\n    const component = this.customComponent();\n    if (!component) {\n      return {};\n    }\n\n    return pickComponentInputs(component, this.customInputs());\n  });\n\n  readonly fallbackDisplay = computed(() => {\n    const explicitName = this.name();\n    const explicitAvatar = this.avatar();\n    const explicitIcon = this.icon();\n\n    if (this.resolvedKind() === 'user') {\n      const userId = this.resolvedUserId();\n      if (!userId) {\n        return { name: explicitName ?? '?', avatar: explicitAvatar, icon: explicitIcon };\n      }\n\n      const resolved = resolveUserAvatarDisplay(userId, this.conversation(), this.message());\n      return {\n        name: explicitName ?? resolved.name,\n        avatar: explicitAvatar ?? resolved.avatar,\n        icon: explicitIcon ?? resolved.icon,\n      };\n    }\n\n    const conversation = this.conversation();\n    if (!conversation) {\n      return { name: explicitName ?? '?', avatar: explicitAvatar, icon: explicitIcon };\n    }\n\n    const resolved = resolveConversationAvatarDisplay(conversation, this.currentUserId());\n    return {\n      name: explicitName ?? resolved.name,\n      avatar: explicitAvatar ?? resolved.avatar,\n      icon: explicitIcon ?? resolved.icon,\n    };\n  });\n\n  readonly fallbackInitials = computed(() =>\n    AXConversationMessageUtilsService.getInitials(this.fallbackDisplay().name),\n  );\n\n  readonly resolvedStatus = computed(() => {\n    const userId = this.resolvedUserId();\n    if (!userId || !this.showStatus()) {\n      return undefined;\n    }\n    const presence = this.conversationService?.getUserPresence(userId);\n    return AXConversationMessageUtilsService.getUserPresenceStatus(presence);\n  });\n\n  readonly statusBadgePresence = computed((): 'online' | 'offline' | 'away' | 'busy' | undefined => {\n    if (this.customComponent()) {\n      return undefined;\n    }\n\n    return this.resolvedStatus();\n  });\n}\n","<div class=\"ax-conversation-avatar\">\n  @if (customComponent(); as component) {\n    <ng-container *ngComponentOutlet=\"component; inputs: filteredCustomInputs()\" />\n  } @else {\n    <ax-avatar [size]=\"size()\">\n      @if (fallbackDisplay().avatar; as avatarSrc) {\n        <ax-image [src]=\"avatarSrc\" [alt]=\"fallbackDisplay().name\"></ax-image>\n      } @else if (fallbackDisplay().icon; as iconClass) {\n        <ax-icon><i [class]=\"iconClass\" aria-hidden=\"true\"></i></ax-icon>\n      } @else {\n        <ax-label>{{ fallbackInitials() }}</ax-label>\n      }\n    </ax-avatar>\n  }\n\n  @if (statusBadgePresence(); as presence) {\n    <span\n      class=\"ax-conversation-avatar-status\"\n      [class.status-online]=\"presence === 'online'\"\n      [class.status-offline]=\"presence === 'offline'\"\n      [class.status-away]=\"presence === 'away'\"\n      [class.status-busy]=\"presence === 'busy'\"\n    ></span>\n  }\n</div>\n","/**\n * AXConversationInfoBarService\n * Facade/service for Info Bar to interact with registries and conversation state.\n */\nimport { inject, Injectable, Injector, runInInjectionContext, signal, Type } from '@angular/core';\nimport { AXConversation, AXConversationMessage } from '../../models';\nimport { AXConversationInfoBarAction } from '../../registries';\nimport type { AXConversationMessageInfoBarBannerComponent } from '../../registries/message-renderer.registry';\nimport { AXConversationService } from '../../services';\n\n/**\n * Active component state in info-bar\n */\nexport interface AXConversationInfoBarActiveComponent {\n  /** Action that triggered this component */\n  action: AXConversationInfoBarAction;\n  /** Eager component to render */\n  component?: Type<unknown>;\n  /** Lazy loader for the component */\n  componentLoader?: () => Promise<Type<unknown>>;\n  /** Component inputs */\n  inputs?: Record<string, unknown>;\n}\n\nexport interface AXConversationInfoBarActiveBanner {\n  /** Message that owns this banner */\n  message: AXConversationMessage;\n  /** Banner component */\n  component?: Type<AXConversationMessageInfoBarBannerComponent>;\n  /** Lazy loader for banner component */\n  componentLoader?: () => Promise<Type<AXConversationMessageInfoBarBannerComponent>>;\n  /** Additional component inputs (only keys that match declared `input()` on the banner) */\n  inputs?: Record<string, unknown>;\n  /** Callback invoked when the banner is dismissed (e.g. pause playback) */\n  onClose?: () => void;\n}\n\n/**\n * Info Bar Service\n * Manages info bar state and actions\n */\n@Injectable()\nexport class AXConversationInfoBarService {\n  private readonly conversationService = inject(AXConversationService);\n  private readonly injector = inject(Injector);\n\n  // Access registry through conversation service\n  private get registry() {\n    return this.conversationService.registry;\n  }\n\n  /** Active conversation */\n  readonly activeConversation = this.conversationService.activeConversation;\n\n  /** Active component being shown in info-bar */\n  private readonly _activeComponent = signal<AXConversationInfoBarActiveComponent | null>(null);\n  readonly activeComponent = this._activeComponent.asReadonly();\n\n  /** Active banner shown under info-bar */\n  private readonly _activeBanner = signal<AXConversationInfoBarActiveBanner | null>(null);\n  readonly activeBanner = this._activeBanner.asReadonly();\n\n  /** Search query signal */\n  private readonly _searchQuery = signal<string>('');\n  readonly searchQuery = this._searchQuery.asReadonly();\n\n  private readonly _searchResultsCount = signal<number>(0);\n  readonly searchResultsCount = this._searchResultsCount.asReadonly();\n\n  /** Current search result index */\n  private readonly _currentSearchIndex = signal<number>(0);\n  readonly currentSearchIndex = this._currentSearchIndex.asReadonly();\n\n  /**\n   * Reset info-bar overlays when the active conversation changes.\n   */\n  onConversationChanged(): void {\n    this.hideMessageBanner();\n    this.hideComponent();\n  }\n\n  /**\n   * Get actions for the active conversation\n   */\n  getActionsForConversation(conversation: AXConversation) {\n    return this.registry.infoBarActions.getActionsForConversation(conversation);\n  }\n\n  /**\n   * Execute an action\n   */\n  async executeAction(actionId: string, conversation: AXConversation, data?: Record<string, unknown>): Promise<void> {\n    const action = this.registry.infoBarActions.getById(actionId);\n    if (!action) {\n      console.warn(`Action '${actionId}' not found in registry`);\n      return;\n    }\n\n    // Check if action is enabled (static)\n    if (action.enabled === false) {\n      console.warn(`Action '${actionId}' is disabled`);\n      return;\n    }\n\n    const context = {\n      conversation,\n      data,\n    };\n\n    // Check if action is enabled (dynamic)\n    if (action.enabledWhen && !runInInjectionContext(this.injector, () => action.enabledWhen?.(context))) {\n      console.warn(`Action '${actionId}' is disabled for this context`);\n      return;\n    }\n\n    // Execute handler if provided\n    if (action.handler) {\n      await runInInjectionContext(this.injector, () => action.handler?.(context));\n    }\n  }\n\n  /**\n   * Get action label\n   */\n  getActionLabel(action: AXConversationInfoBarAction, conversation: AXConversation): string {\n    return this.registry.infoBarActions.getActionLabel(action, conversation);\n  }\n\n  /**\n   * Get action icon\n   */\n  getActionIcon(action: AXConversationInfoBarAction, conversation: AXConversation): string | undefined {\n    return this.registry.infoBarActions.getActionIcon(action, conversation);\n  }\n\n  /**\n   * Show a component in the info-bar\n   */\n  showComponent(action: AXConversationInfoBarAction, inputs?: Record<string, unknown>): void {\n    if (!action.component && !action.componentLoader) return;\n\n    this._activeComponent.set({\n      action,\n      component: action.component,\n      componentLoader: action.componentLoader,\n      inputs,\n    });\n  }\n\n  /**\n   * Hide the active component\n   */\n  hideComponent(): void {\n    const current = this._activeComponent();\n\n    // Clear any state associated with the active component\n    if (current) {\n      // If it's a search component, clear search state\n      if (current.action.id === 'search') {\n        this.clearSearch();\n      }\n      // Add more cleanup logic here for other component types if needed\n    }\n\n    this._activeComponent.set(null);\n  }\n\n  /**\n   * Show message-owned banner under info-bar if renderer provides one\n   */\n  async showMessageBanner(message: AXConversationMessage, inputs?: Record<string, unknown>): Promise<void> {\n    const renderer = this.registry.messageRenderers.getRenderer(message);\n    const bannerComponent = renderer?.infoBarBanner;\n    const bannerLoader = renderer?.infoBarBannerLoader;\n    if (!bannerComponent && !bannerLoader) {\n      return;\n    }\n\n    const current = this._activeBanner();\n    if (current?.message.id === message.id) {\n      this.updateMessageBannerInputs(message.id, inputs ?? {});\n      return;\n    }\n\n    if (current && current.message.id !== message.id) {\n      this.hideMessageBanner(current.message.id);\n    }\n\n    const { onClose, ...componentInputs } = this._extractOnClose(inputs);\n    this._activeBanner.set({\n      message,\n      component: bannerComponent,\n      componentLoader: bannerLoader,\n      inputs: componentInputs,\n      onClose,\n    });\n  }\n\n  /**\n   * Update active banner inputs for a specific message\n   */\n  updateMessageBannerInputs(messageId: string, inputs: Record<string, unknown>): void {\n    const current = this._activeBanner();\n    if (!current || current.message.id !== messageId) {\n      return;\n    }\n    const { onClose, ...componentInputs } = this._extractOnClose(inputs);\n    this._activeBanner.set({\n      ...current,\n      inputs: {\n        ...(current.inputs ?? {}),\n        ...componentInputs,\n      },\n      ...(onClose !== undefined ? { onClose } : {}),\n    });\n  }\n\n  /**\n   * Hide active banner. If messageId is provided, hide only when it matches.\n   */\n  hideMessageBanner(messageId?: string): void {\n    const current = this._activeBanner();\n    if (!current) {\n      return;\n    }\n    if (messageId && current.message.id !== messageId) {\n      return;\n    }\n\n    if (current.onClose) {\n      try {\n        current.onClose();\n      } catch (error) {\n        console.warn('Failed to execute info-bar banner close hook:', error);\n      }\n    }\n\n    this._activeBanner.set(null);\n  }\n\n  isMessageBannerActive(messageId: string): boolean {\n    return this._activeBanner()?.message.id === messageId;\n  }\n\n  /**\n   * Toggle component visibility\n   */\n  toggleComponent(action: AXConversationInfoBarAction, inputs?: Record<string, unknown>): void {\n    const current = this._activeComponent();\n    if (current?.action.id === action.id) {\n      this.hideComponent();\n    } else {\n      this.showComponent(action, inputs);\n    }\n  }\n\n  /**\n   * Set search query\n   */\n  setSearchQuery(query: string): void {\n    this._searchQuery.set(query);\n  }\n\n  /**\n   * Set search results\n   */\n  setSearchResults(count: number, currentIndex = 0): void {\n    this._searchResultsCount.set(count);\n    this._currentSearchIndex.set(currentIndex);\n  }\n\n  /**\n   * Navigate to next search result\n   */\n  nextSearchResult(): void {\n    const count = this._searchResultsCount();\n    if (count === 0) return;\n\n    const current = this._currentSearchIndex();\n    this._currentSearchIndex.set((current + 1) % count);\n  }\n\n  /**\n   * Navigate to previous search result\n   */\n  previousSearchResult(): void {\n    const count = this._searchResultsCount();\n    if (count === 0) return;\n\n    const current = this._currentSearchIndex();\n    this._currentSearchIndex.set(current === 0 ? count - 1 : current - 1);\n  }\n\n  /**\n   * Clear search\n   */\n  clearSearch(): void {\n    this._searchQuery.set('');\n    this._searchResultsCount.set(0);\n    this._currentSearchIndex.set(0);\n  }\n\n  private _extractOnClose(inputs?: Record<string, unknown>): {\n    onClose?: () => void;\n    [key: string]: unknown;\n  } {\n    if (!inputs) return {};\n    const { onClose, ...rest } = inputs;\n    return {\n      ...rest,\n      ...(typeof onClose === 'function' ? { onClose: onClose as () => void } : {}),\n    };\n  }\n}\n","/**\n * InfoBar Component\n * Header bar showing conversation info and actions\n */\n\nimport { AXButtonComponent, AXButtonItemComponent, AXButtonItemListComponent } from '@acorex/components/button';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXDropdownPanelComponent } from '@acorex/components/dropdown';\nimport { AXLabelComponent } from '@acorex/components/label';\nimport { AXPlatform } from '@acorex/core/platform';\nimport { CommonModule } from '@angular/common';\nimport { Component, DestroyRef, ViewEncapsulation, computed, inject, output, signal } from '@angular/core';\nimport { AXConversationInfoBarAction } from '../../registries';\nimport { AXConversation } from '../../models';\nimport { AXConversationService } from '../../services';\nimport { AXConversationMessageUtilsService } from '../../utils';\nimport { AXConversationAvatarComponent } from '../shared/conversation-avatar.component';\nimport { AXConversationRegistryComponentOutletComponent } from '../shared/registry-component-outlet.component';\nimport { AX_CONVERSATION_USER_AVATAR_COMPONENT } from '../../tokens/conversation-avatar.tokens';\nimport { AXConversationInfoBarService } from './info-bar.service';\n\nexport interface AXConversationDropdownMenuItem {\n  id: string;\n  label: string;\n  icon?: string;\n  disabled?: boolean;\n  divider?: boolean;\n  destructive?: boolean;\n  shortcut?: string;\n}\n\n@Component({\n  selector: 'ax-conversation-info-bar',\n  encapsulation: ViewEncapsulation.None,\n  imports: [\n    CommonModule,\n    AXButtonComponent,\n    AXButtonItemComponent,\n    AXButtonItemListComponent,\n    AXDropdownPanelComponent,\n    AXDecoratorModule,\n    AXLabelComponent,\n    AXConversationAvatarComponent,\n    AXConversationRegistryComponentOutletComponent,\n  ],\n\n  templateUrl: './info-bar.component.html',\n  styleUrl: './info-bar.component.css',\n})\nexport class AXConversationInfoBarComponent {\n  private readonly conversationService = inject(AXConversationService);\n  private readonly infoBar = inject(AXConversationInfoBarService);\n  private readonly platform = inject(AXPlatform);\n  private readonly destroyRef = inject(DestroyRef);\n  private readonly customUserAvatarComponent = inject(AX_CONVERSATION_USER_AVATAR_COMPONENT, { optional: true });\n\n  private readonly layoutTick = signal(0);\n\n  constructor() {\n    const resizeSub = this.platform.resize.subscribe(() => {\n      this.layoutTick.update((tick) => tick + 1);\n    });\n    this.destroyRef.onDestroy(() => resizeSub.unsubscribe());\n  }\n\n  protected get registry() {\n    return this.conversationService.registry;\n  }\n\n  readonly hasCustomUserAvatar = computed(() => !!this.customUserAvatarComponent);\n\n  readonly activeConversation = this.infoBar.activeConversation;\n  readonly activeComponent = this.infoBar.activeComponent;\n  readonly activeBanner = this.infoBar.activeBanner;\n  readonly membersPopoverTarget = signal<HTMLElement | null>(null);\n  readonly actionLoading = signal<boolean>(false);\n\n  readonly infoClick = output<void>();\n  readonly searchClick = output<void>();\n  readonly searchQuery = output<string>();\n  readonly menuItemAction = output<string>();\n\n  readonly inlineActions = computed(() => {\n    this.layoutTick();\n    const conversation = this.activeConversation();\n    if (!conversation) return [];\n    return this.registry.infoBarActions.getInlineActions(conversation);\n  });\n\n  readonly menuItems = computed((): AXConversationDropdownMenuItem[] => {\n    this.layoutTick();\n    const conversation = this.activeConversation();\n    if (!conversation) return [];\n\n    const actions = this.registry.infoBarActions.getMenuActions(conversation);\n\n    return actions.map((action) => {\n      const originalIndex = actions.findIndex((a) => a.id === action.id);\n      const nextAction = actions[originalIndex + 1];\n      const hasBreakAfter = nextAction?.divider === true;\n\n      return {\n        id: action.id,\n        label: this.registry.infoBarActions.getActionLabel(action, conversation),\n        icon: this.registry.infoBarActions.getActionIcon(action, conversation),\n        divider: action.divider,\n        destructive: action.destructive,\n        disabled: !this.registry.infoBarActions.isActionEnabled(action, { conversation }),\n      };\n    });\n  });\n\n  getStatus(conversation: AXConversation) {\n    return AXConversationMessageUtilsService.getConversationStatus(\n      conversation,\n      this.conversationService.getPeerPresence(conversation),\n    );\n  }\n\n  getSubtitle(conversation: AXConversation): string {\n    this.conversationService.presenceTimeTick();\n    this.conversationService.typingRevision();\n    return AXConversationMessageUtilsService.getConversationSubtitle(conversation, {\n      typingUserIds: this.conversationService.getActiveTypingUserIds(conversation.id),\n      peerPresence: this.conversationService.getPeerPresence(conversation),\n      currentUserId: this.conversationService.currentUser()?.id,\n    });\n  }\n\n  isTyping(conversation: AXConversation): boolean {\n    this.conversationService.typingRevision();\n    return this.conversationService.getActiveTypingUserIds(conversation.id).length > 0;\n  }\n\n  onInfoLeftClick(): void {\n    this.infoClick.emit();\n  }\n\n  async onInlineActionClick(actionId: string): Promise<void> {\n    const conversation = this.activeConversation();\n    if (!conversation) return;\n\n    const action = this.registry.infoBarActions.getById(actionId);\n    if (!action) return;\n\n    await this.activateAction(action, conversation);\n  }\n\n  private async activateAction(action: AXConversationInfoBarAction, conversation: AXConversation): Promise<void> {\n    if ((action.component || action.componentLoader) && action.toggleable) {\n      this.infoBar.toggleComponent(action, {\n        conversation,\n        service: this.infoBar,\n      });\n      return;\n    }\n\n    if (action.component || action.componentLoader) {\n      this.infoBar.showComponent(action, {\n        conversation,\n        service: this.infoBar,\n      });\n      return;\n    }\n\n    this.actionLoading.set(true);\n    try {\n      await this.infoBar.executeAction(action.id, conversation);\n    } catch (error) {\n      console.error('Failed to execute info-bar action:', error);\n    } finally {\n      this.actionLoading.set(false);\n    }\n  }\n\n  getComponentInputs(): Record<string, unknown> {\n    const activeComp = this.activeComponent();\n    if (!activeComp) return {};\n\n    return {\n      ...activeComp.inputs,\n      conversation: this.activeConversation(),\n      service: this.infoBar,\n    };\n  }\n\n  getInlineComponentInputs(): Record<string, unknown> {\n    return {\n      conversation: this.activeConversation(),\n      service: this.infoBar,\n    };\n  }\n\n  isActiveComponentFullWidth(): boolean {\n    const activeComp = this.activeComponent();\n    if (!activeComp) return false;\n    return activeComp.action.fullWidthComponent !== false;\n  }\n\n  onCloseComponent(): void {\n    this.infoBar.hideComponent();\n  }\n\n  getBannerInputs(): Record<string, unknown> {\n    const activeBanner = this.activeBanner();\n    if (!activeBanner) return {};\n    return {\n      ...activeBanner.inputs,\n      message: activeBanner.message,\n    };\n  }\n\n  onCloseBanner(): void {\n    this.infoBar.hideMessageBanner();\n  }\n\n  async onMenuItemClick(item: AXConversationDropdownMenuItem): Promise<void> {\n    const conversation = this.activeConversation();\n    if (!conversation) return;\n\n    const action = this.registry.infoBarActions.getById(item.id);\n    if (!action) return;\n\n    await this.activateAction(action, conversation);\n    this.menuItemAction.emit(item.id);\n  }\n}\n","@if (activeConversation(); as conversation) {\n  <div class=\"info-bar\">\n    <!-- Left: Avatar and Info -->\n    <div class=\"info-prefix\" (click)=\"$event.stopPropagation()\">\n      <ng-content select=\"ax-prefix\"></ng-content>\n    </div>\n    <div\n      class=\"info-left\"\n      role=\"button\"\n      tabindex=\"0\"\n      (click)=\"onInfoLeftClick()\"\n      (keydown.enter)=\"onInfoLeftClick()\"\n      (keydown.space)=\"$event.preventDefault(); onInfoLeftClick()\"\n    >\n      <div class=\"avatar-wrapper\">\n        <ax-conversation-avatar\n          kind=\"auto\"\n          [conversation]=\"conversation\"\n          [size]=\"44\"\n          [showStatus]=\"conversation.type === 'private' && !hasCustomUserAvatar()\"\n        />\n      </div>\n\n      <div class=\"info-details\">\n        <p class=\"info-title\">{{ conversation.title }}</p>\n        @if (conversation.type !== 'private') {\n          <p class=\"info-subtitle\" [class.info-subtitle--typing]=\"isTyping(conversation)\">{{ getSubtitle(conversation) }}</p>\n        } @else {\n          <div class=\"info-subtitle-with-status\">\n            @if (getStatus(conversation) === 'online' && !hasCustomUserAvatar()) {\n              <span class=\"online-badge\">●</span>\n            }\n            <p class=\"info-subtitle\" [class.info-subtitle--typing]=\"isTyping(conversation)\">{{ getSubtitle(conversation) }}</p>\n          </div>\n        }\n      </div>\n    </div>\n\n    <!-- Right: Actions or Full-Width Component -->\n    @if (!activeComponent() || !isActiveComponentFullWidth()) {\n      <div class=\"info-actions\" (click)=\"$event.stopPropagation()\">\n        <!-- Inline action buttons from registry -->\n        @for (action of inlineActions(); track action.id) {\n          @if ((action.component || action.componentLoader) && action.fullWidthComponent === false) {\n            <ax-conversation-registry-component-outlet\n              [component]=\"action.component\"\n              [componentLoader]=\"action.componentLoader\"\n              [inputs]=\"getInlineComponentInputs()\"\n            />\n          } @else {\n            <ax-button class=\"action-button\" (onClick)=\"onInlineActionClick(action.id)\" look=\"ghost\">\n              <ax-icon [icon]=\"registry.infoBarActions.getActionIcon(action, activeConversation()!)\"></ax-icon>\n            </ax-button>\n          }\n        }\n\n        <ax-button look=\"blank\">\n          <ax-icon><i class=\"fa-light fa-ellipsis-vertical\"></i></ax-icon>\n          <ax-dropdown-panel>\n            <ax-button-item-list>\n              @for (item of menuItems(); track item.id) {\n                @if (item.divider) {\n                  <ax-divider></ax-divider>\n                } @else {\n                  <ax-button-item\n                    [text]=\"item.label\"\n                    [disabled]=\"item.disabled\"\n                    [color]=\"item.destructive ? 'danger' : 'default'\"\n                    (onClick)=\"onMenuItemClick(item)\"\n                  >\n                    @if (item.icon) {\n                      <ax-prefix>\n                        <ax-icon [icon]=\"item.icon\"></ax-icon>\n                      </ax-prefix>\n                    }\n                    @if (item.shortcut) {\n                      <ax-suffix>\n                        <ax-label class=\"shortcut\">{{ item.shortcut }}</ax-label>\n                      </ax-suffix>\n                    }\n                  </ax-button-item>\n                }\n              }\n            </ax-button-item-list>\n          </ax-dropdown-panel>\n        </ax-button>\n      </div>\n    }\n\n    @if (activeComponent() && isActiveComponentFullWidth()) {\n      <!-- Full-width component mode (e.g., search) - takes entire info-bar -->\n      <div\n        class=\"info-component-fullwidth\"\n        animate.enter=\"slide-in\"\n        animate.leave=\"slide-out\"\n        (click)=\"$event.stopPropagation()\"\n      >\n        <ax-conversation-registry-component-outlet\n          [component]=\"activeComponent()!.component\"\n          [componentLoader]=\"activeComponent()!.componentLoader\"\n          [inputs]=\"getComponentInputs()\"\n        />\n        <ax-button class=\"action-button close-button\" (onClick)=\"onCloseComponent()\" [look]=\"'ghost'\">\n          <ax-icon><i class=\"fa-light fa-xmark\"></i></ax-icon>\n        </ax-button>\n      </div>\n    }\n  </div>\n\n  @if (activeBanner()) {\n    <div class=\"ax-conversation-info-banner\" (click)=\"$event.stopPropagation()\">\n      <div class=\"ax-conversation-info-banner__content\">\n        <ax-conversation-registry-component-outlet\n          [component]=\"activeBanner()!.component\"\n          [componentLoader]=\"activeBanner()!.componentLoader\"\n          [inputs]=\"getBannerInputs()\"\n        />\n      </div>\n      <button\n        type=\"button\"\n        class=\"ax-conversation-info-banner__close\"\n        (click)=\"onCloseBanner()\"\n        [attr.aria-label]=\"'Close'\"\n      >\n        <i class=\"fa-light fa-xmark\"></i>\n      </button>\n    </div>\n  }\n}\n","import { AXClosableComponent, AXComponentCloseEvent, AXDataSource } from '@acorex/cdk/common';\nimport { AXButtonComponent } from '@acorex/components/button';\nimport { AXDecoratorGenericComponent } from '@acorex/components/decorators';\nimport { AXListComponent } from '@acorex/components/list';\nimport { AXLoadingComponent } from '@acorex/components/loading';\nimport type { AXPopupRef } from '@acorex/components/popup';\nimport { AXSearchBoxComponent } from '@acorex/components/search-box';\nimport { AXToastService } from '@acorex/components/toast';\nimport { AXTranslationModule, AXTranslationService } from '@acorex/core/translation';\nimport { CommonModule } from '@angular/common';\nimport {\n  Component,\n  ViewEncapsulation,\n  computed,\n  effect,\n  EventEmitter,\n  inject,\n  input,\n  OnInit,\n  signal,\n  TemplateRef,\n  viewChild,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { AXConversation, AXConversationMessage } from '../../models';\nimport { AXConversationService } from '../../services';\nimport { AXConversationAvatarComponent } from '../shared/conversation-avatar.component';\n\n@Component({\n  selector: 'ax-conversation-forward-message-dialog',\n  encapsulation: ViewEncapsulation.None,\n\n  imports: [\n    CommonModule,\n    FormsModule,\n    AXListComponent,\n    AXSearchBoxComponent,\n    AXButtonComponent,\n    AXDecoratorGenericComponent,\n    AXConversationAvatarComponent,\n    AXLoadingComponent,\n    AXTranslationModule,\n  ],\n  templateUrl: './forward-message-dialog.component.html',\n  styleUrl: './forward-message-dialog.component.css',\n  providers: [{ provide: AXClosableComponent, useExisting: AXConversationForwardMessageDialogComponent }],\n})\nexport class AXConversationForwardMessageDialogComponent implements OnInit {\n  private readonly toastService = inject(AXToastService);\n  private readonly translation = inject(AXTranslationService);\n\n  /**\n   * Set by {@link AXPopupComponent} when opened via {@link AXPopupService} so the shell title can update.\n   */\n  readonly __popup__ = input<AXPopupRef | undefined>(undefined);\n\n  /**\n   * Assigned from `open(..., { data: { conversationService } })` — see {@link AXConversationNewDialogComponent}\n   * for why this is not `inject(AXConversationService)`.\n   */\n  conversationService!: AXConversationService;\n  /** Assigned from `open(..., { data: { message } })`. */\n  message!: AXConversationMessage;\n\n  readonly onClosed = new EventEmitter<AXComponentCloseEvent>();\n\n  readonly allConversations = signal<AXConversation[]>([]);\n  readonly forwardSearchQuery = signal('');\n  readonly selectedConversationIds = signal<string[]>([]);\n\n  readonly forwardListEmptyTpl = viewChild.required<TemplateRef<unknown>>('forwardListEmpty');\n  readonly forwardList = viewChild<AXListComponent>('forwardList');\n\n  readonly forwardListDataSource = new AXDataSource<unknown>({\n    pageSize: 50,\n    key: 'id',\n    load: async (e) => {\n      const items = this.getFilteredConversationsForForward() as unknown[];\n      return {\n        items: items.slice(e.skip, e.skip + e.take),\n        total: items.length,\n      };\n    },\n    byKey: (key) => Promise.resolve(this.allConversations().find((c) => c.id === key) ?? null),\n  });\n\n  readonly isForwarding = computed(() => this.conversationService?.isForwardingMessage() ?? false);\n\n  readonly canForward = computed(\n    () => this.selectedConversationIds().length > 0 && !this.isForwarding(),\n  );\n\n  private readonly _syncPopupTitleEffect = effect(() => {\n    const popupRef = this.__popup__();\n    const count = this.selectedConversationIds().length;\n    const title =\n      count > 0\n        ? this.translation.translateSync('@acorex:chat.dialog.forward-message.selected-count', { params: { count } })\n        : this.translation.translateSync('@acorex:chat.dialog.forward-message.title');\n    popupRef?.setTitle(title);\n  });\n\n  ngOnInit(): void {\n    const conversations = this.conversationService.conversations();\n    const filtered = conversations.filter((c) => c.id !== this.message.conversationId && !c.archived);\n    this.allConversations.set(filtered);\n  }\n\n  onForwardSearchChange(value: string): void {\n    this.forwardSearchQuery.set(value ?? '');\n    this.forwardList()?.refresh(false);\n  }\n\n  conversationFromItem(item: unknown): AXConversation | null {\n    if (!item || typeof item !== 'object' || !('data' in item)) return null;\n    return (item as { data?: AXConversation }).data ?? null;\n  }\n\n  isSelected(conversationId: string): boolean {\n    return this.selectedConversationIds().includes(conversationId);\n  }\n\n  private getFilteredConversationsForForward(): AXConversation[] {\n    const q = this.forwardSearchQuery().toLowerCase().trim();\n    let items = this.allConversations();\n    if (q) {\n      items = items.filter((c) => c.title.toLowerCase().includes(q));\n    }\n    return items;\n  }\n\n  onCancel(): void {\n    const event = new AXComponentCloseEvent();\n    event.component = this;\n    event.data = null;\n    this.onClosed.emit(event);\n  }\n\n  async onForward(): Promise<void> {\n    if (!this.conversationService || !this.message) return;\n\n    const selectedIds = this.selectedConversationIds();\n    if (selectedIds.length === 0 || this.isForwarding()) return;\n\n    try {\n      await this.conversationService.runWithForwardingLock(async () => {\n        const originalConversation = this.conversationService\n          .conversations()\n          .find((c) => c.id === this.message.conversationId);\n\n        const sender = originalConversation?.participants.find((p) => p.id === this.message.senderId);\n\n        const forwardPromises = selectedIds.map(async (conversationId) => {\n          const forwardCommand = {\n            conversationId,\n            type: this.message.type,\n            payload: this.message.payload,\n            forwarded: true,\n            forwardedFrom: {\n              messageId: this.message.id,\n              senderId: this.message.senderId,\n              senderName: sender?.name || this.translation.translateSync('@acorex:chat.fallbacks.unknown-user'),\n              conversationId: this.message.conversationId,\n              conversationTitle: originalConversation?.title,\n            },\n            originalSenderId: this.message.senderId,\n            metadata: this.message.metadata,\n          };\n          return this.conversationService.sendMessage(forwardCommand);\n        });\n\n        await Promise.all(forwardPromises);\n\n        const count = selectedIds.length;\n        this.toastService.success(\n          this.translation.translateSync('@acorex:chat.notifications.message-forwarded', { params: { count } }),\n        );\n\n        const event = new AXComponentCloseEvent();\n        event.component = this;\n        event.data = { success: true, count };\n        this.onClosed.emit(event);\n      });\n    } catch (error: unknown) {\n      console.error('Failed to forward message:', error);\n      const errorMessage =\n        error &&\n        typeof error === 'object' &&\n        'message' in error &&\n        typeof (error as { message: unknown }).message === 'string'\n          ? (error as { message: string }).message\n          : this.translation.translateSync('@acorex:chat.errors.failed-to-forward-message');\n      this.toastService.danger(errorMessage);\n    }\n  }\n}\n","<div class=\"forward-message-dialog\">\n  <ng-template #forwardListEmpty>\n    <div class=\"forward-list-empty\">\n      @if (forwardSearchQuery()) {\n        {{ '@acorex:chat.dialog.forward-message.no-conversations-search' | translate | async }}\n      } @else {\n        {{ '@acorex:chat.dialog.forward-message.no-conversations-available' | translate | async }}\n      }\n    </div>\n  </ng-template>\n\n  <div class=\"dialog-content\">\n    <div class=\"forward-list-wrap\">\n      <ax-list\n        #forwardList\n        class=\"forward-list\"\n        [dataSource]=\"forwardListDataSource\"\n        [multiple]=\"true\"\n        [valueField]=\"'id'\"\n        [textField]=\"'title'\"\n        [checkbox]=\"false\"\n        [itemHeight]=\"52\"\n        [ngModel]=\"selectedConversationIds()\"\n        (ngModelChange)=\"selectedConversationIds.set($event ?? [])\"\n        [emptyTemplate]=\"forwardListEmptyTpl()\"\n        [itemTemplate]=\"forwardItemTpl\"\n      >\n        <ax-header class=\"forward-list-header\">\n          <div class=\"forward-list-header-inner\">\n            <ax-search-box\n              [value]=\"forwardSearchQuery()\"\n              (valueChange)=\"onForwardSearchChange($event)\"\n              [placeholder]=\"'@acorex:chat.placeholders.search-conversations' | translate | async\"\n            ></ax-search-box>\n          </div>\n        </ax-header>\n      </ax-list>\n    </div>\n  </div>\n\n  <ng-template #forwardItemTpl let-item>\n    @if (conversationFromItem(item); as conversation) {\n      <div class=\"forward-item-content\">\n        <input class=\"ax-checkbox\" type=\"checkbox\" [checked]=\"isSelected(conversation.id)\" tabindex=\"0\" />\n        <ax-conversation-avatar kind=\"auto\" [conversation]=\"conversation\" [size]=\"36\" />\n        <span class=\"forward-title-text ax-truncated\">{{ conversation.title }}</span>\n      </div>\n    }\n  </ng-template>\n\n  <ax-footer class=\"dialog-footer\">\n    <ax-suffix>\n      <ax-button\n        [text]=\"'@acorex:chat.actions.cancel' | translate | async\"\n        [look]=\"'solid'\"\n        [disabled]=\"isForwarding()\"\n        (onClick)=\"onCancel()\"\n      >\n      </ax-button>\n      <ax-button\n        [text]=\"'@acorex:chat.actions.forward' | translate | async\"\n        [look]=\"'solid'\"\n        [color]=\"'primary'\"\n        [disabled]=\"!canForward()\"\n        (onClick)=\"onForward()\"\n      >\n        @if (isForwarding()) {\n          <ax-loading></ax-loading>\n        }\n      </ax-button>\n    </ax-suffix>\n  </ax-footer>\n</div>\n","/**\n * Infinite Scroll Directive\n * Triggers an event when the user scrolls near the top or bottom of a container\n *\n * @deprecated This is a custom implementation. Consider using @acorex/cdk/common AXInfiniteScrollerDirective\n * Kept for backward compatibility with conversation-specific API\n */\n\nimport { isPlatformBrowser } from '@angular/common';\nimport { Directive, ElementRef, PLATFORM_ID, afterNextRender, inject, input, output } from '@angular/core';\n\n@Directive({\n  selector: '[axInfiniteScroll]',\n})\nexport class AXConversationInfiniteScrollDirective {\n  private readonly elementRef = inject(ElementRef);\n  private readonly platformId = inject(PLATFORM_ID);\n\n  /** Threshold in pixels from the edge to trigger the event */\n  readonly threshold = input<number>(200);\n\n  /** Which edge to watch: 'top', 'bottom', or 'both' */\n  readonly edge = input<'top' | 'bottom' | 'both'>('bottom');\n\n  /** When true, scroll events are ignored (e.g. while a page is loading). */\n  readonly scrollDisabled = input(false);\n\n  /** Minimum time between emissions (ms) to avoid duplicate API calls. */\n  readonly cooldownMs = input(400);\n\n  /** Event emitted when scrolling reaches the threshold */\n  readonly scrollThreshold = output<'top' | 'bottom'>();\n\n  private lastScrollTop = 0;\n  private ticking = false;\n  private lastEmitAt = 0;\n  private pendingEmit: 'top' | 'bottom' | null = null;\n\n  constructor() {\n    afterNextRender(() => {\n      if (isPlatformBrowser(this.platformId)) {\n        this.setupScrollListener();\n      }\n    });\n  }\n\n  private setupScrollListener(): void {\n    const element = this.elementRef.nativeElement as HTMLElement;\n\n    element.addEventListener('scroll', () => {\n      if (!this.ticking) {\n        window.requestAnimationFrame(() => {\n          this.handleScroll();\n          this.ticking = false;\n        });\n        this.ticking = true;\n      }\n    });\n  }\n\n  private handleScroll(): void {\n    if (this.scrollDisabled()) {\n      return;\n    }\n\n    const element = this.elementRef.nativeElement as HTMLElement;\n    const scrollTop = element.scrollTop;\n    const scrollHeight = element.scrollHeight;\n    const clientHeight = element.clientHeight;\n    const threshold = this.threshold();\n    const edge = this.edge();\n    const now = Date.now();\n    const cooldown = this.cooldownMs();\n\n    let edgeHit: 'top' | 'bottom' | null = null;\n\n    // Check top threshold (scrolling up toward older content)\n    if ((edge === 'top' || edge === 'both') && scrollTop <= threshold && scrollTop < this.lastScrollTop) {\n      edgeHit = 'top';\n    }\n\n    // Check bottom threshold (scrolling down toward newer content / list end)\n    if (\n      (edge === 'bottom' || edge === 'both') &&\n      scrollTop + clientHeight >= scrollHeight - threshold &&\n      scrollTop > this.lastScrollTop\n    ) {\n      edgeHit = 'bottom';\n    }\n\n    this.lastScrollTop = scrollTop;\n\n    if (!edgeHit) {\n      return;\n    }\n\n    if (now - this.lastEmitAt < cooldown) {\n      this.pendingEmit = edgeHit;\n      return;\n    }\n\n    this.emitThreshold(edgeHit);\n  }\n\n  private emitThreshold(edge: 'top' | 'bottom'): void {\n    this.lastEmitAt = Date.now();\n    this.pendingEmit = null;\n    this.scrollThreshold.emit(edge);\n\n    const cooldown = this.cooldownMs();\n    if (cooldown > 0) {\n      window.setTimeout(() => {\n        if (this.pendingEmit && !this.scrollDisabled()) {\n          const pending = this.pendingEmit;\n          this.pendingEmit = null;\n          this.emitThreshold(pending);\n        }\n      }, cooldown);\n    }\n  }\n}\n","import { AXTranslationService } from '@acorex/core/translation';\nimport { Component, ViewEncapsulation, computed, inject, input } from '@angular/core';\nimport { AXConversation } from '../../models';\n\n@Component({\n  selector: 'ax-conversation-message-list-empty-default',\n  encapsulation: ViewEncapsulation.None,\n\n  imports: [],\n  host: {\n    class: 'ax-message-empty-host',\n  },\n  templateUrl: './message-list-empty-default.component.html',\n  styleUrl: './message-list-empty-default.component.css',\n})\nexport class AXConversationMessageListEmptyDefaultComponent {\n  private readonly translation = inject(AXTranslationService);\n  readonly conversation = input.required<AXConversation>();\n\n  readonly emptyAriaLabel = computed(() => this.translation.translateSync('@acorex:chat.status.no-messages'));\n  readonly emptyTitle = computed(() => this.translation.translateSync('@acorex:chat.empty.no-messages-yet'));\n\n  readonly iconClass = computed(() => {\n    switch (this.conversation().type) {\n      case 'private':\n        return 'fa-light fa-comment-dots';\n      case 'group':\n        return 'fa-light fa-users';\n      case 'channel':\n        return 'fa-light fa-hashtag';\n      case 'bot':\n        return 'fa-light fa-robot';\n      default:\n        return 'fa-light fa-comments';\n    }\n  });\n\n  readonly eyebrowLabel = computed(() => {\n    switch (this.conversation().type) {\n      case 'private':\n        return this.translation.translateSync('@acorex:chat.empty.eyebrow.direct-message');\n      case 'group':\n        return this.translation.translateSync('@acorex:chat.empty.eyebrow.group-chat');\n      case 'channel':\n        return this.translation.translateSync('@acorex:chat.empty.eyebrow.channel');\n      case 'bot':\n        return this.translation.translateSync('@acorex:chat.empty.eyebrow.assistant');\n      default:\n        return this.translation.translateSync('@acorex:chat.empty.eyebrow.conversation');\n    }\n  });\n\n  readonly emptyDescriptionPrefix = computed(() => {\n    switch (this.conversation().type) {\n      case 'private':\n        return this.translation.translateSync('@acorex:chat.empty.description.private-prefix');\n      case 'group':\n        return this.translation.translateSync('@acorex:chat.empty.description.group-prefix');\n      case 'channel':\n        return this.translation.translateSync('@acorex:chat.empty.description.channel-prefix');\n      case 'bot':\n        return this.translation.translateSync('@acorex:chat.empty.description.bot-prefix');\n      default:\n        return this.translation.translateSync('@acorex:chat.empty.description.conversation-prefix');\n    }\n  });\n}\n","    <div class=\"ax-message-empty\" role=\"status\" [attr.aria-label]=\"emptyAriaLabel()\">\n      <div class=\"ax-message-empty__ambient\" aria-hidden=\"true\">\n        <span class=\"ax-message-empty__grid\"></span>\n      </div>\n\n      <div class=\"ax-message-empty__card\">\n        <div class=\"ax-message-empty__icon-stack\">\n          <span class=\"ax-message-empty__pulse\" aria-hidden=\"true\"></span>\n          <div class=\"ax-message-empty__icon-bg\">\n            <i [class]=\"iconClass()\" aria-hidden=\"true\"></i>\n          </div>\n        </div>\n\n        <p class=\"ax-message-empty__eyebrow\">{{ eyebrowLabel() }}</p>\n        <h3 class=\"ax-message-empty__title\">{{ emptyTitle() }}</h3>\n        <p class=\"ax-message-empty__desc\">\n          {{ emptyDescriptionPrefix() }}\n          <span class=\"ax-message-empty__name\">{{ conversation().title }}</span\n          >.\n        </p>\n      </div>\n    </div>\n","import { AXTranslationService } from '@acorex/core/translation';\nimport { Component, ViewEncapsulation, inject } from '@angular/core';\n\n/** Default message list surface when no conversation is selected and no `ax-conversation-message-list-no-active` content is projected. */\n@Component({\n  selector: 'ax-conversation-message-list-no-active-default',\n  encapsulation: ViewEncapsulation.None,\n\n  imports: [],\n  host: {\n    class: 'ax-message-no-active-host',\n  },\n  templateUrl: './message-list-no-active-default.component.html',\n  styleUrl: './message-list-no-active-default.component.css',\n})\nexport class AXConversationMessageListNoActiveDefaultComponent {\n  private readonly translation = inject(AXTranslationService);\n\n  readonly noConversationAriaLabel = () =>\n    this.translation.translateSync('@acorex:chat.status.no-conversation-selected');\n  readonly inboxLabel = () => this.translation.translateSync('@acorex:chat.empty.inbox');\n  readonly noConversationOpenLabel = () => this.translation.translateSync('@acorex:chat.empty.no-conversation-open');\n  readonly noConversationDescription = () =>\n    this.translation.translateSync('@acorex:chat.empty.no-conversation-description');\n}\n","    <div class=\"ax-message-no-active\" role=\"status\" [attr.aria-label]=\"noConversationAriaLabel()\">\n      <div class=\"ax-message-no-active__ambient\" aria-hidden=\"true\">\n        <span class=\"ax-message-no-active__grid\"></span>\n      </div>\n\n      <div class=\"ax-message-no-active__card\">\n        <div class=\"ax-message-no-active__icon-stack\">\n          <span class=\"ax-message-no-active__pulse\" aria-hidden=\"true\"></span>\n          <div class=\"ax-message-no-active__icon-bg\">\n            <i class=\"fa-light fa-comments\" aria-hidden=\"true\"></i>\n          </div>\n        </div>\n\n        <p class=\"ax-message-no-active__eyebrow\">{{ inboxLabel() }}</p>\n        <h3 class=\"ax-message-no-active__title\">{{ noConversationOpenLabel() }}</h3>\n        <p class=\"ax-message-no-active__desc\">\n          {{ noConversationDescription() }}\n        </p>\n      </div>\n    </div>\n","import type { AXConversationMessageStatus } from '../../models';\n\nconst SVG_VIEW_BOX = '0 -960 960 960';\n\nconst PENDING_PATH =\n  'm612-292 56-56-148-148v-184h-80v216l172 172ZM480-80q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Z';\n\nconst CHECK_PATH = 'M382-240 154-468l57-57 171 171 367-367 57 57-424 424Z';\n\nconst DOUBLE_CHECK_PATH =\n  'M268-240 42-466l57-56 170 170 56 56-57 56Zm226 0L268-466l56-57 170 170 368-368 56 57-424 424Zm0-226-57-56 198-198 57 56-198 198Z';\n\nconst FAIL_PATH =\n  'M508.5-291.5Q520-303 520-320t-11.5-28.5Q497-360 480-360t-28.5 11.5Q440-337 440-320t11.5 28.5Q463-280 480-280t28.5-11.5ZM440-440h80v-240h-80v240Zm40 360q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Z';\n\n/** SVG path data for each message delivery status (from `utils/svgs/*.svg`). */\nexport const AX_CONVERSATION_MESSAGE_DELIVERY_STATUS_ICON_PATHS: Record<\n  AXConversationMessageStatus,\n  string\n> = {\n  sending: PENDING_PATH,\n  sent: CHECK_PATH,\n  delivered: DOUBLE_CHECK_PATH,\n  read: DOUBLE_CHECK_PATH,\n  failed: FAIL_PATH,\n};\n\nexport const AX_CONVERSATION_MESSAGE_DELIVERY_STATUS_ICON_VIEW_BOX = SVG_VIEW_BOX;\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport type { AXConversationMessageStatus } from '../../models';\nimport {\n  AX_CONVERSATION_MESSAGE_DELIVERY_STATUS_ICON_PATHS,\n  AX_CONVERSATION_MESSAGE_DELIVERY_STATUS_ICON_VIEW_BOX,\n} from '../../utils/svgs/message-delivery-status-icons';\n\n@Component({\n  selector: 'ax-conversation-message-delivery-status-icon',\n  template: `\n    @if (path(); as iconPath) {\n      <svg\n        class=\"ax-conversation-message-delivery-status-icon__svg\"\n        xmlns=\"http://www.w3.org/2000/svg\"\n        [attr.viewBox]=\"viewBox\"\n        aria-hidden=\"true\"\n      >\n        <path [attr.d]=\"iconPath\" fill=\"currentColor\" />\n      </svg>\n    }\n  `,\n  styles: `\n    :host {\n      display: inline-flex;\n      align-items: center;\n    }\n\n    .ax-conversation-message-delivery-status-icon__svg {\n      width: 1.125rem;\n      height: 1.125rem;\n    }\n  `,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AXConversationMessageDeliveryStatusIconComponent {\n  readonly status = input.required<AXConversationMessageStatus>();\n\n  protected readonly viewBox = AX_CONVERSATION_MESSAGE_DELIVERY_STATUS_ICON_VIEW_BOX;\n\n  protected readonly path = computed(() => AX_CONVERSATION_MESSAGE_DELIVERY_STATUS_ICON_PATHS[this.status()]);\n}\n","import type { AXPlacement } from '@acorex/cdk/common';\n\n/** Document / layout direction for reaction picker anchoring. */\nexport function isRtlDocument(document: Document): boolean {\n  const explicitDir =\n    document.documentElement.getAttribute('dir') ?? document.body?.getAttribute('dir');\n  if (explicitDir === 'rtl' || explicitDir === 'ltr') {\n    return explicitDir === 'rtl';\n  }\n  return getComputedStyle(document.documentElement).direction === 'rtl';\n}\n\n/** Matches `--ax-comp-message-list-adaptive-breakpoint` in message-list styles (52rem). */\nexport const MESSAGE_LIST_ADAPTIVE_BREAKPOINT_PX = 52 * 16;\n\n/**\n * Reaction button sits outside the bubble on inline-end (received) or inline-start (own ping-pong).\n * In adaptive wide layout all buttons sit on inline-end — use received placement rules.\n */\nexport function resolveReactionPickerPlacement(\n  isOwnMessage: boolean,\n  isRtl: boolean,\n  isAdaptiveWideLayout = false,\n): AXPlacement {\n  const ownsInPingPong = isOwnMessage && !isAdaptiveWideLayout;\n  const openTowardPhysicalStart = (!ownsInPingPong && !isRtl) || (ownsInPingPong && isRtl);\n  return openTowardPhysicalStart ? 'end-top' : 'start-top';\n}\n","/**\n * MessageList Component\n * Displays messages with virtual scrolling, date separators, and actions\n */\nimport type { AXPlacement } from '@acorex/cdk/common';\nimport { AXUploaderFileChangeEvent, AXUploaderZoneDirective } from '@acorex/cdk/uploader';\nimport { AXActionSheetService } from '@acorex/components/action-sheet';\nimport { AXFabComponent } from '@acorex/components/fab';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXLabelComponent } from '@acorex/components/label';\nimport { AXSkeletonComponent } from '@acorex/components/skeleton';\nimport {\n  AXContextMenuComponent,\n  AXContextMenuItemsClickEvent,\n  AXContextMenuOpeningEvent,\n  AXMenuItem,\n} from '@acorex/components/menu';\nimport { AXPopoverComponent } from '@acorex/components/popover';\nimport { AXToastService } from '@acorex/components/toast';\nimport { AXDateTimeModule } from '@acorex/core/date-time';\nimport { AXFileService } from '@acorex/core/file';\nimport { AXFormatModule } from '@acorex/core/format';\nimport { AXPlatform } from '@acorex/core/platform';\nimport { AXTranslationModule, AXTranslationService } from '@acorex/core/translation';\nimport { CommonModule, DOCUMENT } from '@angular/common';\nimport {\n  Component,\n  ElementRef,\n  ViewEncapsulation,\n  OnDestroy,\n  Type,\n  computed,\n  effect,\n  inject,\n  output,\n  signal,\n  untracked,\n  viewChild,\n} from '@angular/core';\nimport { AXConversationInfiniteScrollDirective } from '../../directives';\nimport { AXConversationMessage, AXConversationMessageListEmptyComponent } from '../../models';\nimport { AXConversationService } from '../../services';\nimport { AX_CONVERSATION_CONFIG } from '../../tokens';\nimport { AXConversationMessageUtilsService } from '../../utils/message-utils.service';\nimport { isConversationReactionsEnabled } from '../../utils/conversation-display.utils';\nimport { resolveMessageListBackgroundStyle, usesDefaultMessageListWallpaper } from '../../utils/message-list-background.utils';\nimport { AXConversationComposerService } from '../composer/composer.service';\nimport { AXConversationInfoBarService } from '../info-bar/info-bar.service';\nimport { AXConversationAvatarComponent } from '../shared/conversation-avatar.component';\nimport { AXConversationRegistryComponentOutletComponent } from '../shared/registry-component-outlet.component';\nimport { AXConversationMessageListEmptyDefaultComponent } from './message-list-empty-default.component';\nimport { AXConversationMessageListNoActiveDefaultComponent } from './message-list-no-active-default.component';\nimport { AXConversationMessageDeliveryStatusIconComponent } from './message-delivery-status-icon.component';\nimport { AXConversationMessageListService } from './message-list.service';\nimport {\n  MESSAGE_LIST_ADAPTIVE_BREAKPOINT_PX,\n  isRtlDocument,\n  resolveReactionPickerPlacement,\n} from './reaction-picker-placement';\n\n@Component({\n  selector: 'ax-conversation-message-list',\n  encapsulation: ViewEncapsulation.None,\n\n  imports: [\n    CommonModule,\n    AXFabComponent,\n    AXContextMenuComponent,\n    AXDecoratorModule,\n    AXLabelComponent,\n    AXSkeletonComponent,\n    AXFormatModule,\n    AXDateTimeModule,\n    AXPopoverComponent,\n    AXTranslationModule,\n    AXConversationInfiniteScrollDirective,\n    AXUploaderZoneDirective,\n    AXConversationAvatarComponent,\n    AXConversationRegistryComponentOutletComponent,\n    AXConversationMessageDeliveryStatusIconComponent,\n  ],\n  templateUrl: './message-list.component.html',\n  styleUrl: './message-list.component.css',\n})\nexport class AXConversationMessageListComponent implements OnDestroy {\n  private readonly conversationService = inject(AXConversationService);\n  private readonly messageListService = inject(AXConversationMessageListService);\n  private readonly composerService = inject(AXConversationComposerService);\n  private readonly fileService = inject(AXFileService);\n  private readonly toast = inject(AXToastService);\n  private readonly infoBarService = inject(AXConversationInfoBarService);\n  private readonly translation = inject(AXTranslationService);\n  private readonly document = inject(DOCUMENT);\n  private readonly platform = inject(AXPlatform);\n  private readonly actionSheetService = inject(AXActionSheetService);\n  protected readonly config = inject(AX_CONVERSATION_CONFIG);\n\n  /**\n   * Background for the message list scroll area from config, or the built-in soft wash when unset/empty.\n   * Set `messageListBackground` to `transparent` or `none` for a flat look.\n   * Supports `{ light, dark }` for theme-specific backgrounds.\n   */\n  readonly messageListUsesDefaultWallpaper = computed(() => {\n    const conversationBackground = this.activeConversation()?.metadata?.['messageListBackground'];\n    const source = conversationBackground ?? this.config.messageListBackground;\n    return usesDefaultMessageListWallpaper(source);\n  });\n\n  readonly messageListWallpaperDark = computed(() => {\n    this.platform.themeMode();\n    return this.platform.isDark();\n  });\n\n  readonly messageListBackgroundStyle = computed(() => {\n    this.platform.themeMode();\n    const isDark = this.platform.isDark();\n    const conversationBackground = this.activeConversation()?.metadata?.['messageListBackground'];\n    const source = conversationBackground ?? this.config.messageListBackground;\n    return resolveMessageListBackgroundStyle(source, isDark);\n  });\n\n  resolvedEmptyStateComponent(): Type<AXConversationMessageListEmptyComponent> {\n    const fromMetadata = this.activeConversation()?.metadata?.['messageListEmptyComponent'];\n    if (typeof fromMetadata === 'function') {\n      return fromMetadata as Type<AXConversationMessageListEmptyComponent>;\n    }\n    return AXConversationMessageListEmptyDefaultComponent;\n  }\n\n  /** Fallback when no conversation is active and no `ax-conversation-message-list-no-active` content is projected. */\n  protected readonly noActiveFallbackComponent = AXConversationMessageListNoActiveDefaultComponent;\n\n  // Timeout cleanup to prevent memory leaks\n  private readonly timeouts = new Set<number>();\n\n  // Reaction picker state\n  readonly reactionPickerTarget = signal<string | null>(null);\n  readonly reactionPickerElement = signal<HTMLElement | null>(null);\n  readonly reactionPickerPlacement = signal<AXPlacement>('end-top');\n  readonly reactionPopover = viewChild<any>('reactionPopover');\n\n  /** Message id whose context menu is open (for active row styling). */\n  readonly contextMenuMessageId = signal<string | null>(null);\n\n  /** True while files are dragged over the message list drop zone. */\n  readonly messageListDragging = signal(false);\n\n  /** True when the message list uses single-column adaptive layout (matches CSS container query). */\n  readonly isAdaptiveWideLayout = signal(false);\n\n  /** While true, older history is being prepended — do not auto-scroll to the latest message. */\n  private restoringScrollAfterPrepend = false;\n\n  private adaptiveLayoutResizeObserver?: ResizeObserver;\n\n  // Available reaction emojis from API (loaded lazily when picker opens)\n  readonly availableReactions = signal<string[]>([]);\n  private reactionsLoading = false;\n\n  // Access registry through conversation service\n  private get registry() {\n    return this.conversationService.registry;\n  }\n\n  /** Message list element reference */\n  private readonly messageListRef = viewChild<ElementRef>('messageList');\n\n  /** Messages container element reference */\n  private readonly messagesContainerRef = viewChild<ElementRef<HTMLDivElement>>('messagesContainer');\n\n  /** Loading state - use service */\n  readonly loading = this.messageListService.loading;\n\n  /** Loading more messages state - use service */\n  readonly loadingMore = this.messageListService.loadingMore;\n\n  /** Whether older messages remain on the server */\n  readonly hasMoreMessages = this.messageListService.hasMoreMessages;\n\n  /** Show scroll to bottom button - use service */\n  readonly showScrollButton = this.messageListService.showScrollButton;\n\n  /** Active conversation */\n  readonly activeConversation = this.conversationService.activeConversation;\n\n  readonly isGroupConversation = computed(() => this.activeConversation()?.type === 'group');\n\n  /** Placeholder indices for the initial message list skeleton. */\n  protected readonly loadingSkeletonItems = [0, 1, 2, 3, 4, 5] as const;\n\n  /** Whether the active conversation allows message reactions. */\n  readonly reactionsEnabled = computed(() => isConversationReactionsEnabled(this.activeConversation()));\n\n  /** Messages */\n  readonly messages = this.conversationService.activeMessages;\n\n  /** Message action event */\n  readonly messageAction = output<{ message: AXConversationMessage; action: string }>();\n\n  /** Current user from service */\n  readonly currentUser = this.conversationService.currentUser;\n\n  /** Message grouped by date - use service */\n  readonly messageGroups = this.messageListService.messageGroups;\n\n  constructor() {\n    void this.conversationService.ensureInitialized();\n\n    effect((onCleanup) => {\n      const el = this.messageListRef()?.nativeElement;\n      if (!el || typeof ResizeObserver === 'undefined') {\n        this.isAdaptiveWideLayout.set(false);\n        return;\n      }\n\n      const updateAdaptiveLayout = (): void => {\n        this.isAdaptiveWideLayout.set(el.clientWidth >= MESSAGE_LIST_ADAPTIVE_BREAKPOINT_PX);\n      };\n\n      updateAdaptiveLayout();\n      const observer = new ResizeObserver(() => updateAdaptiveLayout());\n      observer.observe(el);\n      this.adaptiveLayoutResizeObserver = observer;\n      onCleanup(() => {\n        observer.disconnect();\n        this.adaptiveLayoutResizeObserver = undefined;\n      });\n    });\n\n    // Close reaction picker when clicking outside\n    if (typeof document !== 'undefined') {\n      document.addEventListener('click', (e) => {\n        const target = e.target as HTMLElement;\n        if (\n          target.closest('.message-reactions-container') ||\n          target.closest('.add-reaction-button') ||\n          target.closest('.reaction-picker-popup')\n        ) {\n          return;\n        }\n        this.closeReactionPicker();\n      });\n    }\n\n    // Track previous conversation ID to detect actual conversation switches\n    let previousConversationId: string | null = null;\n\n    // Scroll to bottom only when conversation ID changes (switching conversations)\n    // Use untracked() to avoid triggering on conversation object updates\n    effect(() => {\n      const conversation = this.activeConversation();\n      const currentConversationId = conversation?.id || null;\n\n      // Use untracked to get previous ID without creating dependency\n      untracked(() => {\n        if (currentConversationId !== previousConversationId) {\n          this.contextMenuMessageId.set(null);\n          this.closeReactionPicker();\n          this.observedReadMessageIds.clear();\n          this.composerService.onConversationChanged(previousConversationId, currentConversationId);\n          this.infoBarService.onConversationChanged();\n        }\n        // Only scroll if the conversation ID actually changed (not just updated)\n        if (currentConversationId && currentConversationId !== previousConversationId) {\n          // Reset pagination state for new conversation\n          this.messageListService.resetPagination();\n\n          // Wait until the messages branch mounts (#messagesContainer) after loading, then scroll\n          // after layout — avoids no-op scroll during loading and jitter vs the surface enter animation.\n          queueMicrotask(() => this.scrollToBottomWhenContainerReady());\n        }\n\n        // Update previous ID\n        previousConversationId = currentConversationId;\n      });\n    });\n\n    // Auto-scroll only when new messages are appended at the bottom (not when loading older history above).\n    let previousMessageCount = 0;\n    let previousLastMessageId: string | null = null;\n    let previousConversationIdForScroll: string | null = null;\n\n    effect(() => {\n      const messages = this.messages();\n      const conversation = this.activeConversation();\n      const conversationId = conversation?.id ?? null;\n      const container = this.messagesContainerRef()?.nativeElement;\n      const currentUser = this.currentUser();\n      const currentCount = messages.length;\n      const currentLastId = messages.at(-1)?.id ?? null;\n\n      if (conversationId !== previousConversationIdForScroll) {\n        previousConversationIdForScroll = conversationId;\n        previousMessageCount = currentCount;\n        previousLastMessageId = currentLastId;\n        return;\n      }\n\n      if (!container || !conversation || this.restoringScrollAfterPrepend) {\n        previousMessageCount = currentCount;\n        previousLastMessageId = currentLastId;\n        return;\n      }\n\n      const appendedAtBottom =\n        currentCount > previousMessageCount &&\n        previousLastMessageId !== null &&\n        currentLastId !== previousLastMessageId;\n\n      if (appendedAtBottom) {\n        const newestMessage = messages[messages.length - 1];\n        const isOwnMessage = !!currentUser && newestMessage?.senderId === currentUser.id;\n\n        if (isOwnMessage) {\n          requestAnimationFrame(() => {\n            requestAnimationFrame(() => {\n              container.scrollTo({ top: container.scrollHeight, behavior: 'smooth' });\n            });\n          });\n        } else {\n          const { scrollTop, scrollHeight, clientHeight } = container;\n          const distanceFromBottom = scrollHeight - scrollTop - clientHeight;\n          const isAtBottom = distanceFromBottom < this.config.scrollThreshold;\n\n          if (isAtBottom) {\n            requestAnimationFrame(() => {\n              requestAnimationFrame(() => {\n                container.scrollTo({ top: container.scrollHeight, behavior: 'smooth' });\n              });\n            });\n          }\n        }\n      }\n\n      previousMessageCount = currentCount;\n      previousLastMessageId = currentLastId;\n    });\n\n    // Setup intersection observer for marking messages as read\n    this.setupIntersectionObserver();\n\n    // Scroll to bottom when an external scroll request is issued (e.g., after sending a message)\n    let initialScrollRequest = true;\n    effect(() => {\n      void this.messageListService.scrollRequests();\n      if (initialScrollRequest) {\n        initialScrollRequest = false;\n        return;\n      }\n      // Wait for DOM to render the new message before scrolling\n      requestAnimationFrame(() => {\n        requestAnimationFrame(() => {\n          this.scrollToBottom(false);\n        });\n      });\n    });\n  }\n\n  private intersectionObserver?: IntersectionObserver;\n  private readonly readIntersectionObserver = signal<IntersectionObserver | null>(null);\n  private readonly observedReadMessageIds = new Set<string>();\n\n  /**\n   * Setup intersection observer to mark messages as read when visible\n   */\n  private setupIntersectionObserver(): void {\n    effect((onCleanup) => {\n      const container = this.messagesContainerRef()?.nativeElement;\n      if (!container) {\n        this.readIntersectionObserver.set(null);\n        return;\n      }\n\n      const observer = new IntersectionObserver(\n        (entries) => {\n          entries.forEach((entry) => {\n            if (entry.isIntersecting) {\n              const messageId = entry.target.getAttribute('data-message-id');\n              if (messageId) {\n                this.markMessageAsRead(messageId);\n              }\n            }\n          });\n        },\n        {\n          root: container,\n          threshold: this.config.messageReadThreshold,\n        },\n      );\n\n      this.intersectionObserver = observer;\n      this.readIntersectionObserver.set(observer);\n\n      onCleanup(() => {\n        observer.disconnect();\n        this.intersectionObserver = undefined;\n        this.readIntersectionObserver.set(null);\n        this.observedReadMessageIds.clear();\n      });\n    });\n\n    effect((onCleanup) => {\n      const observer = this.readIntersectionObserver();\n      const messages = this.messages();\n      const currentUser = this.currentUser();\n      const container = this.messagesContainerRef()?.nativeElement;\n\n      if (!observer || !container || !currentUser) {\n        return;\n      }\n\n      const unreadMessages = messages.filter((m) => m.status !== 'read' && m.senderId !== currentUser.id);\n      const timeoutId = window.setTimeout(() => {\n        for (const msg of unreadMessages) {\n          if (this.observedReadMessageIds.has(msg.id)) {\n            continue;\n          }\n          const element = container.querySelector(`[data-message-id=\"${msg.id}\"]`);\n          if (element) {\n            observer.observe(element);\n            this.observedReadMessageIds.add(msg.id);\n          }\n        }\n      }, 100);\n\n      onCleanup(() => clearTimeout(timeoutId));\n    });\n  }\n\n  /**\n   * Mark message as read\n   */\n  private markMessageAsRead(messageId: string): void {\n    const message = this.messages().find((m) => m.id === messageId);\n    if (!message || message.status === 'read') return;\n\n    if (this.config.markConversationReadOnSelect) {\n      const conversation = this.activeConversation();\n      if (conversation && conversation.unreadCount > 0) {\n        return;\n      }\n    }\n\n    // Update message status (batched API sync via conversation service)\n    this.conversationService.queueMessageAsRead(messageId);\n    this.observedReadMessageIds.delete(messageId);\n\n    const container = this.messagesContainerRef()?.nativeElement;\n    const element = container?.querySelector(`[data-message-id=\"${messageId}\"]`);\n    if (element && this.intersectionObserver) {\n      this.intersectionObserver.unobserve(element);\n    }\n  }\n\n  // Date grouping methods moved to service\n\n  /** Get message CSS classes */\n  getMessageClasses(message: AXConversationMessage): string {\n    const classes = ['message-item'];\n    if (this.isOwnMessage(message)) {\n      classes.push('message-own');\n    }\n    if (this.contextMenuMessageId() === message.id) {\n      classes.push('message-item-context-active');\n    }\n    return classes.join(' ');\n  }\n\n  /** Get bubble CSS classes */\n  getBubbleClasses(message: AXConversationMessage): string {\n    const classes = ['message-bubble'];\n    if (message.type === 'system') {\n      classes.push('message-system');\n    }\n    return classes.join(' ');\n  }\n\n  /** Check if message is from current user */\n  isOwnMessage(message: AXConversationMessage): boolean {\n    const user = this.currentUser();\n    if (!user) return false;\n    return AXConversationMessageUtilsService.isOwnMessage(message, user.id);\n  }\n\n  /** Whether the avatar slot is rendered (visibility is CSS-controlled per layout mode). */\n  shouldRenderAvatar(message: AXConversationMessage): boolean {\n    return message.type !== 'system';\n  }\n\n  /** Should show sender name */\n  shouldShowSenderName(message: AXConversationMessage): boolean {\n    const conversation = this.activeConversation();\n    return conversation?.type === 'group' && !this.isOwnMessage(message);\n  }\n\n  /** Get sender name */\n  getSenderName(message: AXConversationMessage): string {\n    const conversation = this.activeConversation();\n    if (!conversation) return this.translation.translateSync('@acorex:chat.fallbacks.unknown-user');\n    return AXConversationMessageUtilsService.getSenderName(message, conversation);\n  }\n\n  /** Get original sender name for forwarded messages */\n  getOriginalSenderName(message: AXConversationMessage): string {\n    // Use new forwardedFrom object if available\n    if (message.forwardedFrom) {\n      return message.forwardedFrom.senderName;\n    }\n\n    // Fallback to old method for backward compatibility\n    const conversation = this.activeConversation();\n    if (!conversation || !message.forwardedFrom) {\n      return this.translation.translateSync('@acorex:chat.fallbacks.unknown-user');\n    }\n\n    const participant = conversation.participants.find((p) => p.id === message.forwardedFrom.senderId);\n    return participant?.name || this.translation.translateSync('@acorex:chat.fallbacks.unknown-user');\n  }\n\n  /** Get forwarded text with sender and conversation info */\n  getForwardedText(message: AXConversationMessage): string {\n    if (!message.forwardedFrom) {\n      return this.translation.translateSync('@acorex:chat.forwarded.from', {\n        params: { senderName: this.getOriginalSenderName(message) },\n      });\n    }\n\n    const senderName = message.forwardedFrom.senderName;\n    const conversationTitle = message.forwardedFrom.conversationTitle;\n\n    // If conversation title exists and is different from sender name, show both\n    if (conversationTitle && conversationTitle !== senderName) {\n      return this.translation.translateSync('@acorex:chat.forwarded.from-with-conversation', {\n        params: { senderName, conversationTitle },\n      });\n    }\n    // Otherwise just show sender name\n    return this.translation.translateSync('@acorex:chat.forwarded.from', { params: { senderName } });\n  }\n\n  /** Resolve renderer component for message */\n  getRendererComponent(message: AXConversationMessage) {\n    const renderer = this.registry.messageRenderers.getRenderer(message);\n    if (!renderer) {\n      console.warn('No renderer found for message type:', message.type, 'Using fallback');\n    }\n    return renderer?.component;\n  }\n\n  /** Resolve lazy renderer loader for message */\n  private static readonly fallbackRendererLoader = () =>\n    import('../../plugins/message-list/components/fallback-renderer/fallback-renderer.component').then(\n      (m) => m.AXConversationFallbackRendererComponent,\n    );\n\n  getRendererComponentLoader(message: AXConversationMessage) {\n    const renderer = this.registry.messageRenderers.getRenderer(message);\n    if (renderer?.componentLoader) {\n      return renderer.componentLoader;\n    }\n    if (!renderer || !renderer.component) {\n      return AXConversationMessageListComponent.fallbackRendererLoader;\n    }\n    return undefined;\n  }\n\n  /** Provide inputs for the dynamic renderer */\n  getRendererInputs(message: AXConversationMessage) {\n    return { message };\n  }\n\n  /** Get status icon CSS classes */\n  getStatusIconClasses(message: AXConversationMessage): string {\n    const classes = ['status-icon'];\n    if (message.status === 'read') {\n      classes.push('status-read');\n    } else if (message.status === 'failed') {\n      classes.push('status-failed');\n    }\n    return classes.join(' ');\n  }\n\n  /** Get status tooltip text */\n  getStatusTooltip(message: AXConversationMessage): string {\n    switch (message.status) {\n      case 'sending':\n        return this.translation.translateSync('@acorex:chat.status.sending');\n      case 'sent':\n        return this.translation.translateSync('@acorex:chat.status.sent');\n      case 'delivered':\n        return this.translation.translateSync('@acorex:chat.status.delivered');\n      case 'read':\n        return this.translation.translateSync('@acorex:chat.status.read');\n      case 'failed':\n        return this.translation.translateSync('@acorex:chat.status.failed-to-send');\n      default:\n        return '';\n    }\n  }\n\n  /** Get first unread message ID */\n  readonly firstUnreadMessageId = computed(() => {\n    const messages = this.messages();\n    const currentUser = this.currentUser();\n    if (!currentUser) return null;\n\n    // Find first message that is not read and not sent by current user\n    const firstUnread = messages.find((m) => m.status !== 'read' && m.senderId !== currentUser.id);\n\n    return firstUnread?.id ?? null;\n  });\n\n  /** Get grouped reactions */\n  getGroupedReactions(\n    message: AXConversationMessage,\n  ): Array<{ emoji: string; count: number; userIds: string[]; hasReacted: boolean }> {\n    const user = this.currentUser();\n    const grouped = new Map<string, { count: number; userIds: string[]; hasReacted: boolean }>();\n\n    message.reactions.forEach((reaction) => {\n      if (!grouped.has(reaction.emoji)) {\n        grouped.set(reaction.emoji, { count: 0, userIds: [], hasReacted: false });\n      }\n      const group = grouped.get(reaction.emoji);\n      if (group) {\n        group.count++;\n        group.userIds.push(reaction.userId);\n        if (user && reaction.userId === user.id) {\n          group.hasReacted = true;\n        }\n      }\n    });\n\n    return Array.from(grouped.entries()).map(([emoji, data]) => ({\n      emoji,\n      ...data,\n    }));\n  }\n\n  /** Get reaction tooltip text */\n  getReactionTooltip(reaction: { emoji: string; count: number; userIds: string[]; hasReacted: boolean }): string {\n    if (reaction.count === 1) {\n      return reaction.userIds[0];\n    }\n    if (reaction.count <= 3) {\n      return reaction.userIds.join(', ');\n    }\n    return `${reaction.userIds.slice(0, 3).join(', ')} and ${reaction.count - 3} more`;\n  }\n\n  /** Whether reactions can be shown or added for a message in the active conversation. */\n  messageSupportsReactions(message: AXConversationMessage): boolean {\n    if (!this.reactionsEnabled()) {\n      return false;\n    }\n\n    return this.registry.messageRenderers.getRenderer(message)?.capabilities.supportsReactions ?? false;\n  }\n\n  /** Toggle reaction picker */\n  toggleReactionPicker(message: AXConversationMessage, event: MouseEvent): void {\n    if (!this.messageSupportsReactions(message)) {\n      return;\n    }\n    const button = (event.currentTarget as HTMLElement) ?? (event.target as HTMLElement).closest('button');\n    if (!button) {\n      return;\n    }\n\n    if (this.reactionPickerTarget() === message.id) {\n      this.closeReactionPicker();\n      return;\n    }\n\n    void this.ensureAvailableReactions();\n\n    const isRtl = isRtlDocument(this.document);\n    this.reactionPickerPlacement.set(\n      resolveReactionPickerPlacement(this.isOwnMessage(message), isRtl, this.isAdaptiveWideLayout()),\n    );\n    this.reactionPickerElement.set(button);\n    this.reactionPickerTarget.set(message.id);\n\n    setTimeout(() => {\n      this.reactionPopover()?.open();\n    });\n  }\n\n  /** Close reaction picker */\n  closeReactionPicker(): void {\n    this.reactionPopover()?.close();\n    this.reactionPickerTarget.set(null);\n    this.reactionPickerElement.set(null);\n  }\n\n  /** Check if current user has reacted with specific emoji */\n  hasUserReacted(message: AXConversationMessage, emoji: string): boolean {\n    const user = this.currentUser();\n    if (!user) return false;\n    return message.reactions.some((r) => r.emoji === emoji && r.userId === user.id);\n  }\n\n  /** Check if current user has reacted with specific emoji by message ID */\n  hasUserReactedById(messageId: string, emoji: string): boolean {\n    const message = this.getMessageById(messageId);\n    if (!message) return false;\n    return this.hasUserReacted(message, emoji);\n  }\n\n  /** Handle reaction click by message ID */\n  onReactionClickById(messageId: string, emoji: string): void {\n    const message = this.getMessageById(messageId);\n    if (message) {\n      this.onReactionClick(message, emoji);\n    }\n  }\n\n  /** Get message by ID */\n  getMessageById(messageId: string): AXConversationMessage | undefined {\n    const messages = this.messages();\n    return messages.find((m) => m.id === messageId);\n  }\n\n  /** Load available reactions when the picker is opened (session-cached in service). */\n  private async ensureAvailableReactions(): Promise<void> {\n    if (this.availableReactions().length > 0 || this.reactionsLoading) {\n      return;\n    }\n\n    this.reactionsLoading = true;\n    try {\n      const reactions = await this.conversationService.getAvailableReactions();\n      this.availableReactions.set(reactions);\n    } catch (error) {\n      console.error('Failed to load available reactions:', error);\n    } finally {\n      this.reactionsLoading = false;\n    }\n  }\n\n  /** Get message actions from registry */\n  getMessageActions(message: AXConversationMessage) {\n    return this.messageListService.getMenuActions(message);\n  }\n\n  /** Handle reaction click */\n  onReactionClick(message: AXConversationMessage, emoji: string): void {\n    if (!this.messageSupportsReactions(message)) {\n      return;\n    }\n\n    this.messageListService.reactToMessage(message.id, emoji);\n  }\n\n  /** Handle message action */\n  async onMessageAction(message: AXConversationMessage, action: any): Promise<void> {\n    await this.messageListService.executeAction(message, action.id);\n\n    // Emit event for parent component\n    this.messageAction.emit({ message, action: action.id });\n  }\n\n  /** Handle scroll events */\n  onScroll(event: Event): void {\n    const element = event.target as HTMLElement;\n    const isNearBottom = this.isUserNearBottom(element);\n    this.showScrollButton.set(!isNearBottom);\n  }\n\n  /** Handle infinite scroll threshold */\n  async onScrollThreshold(edge: 'top' | 'bottom'): Promise<void> {\n    if (edge === 'top' && this.hasMoreMessages()) {\n      await this.loadOlderMessages();\n    }\n  }\n\n  /** Load older messages - delegate to service and preserve scroll anchor */\n  private async loadOlderMessages(): Promise<void> {\n    const container = this.messagesContainerRef()?.nativeElement;\n    if (!container || !this.hasMoreMessages()) {\n      return;\n    }\n\n    const anchorMessageId = this.messages()[0]?.id;\n    const anchorEl = anchorMessageId ? document.getElementById(`message-${anchorMessageId}`) : null;\n    const containerTop = container.getBoundingClientRect().top;\n    const anchorOffsetFromViewportTop = anchorEl ? anchorEl.getBoundingClientRect().top - containerTop : null;\n\n    const fallbackScrollTop = container.scrollTop;\n    const fallbackScrollHeight = container.scrollHeight;\n\n    this.restoringScrollAfterPrepend = true;\n    const loaded = await this.messageListService.loadMoreMessages();\n    if (!loaded) {\n      this.restoringScrollAfterPrepend = false;\n      return;\n    }\n\n    this.restoreScrollPositionAfterPrepend(container, {\n      anchorMessageId,\n      anchorOffsetFromViewportTop,\n      fallbackScrollTop,\n      fallbackScrollHeight,\n    });\n  }\n\n  /**\n   * Keep the user's viewport on the same messages after older rows are inserted above.\n   */\n  private restoreScrollPositionAfterPrepend(\n    container: HTMLElement,\n    ctx: {\n      anchorMessageId?: string;\n      anchorOffsetFromViewportTop: number | null;\n      fallbackScrollTop: number;\n      fallbackScrollHeight: number;\n    },\n  ): void {\n    const apply = (): void => {\n      if (ctx.anchorMessageId && ctx.anchorOffsetFromViewportTop != null) {\n        const anchor = document.getElementById(`message-${ctx.anchorMessageId}`);\n        if (anchor) {\n          const containerTop = container.getBoundingClientRect().top;\n          const currentOffset = anchor.getBoundingClientRect().top - containerTop;\n          container.scrollTop += currentOffset - ctx.anchorOffsetFromViewportTop;\n          return;\n        }\n      }\n\n      const heightDifference = container.scrollHeight - ctx.fallbackScrollHeight;\n      container.scrollTop = ctx.fallbackScrollTop + heightDifference;\n    };\n\n    requestAnimationFrame(() => {\n      requestAnimationFrame(() => {\n        apply();\n        requestAnimationFrame(() => {\n          apply();\n          this.restoringScrollAfterPrepend = false;\n        });\n      });\n    });\n  }\n\n  /** Check if user is near bottom of scroll */\n  private isUserNearBottom(element?: HTMLElement): boolean {\n    const container = element || this.messagesContainerRef()?.nativeElement;\n    if (!container) return false;\n\n    const scrollTop = container.scrollTop;\n    const scrollHeight = container.scrollHeight;\n    const clientHeight = container.clientHeight;\n\n    const isNearBottom = scrollHeight - scrollTop - clientHeight < this.config.scrollThreshold;\n    return isNearBottom;\n  }\n\n  /**\n   * After switching chats, the template may still show loading (no #messagesContainer).\n   * Poll with rAF until the feed exists, then scroll after double rAF so scrollHeight is stable.\n   */\n  private scrollToBottomWhenContainerReady(): void {\n    const maxAttempts = 120;\n    let attempts = 0;\n    const tick = (): void => {\n      const el = this.messagesContainerRef()?.nativeElement;\n      if (el) {\n        requestAnimationFrame(() => {\n          requestAnimationFrame(() => {\n            this.scrollToBottom(false);\n          });\n        });\n        return;\n      }\n      if (++attempts < maxAttempts) {\n        requestAnimationFrame(tick);\n      }\n    };\n    requestAnimationFrame(tick);\n  }\n\n  /** Scroll to bottom */\n  scrollToBottom(smooth = true): void {\n    const element = this.messagesContainerRef()?.nativeElement;\n    if (element) {\n      element.scrollTo({\n        top: element.scrollHeight,\n        behavior: smooth ? 'smooth' : 'auto',\n      });\n      // Hide button when manually scrolling to bottom\n      this.showScrollButton.set(false);\n    }\n  }\n\n  /** Scroll to specific message */\n  scrollToMessage(messageId: string): void {\n    const messageElement = document.getElementById(`message-${messageId}`);\n    if (messageElement) {\n      messageElement.scrollIntoView({ behavior: 'smooth', block: 'center' });\n\n      // Highlight the message briefly\n      messageElement.classList.add('message-highlight');\n      const timeout = window.setTimeout(() => {\n        messageElement.classList.remove('message-highlight');\n        this.timeouts.delete(timeout);\n      }, this.config.messageHighlightDuration);\n      this.timeouts.add(timeout);\n    }\n  }\n\n  /** Cleanup timeouts and observers on destroy */\n  ngOnDestroy(): void {\n    // Disconnect intersection observer\n    if (this.intersectionObserver) {\n      this.intersectionObserver.disconnect();\n      this.intersectionObserver = undefined;\n    }\n\n    this.adaptiveLayoutResizeObserver?.disconnect();\n    this.adaptiveLayoutResizeObserver = undefined;\n\n    // Clear timeouts\n    this.timeouts.forEach((t) => clearTimeout(t));\n    this.timeouts.clear();\n  }\n\n  /** Get message preview text for reply */\n  getMessagePreviewText(message: AXConversationMessage): { value: string; type: string; icon: string } {\n    return AXConversationMessageUtilsService.getPreviewText(message, 50);\n  }\n\n  /** Get ARIA label for message */\n  getMessageAriaLabel(message: AXConversationMessage): string {\n    const sender = this.getSenderName(message);\n    const time = message.timestamp.toLocaleTimeString();\n    const isOwn = this.isOwnMessage(message);\n    const prefix = isOwn ? this.translation.translateSync('@acorex:chat.fallbacks.you') : sender;\n    const preview = AXConversationMessageUtilsService.getPreviewText(message, 100);\n    const text = preview.type === 'text' ? preview.value : `[${preview.type}]`;\n    const status = message.status ? `, ${message.status}` : '';\n    return this.translation.translateSync('@acorex:chat.aria.message-label', {\n      params: { prefix, time, text, status },\n    });\n  }\n\n  getDateSeparatorAriaLabel(dateLabel: string): string {\n    return this.translation.translateSync('@acorex:chat.aria.messages-from-date', {\n      params: { date: dateLabel },\n    });\n  }\n\n  getReplyCount(message: AXConversationMessage): number {\n    return this.messageListService.getReplyCount(message.id);\n  }\n\n  getForwardCount(message: AXConversationMessage): number {\n    return this.messageListService.getForwardCount(message.id);\n  }\n\n  onMessageListDragEnter(): void {\n    this.messageListDragging.set(true);\n  }\n\n  onMessageListDragLeave(): void {\n    this.messageListDragging.set(false);\n  }\n\n  /** Open the matching composer picker popup when files are dropped on the message list. */\n  async onMessageListFilesDropped(event: AXUploaderFileChangeEvent): Promise<void> {\n    this.messageListDragging.set(false);\n    const { openComposerPickerForFiles } = await import('./open-composer-picker-for-files');\n    await openComposerPickerForFiles(this.composerPickerDeps(), event.files);\n  }\n\n  private composerPickerDeps() {\n    return {\n      fileService: this.fileService,\n      composerService: this.composerService,\n      composerActionRegistry: this.registry.composerActions,\n      popupService: this.conversationService.popupService,\n      actionSheetService: this.actionSheetService,\n      platform: this.platform,\n      toast: this.toast,\n      translation: this.translation,\n      conversation: this.activeConversation(),\n      config: this.config,\n    };\n  }\n\n  /** Handle context menu opening for messages */\n  handleMessageContextMenuOpening(event: AXContextMenuOpeningEvent, message: AXConversationMessage): void {\n    this.contextMenuMessageId.set(message.id);\n    const actions = this.getMessageActions(message);\n    const currentUser = this.currentUser();\n\n    if (!currentUser) return;\n\n    // Convert message actions to context menu items\n    const menuItems: AXMenuItem[] = actions.map((action) => ({\n      text: this.registry.messageActions.getActionLabel(action),\n      suffix: action.shortcut ? { text: action.shortcut } : undefined,\n      icon: action.icon,\n      color: action.destructive ? 'danger' : undefined,\n      disabled: !this.registry.messageActions.isActionEnabled(action, message, currentUser),\n      data: action, // Store original action for later use\n    }));\n\n    event.items.push(...menuItems);\n  }\n\n  /** Handle context menu item click for messages */\n  handleMessageContextMenuItemClick(event: AXContextMenuItemsClickEvent, message: AXConversationMessage): void {\n    this.contextMenuMessageId.set(null);\n    const action = event.item.data;\n    if (action) {\n      // Execute the action using message list service\n      this.messageListService.executeAction(message, action.id);\n\n      // Emit event for parent component\n      this.messageAction.emit({ message, action: action.id });\n    }\n  }\n}\n","@if (activeConversation(); as conv) {\n  @if (conv.id) {\n    <div\n      class=\"message-list message-list--conversation-surface\"\n      [class.message-list--group]=\"isGroupConversation()\"\n      [class.message-list--drag]=\"messageListDragging()\"\n      [class.message-list--default-wallpaper]=\"messageListUsesDefaultWallpaper()\"\n      [class.message-list--wallpaper-light]=\"messageListUsesDefaultWallpaper() && !messageListWallpaperDark()\"\n      [class.message-list--wallpaper-dark]=\"messageListUsesDefaultWallpaper() && messageListWallpaperDark()\"\n      #messageList\n      role=\"log\"\n      [attr.aria-label]=\"'@acorex:chat.aria.message-list' | translate | async\"\n      aria-live=\"polite\"\n      [style.background]=\"messageListBackgroundStyle()\"\n      [style.--ax-comp-message-list-surface-bg]=\"messageListBackgroundStyle()\"\n      axUploaderZone\n      [disableBrowse]=\"true\"\n      (dragEnter)=\"onMessageListDragEnter()\"\n      (dragLeave)=\"onMessageListDragLeave()\"\n      (fileChange)=\"onMessageListFilesDropped($event)\"\n    >\n      @if (loading()) {\n        <div\n          class=\"list-loading\"\n          role=\"status\"\n          aria-busy=\"true\"\n          [attr.aria-label]=\"'@acorex:chat.status.loading-messages' | translate | async\"\n        >\n          <div class=\"messages-skeleton\" aria-hidden=\"true\">\n            @for (item of loadingSkeletonItems; track item) {\n              <div class=\"message-skeleton\" [class.message-skeleton--own]=\"$odd\">\n                <ax-skeleton class=\"message-skeleton-avatar\" [animated]=\"true\"></ax-skeleton>\n                <ax-skeleton\n                  class=\"message-skeleton-bubble\"\n                  [class.message-skeleton-bubble--short]=\"$index % 3 === 1\"\n                  [class.message-skeleton-bubble--medium]=\"$index % 3 === 2\"\n                  [animated]=\"true\"\n                ></ax-skeleton>\n              </div>\n            }\n          </div>\n        </div>\n      } @else if (messages().length === 0) {\n        <div class=\"list-empty\" role=\"status\" [attr.aria-label]=\"'@acorex:chat.status.no-messages' | translate | async\">\n          <ng-content select=\"ax-conversation-message-list-empty, [ax-conversation-message-list-empty]\">\n            <ng-container\n              *ngComponentOutlet=\"resolvedEmptyStateComponent(); inputs: { conversation: activeConversation()! }\"\n            ></ng-container>\n          </ng-content>\n        </div>\n      } @else {\n        <div\n          class=\"messages-container\"\n          (scroll)=\"onScroll($event)\"\n          axInfiniteScroll\n          [threshold]=\"config.infiniteScrollThreshold\"\n          [edge]=\"'top'\"\n          [scrollDisabled]=\"loading() || loadingMore() || !hasMoreMessages()\"\n          (scrollThreshold)=\"onScrollThreshold($event)\"\n          #messagesContainer\n          role=\"feed\"\n          [attr.aria-label]=\"'@acorex:chat.aria.messages' | translate | async\"\n        >\n          <div class=\"messages-feed\">\n          @if (loadingMore()) {\n            <div\n              class=\"list-loading-more list-loading-more--prepend\"\n              role=\"status\"\n              animate.enter=\"load-more-enter\"\n              animate.leave=\"load-more-leave\"\n              [attr.aria-label]=\"'@acorex:chat.status.loading-older-messages' | translate | async\"\n            >\n              <div class=\"load-more-indicator\" aria-hidden=\"true\">\n                <span class=\"load-more-dot\"></span>\n                <span class=\"load-more-dot\"></span>\n                <span class=\"load-more-dot\"></span>\n              </div>\n              <ax-label class=\"load-more-label\">{{\n                '@acorex:chat.status.loading-older-messages' | translate | async\n              }}</ax-label>\n            </div>\n          }\n          @for (group of messageGroups(); track group.date) {\n            <!-- Date Separator -->\n            <div class=\"date-separator\" role=\"separator\" [attr.aria-label]=\"getDateSeparatorAriaLabel(group.dateLabel)\">\n              <span class=\"date-separator__label\">{{ group.dateLabel }}</span>\n            </div>\n\n            <!-- Messages in this date group -->\n            @for (message of group.messages; track message.id) {\n              <div\n                [class]=\"getMessageClasses(message)\"\n                role=\"article\"\n                [attr.aria-label]=\"getMessageAriaLabel(message)\"\n                [id]=\"'message-' + message.id\"\n              >\n                <!-- Avatar: group received in ping-pong; all senders in adaptive wide layout (CSS-controlled). -->\n                @if (shouldRenderAvatar(message)) {\n                  <div class=\"message-avatar\">\n                    <ax-conversation-avatar\n                      kind=\"user\"\n                      [userId]=\"message.senderId\"\n                      [conversation]=\"activeConversation()\"\n                      [message]=\"message\"\n                      [size]=\"32\"\n                    />\n                  </div>\n                }\n\n                <div class=\"message-content-row\" [class.message-content-row-own]=\"isOwnMessage(message)\">\n                  @if (messageSupportsReactions(message)) {\n                    <button\n                      type=\"button\"\n                      class=\"add-reaction-button add-reaction-outside\"\n                      [class.add-reaction-visible]=\"reactionPickerTarget() === message.id\"\n                      (click)=\"toggleReactionPicker(message, $event)\"\n                      [attr.aria-label]=\"'@acorex:chat.actions.add-reaction' | translate | async\"\n                      #reactionButton\n                    >\n                      <i class=\"fa-light fa-face-smile\"></i>\n                    </button>\n                  }\n\n                  <div\n                    class=\"message-bubble-container\"\n                    [id]=\"'message-bubble-' + message.id\"\n                    [attr.data-message-id]=\"message.id\"\n                  >\n                    <div\n                      [class]=\"getBubbleClasses(message)\"\n                      [class.message-bubble-sent]=\"message.senderId === currentUser()?.id\"\n                      [class.message-bubble-received]=\"message.senderId !== currentUser()?.id\"\n                    >\n                      <!-- Sender name (only for group conversations and received messages) -->\n                      @if (shouldShowSenderName(message)) {\n                        <div class=\"message-sender\">{{ getSenderName(message) }}:</div>\n                      }\n\n                      <!-- Reply Preview -->\n                      @if (message.replyTo) {\n                        <div\n                          class=\"reply-preview\"\n                          (click)=\"scrollToMessage(message.replyTo.id)\"\n                          role=\"button\"\n                          [attr.aria-label]=\"'Reply to ' + getSenderName(message.replyTo)\"\n                          (keydown.enter)=\"scrollToMessage(message.replyTo.id)\"\n                          (keydown.space)=\"scrollToMessage(message.replyTo.id)\"\n                        >\n                          <div class=\"reply-preview-content\">\n                            <div class=\"reply-preview-sender\">{{ getSenderName(message.replyTo) }}</div>\n                            <div class=\"reply-preview-text\">\n                              @if (getMessagePreviewText(message.replyTo); as preview) {\n                                <span class=\"last-message\">\n                                  @if (preview.type !== 'text') {\n                                    <i [class]=\"preview.icon\"></i\n                                    >{{ '@acorex:chat.' + preview.type | translate | async }}\n                                  } @else {\n                                    {{ preview.value }}\n                                  }\n                                </span>\n                              }\n                            </div>\n                          </div>\n                        </div>\n                      }\n\n                      <!-- Forwarded Indicator -->\n                      @if (message.forwarded) {\n                        <div class=\"forwarded-preview\">\n                          <i class=\"fa-solid fa-share\"></i>\n                          <span class=\"forwarded-text\">{{ getForwardedText(message) }}</span>\n                        </div>\n                      }\n\n                      <ax-conversation-registry-component-outlet\n                        [component]=\"getRendererComponent(message)\"\n                        [componentLoader]=\"getRendererComponentLoader(message)\"\n                        [inputs]=\"getRendererInputs(message)\"\n                      />\n\n                      @if (messageSupportsReactions(message) && message.reactions.length > 0) {\n                        <div class=\"message-reactions-container\">\n                          <div class=\"message-reactions-bubbles\">\n                            @for (reaction of getGroupedReactions(message); track reaction.emoji) {\n                              <button\n                                type=\"button\"\n                                class=\"reaction-bubble\"\n                                [class.reaction-bubble-active]=\"reaction.hasReacted\"\n                                (click)=\"onReactionClick(message, reaction.emoji)\"\n                                [attr.aria-label]=\"reaction.emoji + ' ' + reaction.count\"\n                              >\n                                <span class=\"reaction-emoji\">{{ reaction.emoji }}</span>\n                                @if (reaction.count > 1) {\n                                  <span class=\"reaction-count\">{{ reaction.count }}</span>\n                                }\n                              </button>\n                            }\n                          </div>\n                        </div>\n                      }\n\n                      <!-- Message Footer -->\n                      <div class=\"message-footer\">\n                        @let replyCount = getReplyCount(message);\n                        @let forwardCount = getForwardCount(message);\n                        @if (replyCount > 0) {\n                          <span class=\"message-footer-count\" [attr.aria-label]=\"replyCount + ' replies'\">\n                            <i class=\"fa-solid fa-message\" aria-hidden=\"true\"></i>\n                            <span class=\"message-footer-count-value\">{{ replyCount }}</span>\n                          </span>\n                        }\n                        @if (forwardCount > 0) {\n                          <span class=\"message-footer-count\" [attr.aria-label]=\"forwardCount + ' forwards'\">\n                            <i class=\"fa-solid fa-share\" aria-hidden=\"true\"></i>\n                            <span class=\"message-footer-count-value\">{{ forwardCount }}</span>\n                          </span>\n                        }\n                        @if (replyCount > 0 || forwardCount > 0) {\n                          <span class=\"message-footer-split\" aria-hidden=\"true\"></span>\n                        }\n                        <span class=\"message-time\">{{ message.timestamp | format: 'timeleft' | async }}</span>\n                        @if (message.editedAt) {\n                          <span class=\"edited-indicator\">\n                            <span>{{ '@acorex:chat.status.edited' | translate | async }}</span>\n                          </span>\n                        }\n                        @if (isOwnMessage(message)) {\n                          <span [class]=\"getStatusIconClasses(message)\">\n                            <ax-conversation-message-delivery-status-icon [status]=\"message.status\" />\n                          </span>\n                        }\n                      </div>\n                    </div>\n                  </div>\n                </div>\n\n                <!-- Context Menu for Message Actions -->\n                <ax-context-menu\n                  [target]=\"'#message-bubble-' + message.id\"\n                  [openOn]=\"'click'\"\n                  [closeOn]=\"'click'\"\n                  (onOpening)=\"handleMessageContextMenuOpening($event, message)\"\n                  (onClose)=\"contextMenuMessageId.set(null)\"\n                  (onItemClick)=\"handleMessageContextMenuItemClick($event, message)\"\n                >\n                </ax-context-menu>\n              </div>\n            }\n          }\n          </div>\n        </div>\n\n        <!-- Scroll to Bottom Button -->\n        @if (showScrollButton()) {\n          <div\n            class=\"scroll-to-bottom-wrapper\"\n            animate.enter=\"scroll-to-bottom-enter\"\n            animate.leave=\"scroll-to-bottom-leave\"\n          >\n            <ax-fab\n              class=\"scroll-to-bottom\"\n              (onClick)=\"scrollToBottom()\"\n              [attr.aria-label]=\"'@acorex:chat.actions.scroll-to-bottom' | translate | async\"\n            >\n              <ax-icon><i class=\"fa-light fa-arrow-down\" aria-hidden=\"true\"></i></ax-icon>\n            </ax-fab>\n          </div>\n        }\n      }\n    </div>\n  }\n\n  <!-- Reaction Picker Popover -->\n  @if (reactionsEnabled() && reactionPickerTarget()) {\n    <ax-popover\n      #reactionPopover\n      [target]=\"reactionPickerElement()\"\n      [openOn]=\"'manual'\"\n      [closeOn]=\"'clickOut'\"\n      [placement]=\"reactionPickerPlacement()\"\n      (onClose)=\"closeReactionPicker()\"\n    >\n      <div class=\"reaction-picker-popup\">\n        <div\n          class=\"reaction-picker-emojis\"\n          role=\"listbox\"\n          [attr.aria-label]=\"'@acorex:chat.actions.choose-reaction' | translate | async\"\n        >\n          @for (emoji of availableReactions(); track emoji) {\n            <button\n              type=\"button\"\n              class=\"reaction-picker-emoji\"\n              [class.reaction-picker-emoji-active]=\"hasUserReactedById(reactionPickerTarget()!, emoji)\"\n              (click)=\"onReactionClickById(reactionPickerTarget()!, emoji); closeReactionPicker()\"\n              [attr.aria-label]=\"emoji\"\n            >\n              {{ emoji }}\n            </button>\n          }\n        </div>\n      </div>\n    </ax-popover>\n  }\n} @else {\n  <div\n    class=\"message-list message-list--no-active\"\n    role=\"region\"\n    [attr.aria-label]=\"'@acorex:chat.status.no-conversation-selected' | translate | async\"\n  >\n    <div class=\"list-no-active\">\n      <ng-content select=\"ax-conversation-message-list-no-active, [ax-conversation-message-list-no-active]\">\n        <ng-container *ngComponentOutlet=\"noActiveFallbackComponent\"></ng-container>\n      </ng-content>\n    </div>\n  </div>\n}\n","/**\n * Avatar Picker Component\n * Allows selecting an avatar via file upload with preview\n */\n\nimport { AXButtonComponent } from '@acorex/components/button';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXImageComponent } from '@acorex/components/image';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport { CommonModule } from '@angular/common';\nimport { Component, ElementRef, ViewEncapsulation, input, model, output, viewChild } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\n\n@Component({\n  selector: 'ax-conversation-avatar-picker',\n  encapsulation: ViewEncapsulation.None,\n  imports: [CommonModule, FormsModule, AXButtonComponent, AXDecoratorModule, AXImageComponent, AXTranslationModule],\n  templateUrl: './avatar-picker.component.html',\n\n  styleUrl: './avatar-picker.component.css',\n})\nexport class AXConversationAvatarPickerComponent {\n  readonly fileInput = viewChild<ElementRef<HTMLInputElement>>('fileInput');\n\n  // Inputs\n  readonly showClearButton = input<boolean>(true);\n\n  // Two-way binding for avatar URL\n  readonly avatarUrl = model<string>('');\n\n  // Output for file selection (returns data URL)\n  readonly onFileSelected = output<string>();\n\n  triggerFileInput(): void {\n    this.fileInput()?.nativeElement.click();\n  }\n\n  async onFileInputChange(event: Event): Promise<void> {\n    const input = event.target as HTMLInputElement;\n    const file = input.files?.[0];\n\n    if (file && file.type.startsWith('image/')) {\n      try {\n        const reader = new FileReader();\n        reader.onload = (e) => {\n          const dataUrl = e.target?.result as string;\n          this.avatarUrl.set(dataUrl);\n          this.onFileSelected.emit(dataUrl);\n        };\n        reader.readAsDataURL(file);\n      } catch (error) {\n        console.error('Failed to read file:', error);\n      }\n    }\n\n    // Reset input\n    input.value = '';\n  }\n\n  clearAvatar(): void {\n    this.avatarUrl.set('');\n  }\n}\n","    <div class=\"avatar-picker\">\n      <!-- Preview -->\n      <div class=\"avatar-preview\" (click)=\"triggerFileInput()\">\n        @if (avatarUrl()) {\n          <ax-image [src]=\"avatarUrl()\" [alt]=\"'@acorex:chat.avatar.preview' | translate | async\"></ax-image>\n          <div class=\"preview-overlay\">\n            <i class=\"fa-light fa-camera\"></i>\n          </div>\n        } @else {\n          <div class=\"avatar-placeholder\">\n            <i class=\"fa-light fa-camera\"></i>\n            <span class=\"placeholder-text\">{{ '@acorex:chat.actions.choose-image' | translate | async }}</span>\n          </div>\n        }\n      </div>\n\n      <!-- Action Buttons -->\n      <div class=\"avatar-actions\">\n        <ax-button\n          [look]=\"'solid'\"\n          [color]=\"'primary'\"\n          [text]=\"\n            avatarUrl()\n              ? ('@acorex:chat.actions.change-image' | translate | async)\n              : ('@acorex:chat.actions.upload-image' | translate | async)\n          \"\n          (onClick)=\"triggerFileInput()\"\n        >\n          <ax-prefix>\n            <ax-icon><i [class]=\"avatarUrl() ? 'fa-light fa-image' : 'fa-light fa-upload'\"></i></ax-icon>\n          </ax-prefix>\n        </ax-button>\n        @if (showClearButton() && avatarUrl()) {\n          <ax-button\n            [look]=\"'outline'\"\n            [color]=\"'danger'\"\n            [text]=\"'@acorex:chat.actions.remove-image' | translate | async\"\n            (onClick)=\"clearAvatar()\"\n          >\n            <ax-prefix>\n              <ax-icon><i class=\"fa-light fa-trash-can\"></i></ax-icon>\n            </ax-prefix>\n          </ax-button>\n        }\n      </div>\n\n      <!-- Hidden File Input -->\n      <input\n        #fileInput\n        type=\"file\"\n        accept=\"image/*\"\n        class=\"avatar-picker__file-input\"\n        (change)=\"onFileInputChange($event)\"\n      />\n    </div>\n","/**\n * Conversation Item Component\n * Displays a single conversation in the sidebar list\n */\n\nimport { AXBadgeComponent } from '@acorex/components/badge';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport {\n  AXContextMenuComponent,\n  AXContextMenuItemsClickEvent,\n  AXContextMenuOpeningEvent,\n  AXMenuItem,\n} from '@acorex/components/menu';\nimport { AXDateTimeModule } from '@acorex/core/date-time';\nimport { AXFormatModule } from '@acorex/core/format';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport { CommonModule } from '@angular/common';\nimport { Component, ViewEncapsulation, computed, inject, input, output, signal } from '@angular/core';\nimport { AXConversation } from '../../models';\nimport { AXConversationService } from '../../services';\nimport { AXConversationMessageUtilsService } from '../../utils';\nimport { AXConversationInfoBarService } from '../info-bar';\nimport { AXConversationAvatarComponent } from '../shared/conversation-avatar.component';\n\n@Component({\n  selector: 'ax-conversation-item',\n  encapsulation: ViewEncapsulation.None,\n\n  imports: [\n    CommonModule,\n    AXDecoratorModule,\n    AXBadgeComponent,\n    AXContextMenuComponent,\n    AXFormatModule,\n    AXDateTimeModule,\n    AXTranslationModule,\n    AXConversationAvatarComponent,\n  ],\n  templateUrl: './conversation-item.component.html',\n  styleUrl: './conversation-item.component.css',\n})\nexport class AXConversationItemComponent {\n  private readonly conversationService = inject(AXConversationService);\n  private readonly infoBarService = inject(AXConversationInfoBarService);\n\n  // Access registry through conversation service\n  private get registry() {\n    return this.conversationService.registry;\n  }\n\n  /** Conversation data */\n  readonly conversation = input.required<AXConversation>();\n\n  /** Click event */\n  readonly clicked = output<AXConversation>();\n\n  /** Live conversation from store (reactive) */\n  public readonly liveConversation = computed(() => {\n    const convId = this.conversation().id;\n    const conversations = this.conversationService.conversations();\n    return conversations.find((c) => c.id === convId) || this.conversation();\n  });\n\n  /** Whether this conversation is active */\n  readonly isActive = computed(() => {\n    const activeConv = this.conversationService.activeConversation();\n    return activeConv?.id === this.conversation().id;\n  });\n\n  /** True while this row's context menu is open */\n  readonly contextMenuOpen = signal(false);\n\n  /** Item CSS classes - delegate to component logic */\n  readonly itemClasses = computed(() => {\n    const classes = ['conversation-item'];\n    if (this.isActive()) {\n      classes.push('conversation-item-active');\n    }\n    if (this.contextMenuOpen()) {\n      classes.push('conversation-item-context-active');\n    }\n    return classes.join(' ');\n  });\n\n  /** Typing indicator text - delegate to utils */\n  readonly typingText = computed((): string => {\n    this.conversationService.typingRevision();\n    const conv = this.liveConversation();\n    return AXConversationMessageUtilsService.getTypingText(\n      conv,\n      this.conversationService.getActiveTypingUserIds(conv.id),\n    );\n  });\n\n  readonly isTyping = computed(() => {\n    this.conversationService.typingRevision();\n    return this.conversationService.isAnyoneTyping(this.liveConversation().id);\n  });\n\n  readonly roomPreferences = computed(() => {\n    const conv = this.liveConversation();\n    return this.conversationService.getRoomPreferences(conv.id);\n  });\n\n  /** Last message preview - delegate to utils */\n  readonly lastMessagePreview = computed((): { value: string; type: string; icon: string } | null => {\n    const lastMessage = this.liveConversation().lastMessage;\n    if (!lastMessage) return null;\n    return AXConversationMessageUtilsService.getPreviewText(lastMessage);\n  });\n\n  getPreviewTypeKey(type: string): string {\n    switch (type) {\n      case 'image':\n        return '@acorex:chat.image';\n      case 'video':\n        return '@acorex:chat.video';\n      case 'audio':\n      case 'voice':\n        return '@acorex:chat.voice';\n      case 'file':\n        return '@acorex:chat.file';\n      case 'location':\n        return '@acorex:chat.location';\n      case 'sticker':\n        return '@acorex:chat.sticker';\n      default:\n        return '@acorex:chat.message';\n    }\n  }\n\n  /** Handle click event */\n  handleClick(): void {\n    this.clicked.emit(this.conversation());\n  }\n\n  /** Handle context menu opening for conversations */\n  handleContextMenuOpening(event: AXContextMenuOpeningEvent): void {\n    this.contextMenuOpen.set(true);\n    const conversation = this.liveConversation();\n    const actions = this.registry.conversationItemActions.getActionsForConversation(conversation);\n\n    // Convert conversation item actions to context menu items\n    const menuItems: AXMenuItem[] = actions\n      .filter((action) => !action.divider) // Skip divider items\n      .map((action) => {\n        // Check if the next item in the original actions array is a divider\n        const originalIndex = actions.findIndex((a) => a.id === action.id);\n        const nextAction = actions[originalIndex + 1];\n        const hasBreakAfter = nextAction?.divider === true;\n\n        return {\n          text: this.registry.conversationItemActions.getActionLabel(action, conversation),\n          icon: this.registry.conversationItemActions.getActionIcon(action, conversation),\n          color: action.destructive ? 'danger' : undefined,\n          disabled: !this.registry.conversationItemActions.isActionEnabled(action, { conversation }),\n          break: hasBreakAfter, // Add break if next item is a divider\n          data: action, // Store original action for later use\n        };\n      });\n\n    event.items.push(...menuItems);\n  }\n\n  /** Handle context menu item click for conversations */\n  async handleContextMenuItemClick(event: AXContextMenuItemsClickEvent): Promise<void> {\n    this.contextMenuOpen.set(false);\n    const action = event.item.data;\n    const conversation = this.liveConversation();\n\n    if (action && conversation && action.handler) {\n      try {\n        await this.registry.conversationItemActions.executeAction(action.id, { conversation });\n      } catch (error) {\n        console.error('Failed to execute conversation action:', error);\n      }\n    }\n  }\n}\n","    <div\n      [class]=\"itemClasses()\"\n      [id]=\"'conversation-item-' + conversation().id\"\n      (click)=\"handleClick()\"\n      (keydown.enter)=\"handleClick()\"\n      (keydown.space)=\"handleClick()\"\n      role=\"button\"\n      tabindex=\"0\"\n      [attr.aria-label]=\"'Conversation with ' + conversation().title\"\n    >\n      <!-- Avatar -->\n      <div class=\"item-avatar\">\n        <ax-conversation-avatar\n          kind=\"auto\"\n          [conversation]=\"liveConversation()\"\n          [size]=\"48\"\n          [showStatus]=\"conversation().type === 'private'\"\n        />\n      </div>\n\n      <!-- Content -->\n      <div class=\"item-content\">\n        <div class=\"item-header\">\n          <span class=\"item-title\">\n            <p class=\"item-title-text\">{{ liveConversation().title }}</p>\n            @if (roomPreferences().notifications === false) {\n              <i class=\"fa-light fa-bell-slash mute-icon\"></i>\n            }\n            @if (liveConversation()?.blocked) {\n              <i class=\"fa-ban fa-light block-icon\"></i>\n            }\n          </span>\n          @if (liveConversation().lastMessageAt) {\n            <span class=\"item-time\">{{ liveConversation().lastMessageAt | format: 'timeleft' | async }}</span>\n          }\n        </div>\n\n        <div class=\"item-description\">\n          @if (isTyping()) {\n            <span class=\"typing-indicator\">{{ typingText() }}</span>\n          } @else if (liveConversation().lastMessage) {\n            @if (lastMessagePreview(); as preview) {\n              <span class=\"last-message\">\n                @if (preview.type !== 'text') {\n                  <i [class]=\"preview.icon\"></i>\n                }\n                @if (preview.type === 'text') {\n                  {{ preview.value }}\n                } @else {\n                  {{ getPreviewTypeKey(preview.type) | translate | async }}\n                }\n              </span>\n            }\n          } @else {\n            <span class=\"last-message no-message\">{{ '@acorex:chat.status.no-messages' | translate | async }}</span>\n          }\n          <!-- Badge -->\n          @if (liveConversation().unreadCount > 0) {\n            <div class=\"item-badge\">\n              <ax-badge [text]=\"liveConversation().unreadCount.toString()\" [color]=\"'primary'\" />\n            </div>\n          }\n          <!-- Pin Icon -->\n          @if (liveConversation().pinned) {\n            <i class=\"fa-light fa-thumbtack pin-icon\"></i>\n          }\n        </div>\n      </div>\n    </div>\n\n    <!-- Context Menu for Conversation Actions -->\n    <ax-context-menu\n      [target]=\"'#conversation-item-' + conversation().id\"\n      [openOn]=\"'click'\"\n      [closeOn]=\"'click'\"\n      (onOpening)=\"handleContextMenuOpening($event)\"\n      (onClose)=\"contextMenuOpen.set(false)\"\n      (onItemClick)=\"handleContextMenuItemClick($event)\"\n    >\n    </ax-context-menu>\n","/**\n * AXConversationSidebarService\n * Facade/service for Sidebar-related state and actions.\n */\nimport { Injectable, computed, inject, signal } from '@angular/core';\nimport { AXConversation } from '../../models';\nimport { AXConversationService } from '../../services';\nimport { AXConversationMessageUtilsService } from '../../utils/message-utils.service';\n\n@Injectable()\nexport class AXConversationSidebarService {\n  private readonly conversationService = inject(AXConversationService);\n\n  constructor() {\n    void this.conversationService.ensureInitialized();\n  }\n\n  // Access registry through conversation service\n  private get registry() {\n    return this.conversationService.registry;\n  }\n\n  // Local UI state\n  readonly searchQuery = signal('');\n  readonly activeTabId = signal('all');\n  readonly loadingMore = signal(false);\n\n  // Derived state from ConversationService\n  readonly conversations = this.conversationService.conversations;\n  readonly loading = this.conversationService.loading;\n\n  readonly hasMoreConversations = computed(\n    () => this.conversationService.conversationsPagination().hasMore,\n  );\n\n  // Tabs\n  readonly enabledTabs = this.registry.conversationTabs.enabledTabs;\n\n  // Filtered conversations (recomputed on every inbox change — no memo cache)\n  readonly filteredConversations = computed(() => {\n    const conversations = this.conversations();\n    const query = this.searchQuery();\n    const tabId = this.activeTabId();\n    return this.filterAndSort(conversations, query, tabId);\n  });\n\n  /**\n   * Filter and sort conversations\n   */\n  private filterAndSort(conversations: AXConversation[], query: string, tabId: string): AXConversation[] {\n    let filtered = conversations;\n\n    // Apply tab filter\n    const activeTab = this.registry.conversationTabs.getTabById(tabId);\n    if (activeTab) {\n      filtered = activeTab.filter(filtered);\n    }\n\n    // Apply search filter\n    const lowerQuery = query.toLowerCase().trim();\n    if (lowerQuery) {\n      filtered = filtered.filter((conv) => {\n        // Search in title\n        if (conv.title.toLowerCase().includes(lowerQuery)) {\n          return true;\n        }\n        // Search in last message text (type-safe)\n        if (conv.lastMessage) {\n          const messageText = AXConversationMessageUtilsService.getMessageText(conv.lastMessage);\n          return messageText.toLowerCase().includes(lowerQuery);\n        }\n        return false;\n      });\n    }\n\n    // Sort: pinned conversations first, then by last message time (newest first)\n    return filtered.slice().sort((a, b) => {\n      // Pinned conversations always come first\n      if (a.pinned !== b.pinned) return a.pinned ? -1 : 1;\n\n      // If both pinned or both not pinned, sort by last message time\n      const aTime =\n        (a.lastMessageAt instanceof Date ? a.lastMessageAt.getTime() : undefined) ??\n        (a.lastMessage?.timestamp instanceof Date ? a.lastMessage.timestamp.getTime() : undefined) ??\n        0;\n      const bTime =\n        (b.lastMessageAt instanceof Date ? b.lastMessageAt.getTime() : undefined) ??\n        (b.lastMessage?.timestamp instanceof Date ? b.lastMessage.timestamp.getTime() : undefined) ??\n        0;\n      return bTime - aTime;\n    });\n  }\n\n  setSearchQuery(q: string): void {\n    this.searchQuery.set(q);\n  }\n\n  setActiveTab(tabId: string): void {\n    this.activeTabId.set(tabId);\n  }\n\n  selectConversation(conversation: AXConversation): void {\n    this.conversationService.selectConversation(conversation.id);\n  }\n\n  getBadgeValue(tabId: string): string | undefined {\n    const v = this.registry.conversationTabs.getBadge(tabId, this.conversations());\n    return v === undefined ? undefined : String(v);\n  }\n\n  /**\n   * Load more conversations when the user scrolls near the bottom of the sidebar list.\n   */\n  async loadMoreConversations(): Promise<void> {\n    if (!this.hasMoreConversations() || this.loadingMore() || this.loading()) {\n      return;\n    }\n\n    this.loadingMore.set(true);\n    try {\n      const { page } = this.conversationService.conversationsPagination();\n      const nextPage = page + 1;\n      await this.conversationService.loadMoreConversations(nextPage);\n    } finally {\n      this.loadingMore.set(false);\n    }\n  }\n\n  /**\n   * Handle scroll threshold (for infinite scroll)\n   */\n  async onScrollThreshold(edge: 'top' | 'bottom'): Promise<void> {\n    if (edge === 'bottom') {\n      await this.loadMoreConversations();\n    }\n  }\n\n  /**\n   * Reload conversation list from the first page (e.g. pull-to-refresh).\n   */\n  async reloadConversations(): Promise<void> {\n    this.conversationService.resetConversationsPagination();\n    await this.conversationService.loadConversations();\n  }\n}\n","/**\n * Sidebar Component (moved under conversation-view)\n * Uses AXConversationSidebarService facade for state/actions\n */\n\nimport { AXBadgeComponent } from '@acorex/components/badge';\nimport { AXButtonComponent } from '@acorex/components/button';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXLabelComponent } from '@acorex/components/label';\nimport { AXPopupService } from '@acorex/components/popup';\nimport { AXSearchBoxComponent } from '@acorex/components/search-box';\nimport { AXSkeletonComponent } from '@acorex/components/skeleton';\nimport { AXTabItemComponent, AXTabLocation, AXTabsComponent } from '@acorex/components/tabs';\nimport { AXTranslationModule, AXTranslationService } from '@acorex/core/translation';\nimport { CommonModule } from '@angular/common';\nimport {\n  ChangeDetectorRef,\n  Component,\n  NgZone,\n  OnDestroy,\n  ViewEncapsulation,\n  computed,\n  inject,\n  output,\n} from '@angular/core';\nimport { Subject, debounceTime, distinctUntilChanged } from 'rxjs';\nimport { AXConversationInfiniteScrollDirective } from '../../directives';\nimport { AXConversation } from '../../models';\nimport { AXConversationService } from '../../services';\nimport { AX_CONVERSATION_CONFIG } from '../../tokens';\nimport { AXConversationItemComponent } from './conversation-item.component';\nimport { AXConversationSidebarService } from './sidebar.service';\n\n@Component({\n  selector: 'ax-conversation-sidebar',\n  encapsulation: ViewEncapsulation.None,\n\n  imports: [\n    CommonModule,\n    AXDecoratorModule,\n    AXTabsComponent,\n    AXTabItemComponent,\n    AXBadgeComponent,\n    AXButtonComponent,\n    AXSearchBoxComponent,\n    AXLabelComponent,\n    AXSkeletonComponent,\n    AXTranslationModule,\n    AXConversationItemComponent,\n    AXConversationInfiniteScrollDirective,\n  ],\n  templateUrl: './sidebar.component.html',\n  styleUrl: './sidebar.component.css',\n})\nexport class AXConversationSidebarComponent implements OnDestroy {\n  readonly sidebar = inject(AXConversationSidebarService);\n  protected readonly config = inject(AX_CONVERSATION_CONFIG);\n  private readonly conversationService = inject(AXConversationService);\n  private readonly popupService = inject(AXPopupService);\n  private readonly translation = inject(AXTranslationService);\n  private readonly ngZone = inject(NgZone);\n  private readonly cdr = inject(ChangeDetectorRef);\n\n  /** Conversation selected event */\n  readonly conversationSelected = output<AXConversation>();\n\n  /** Search debouncing */\n  private readonly searchSubject = new Subject<string>();\n\n  /** Derived state for template */\n  readonly enabledTabs = this.sidebar.enabledTabs;\n  readonly filteredConversations = this.sidebar.filteredConversations;\n  readonly loading = this.sidebar.loading;\n  readonly loadingMore = this.sidebar.loadingMore;\n  readonly hasMoreConversations = this.sidebar.hasMoreConversations;\n\n  readonly isSidebarTabsHorizontal = computed(() => this.config.sidebarTabsOrientation === 'horizontal');\n\n  readonly sidebarTabLocation = computed<AXTabLocation>(() => (this.isSidebarTabsHorizontal() ? 'start' : 'bottom'));\n\n  constructor() {\n    // Setup debounced search\n    this.searchSubject.pipe(debounceTime(this.config.debounceSearch), distinctUntilChanged()).subscribe((query) => {\n      this.sidebar.setSearchQuery(query);\n    });\n  }\n\n  /** Handle search input change with debouncing */\n  onSearchChange(value: string): void {\n    this.searchSubject.next(value);\n  }\n\n  /** Handle tab change from ax-tabs */\n  onTabChange(event: { tab?: { key?: string } }): void {\n    if (event.tab?.key) {\n      this.sidebar.setActiveTab(event.tab.key);\n    }\n  }\n\n  /** Select a conversation */\n  selectConversation(conversation: AXConversation): void {\n    this.sidebar.selectConversation(conversation);\n    this.conversationSelected.emit(conversation);\n  }\n\n  /** Get badge value for tab */\n  getBadgeValue(tabId: string): string | undefined {\n    return this.sidebar.getBadgeValue(tabId);\n  }\n\n  getTabLabel(tabId: string): string {\n    const tab = this.sidebar.enabledTabs().find((item) => item.id === tabId);\n    if (!tab) return '';\n    return this.conversationService.registry.conversationTabs.getTabLabel(tab);\n  }\n\n  async openNewConversationPopup(): Promise<void> {\n    const { AXConversationNewDialogComponent } = await import('./new-conversation-dialog.component');\n    const result = await this.popupService.open(AXConversationNewDialogComponent, {\n      title: this.translation.translateSync('@acorex:chat.dialog.new-conversation.title'),\n      size: 'sm',\n      closeButton: true,\n      data: {\n        conversationService: this.conversationService,\n      },\n    });\n    if (result?.data) {\n      const conversation = result.data as AXConversation;\n      // Popup closes outside the normal component tree — run inside the zone so signal\n      // updates propagate to the sidebar list immediately.\n      this.ngZone.run(() => {\n        this.selectConversation(conversation);\n        this.cdr.markForCheck();\n      });\n    }\n  }\n\n  /** Handle infinite scroll threshold - delegate to service */\n  async onScrollThreshold(edge: 'top' | 'bottom'): Promise<void> {\n    await this.sidebar.onScrollThreshold(edge);\n  }\n\n  /** Cleanup on destroy */\n  ngOnDestroy(): void {\n    this.searchSubject.complete();\n  }\n}\n","<div class=\"sidebar\" [class.sidebar--tabs-horizontal]=\"isSidebarTabsHorizontal()\">\n  <!-- Header with Menu and Search -->\n  <div class=\"sidebar-header\">\n    <!-- <ax-button [look]=\"'outline'\" [size]=\"'md'\"  class=\"menu-button\">\n          <i class=\"fa-light fa-bars\"></i>\n        </ax-button> -->\n    <div class=\"sidebar-search\">\n      <ax-search-box\n        [value]=\"sidebar.searchQuery()\"\n        (valueChange)=\"onSearchChange($event)\"\n        [placeholder]=\"'@acorex:chat.placeholders.search-conversations' | translate | async\"\n        class=\"rounded-full\"\n      ></ax-search-box>\n    </div>\n  </div>\n\n  <div class=\"sidebar-body\" [class.sidebar-body--tabs-horizontal]=\"isSidebarTabsHorizontal()\">\n    <!-- Tabs -->\n    <div class=\"sidebar-tabs\">\n      <ax-tabs\n        (onActiveTabChanged)=\"onTabChange($event)\"\n        [look]=\"'with-line'\"\n        [location]=\"sidebarTabLocation()\"\n        [style.overflow]=\"'hidden'\"\n        [class.surface]=\"sidebarTabLocation() === 'start'\"\n      >\n        @for (tab of enabledTabs(); track tab.id) {\n          <ax-tab-item\n            [text]=\"getTabLabel(tab.id)\"\n            [key]=\"tab.id\"\n            [class.limitedTab]=\"sidebarTabLocation() === 'start'\"\n          >\n            @if (tab.icon) {\n              <ax-prefix>\n                <ax-icon>\n                  <i [class]=\"'tab-icon ' + tab.icon\" aria-hidden=\"true\"></i>\n                </ax-icon>\n              </ax-prefix>\n            }\n            @if (tab.badge && getBadgeValue(tab.id); as badgeText) {\n              <ax-suffix>\n                <ax-badge [text]=\"badgeText\" [color]=\"'primary'\" />\n              </ax-suffix>\n            }\n          </ax-tab-item>\n        }\n      </ax-tabs>\n    </div>\n\n    <div class=\"sidebar-main\">\n      <!-- Conversation List -->\n      <div\n        class=\"sidebar-list\"\n        axInfiniteScroll\n        [threshold]=\"config.infiniteScrollThreshold\"\n        [edge]=\"'bottom'\"\n        [scrollDisabled]=\"loading() || loadingMore() || !hasMoreConversations()\"\n        (scrollThreshold)=\"onScrollThreshold($event)\"\n      >\n        @if (loading()) {\n          <!-- Skeleton Loading State -->\n          @for (i of [1, 2, 3, 4]; track i) {\n            <div class=\"conversation-skeleton\">\n              <ax-skeleton class=\"skeleton-avatar\"></ax-skeleton>\n              <div class=\"skeleton-content\">\n                <div class=\"skeleton-header\">\n                  <ax-skeleton class=\"skeleton-title\"></ax-skeleton>\n                  <ax-skeleton class=\"skeleton-time\"></ax-skeleton>\n                </div>\n                <ax-skeleton class=\"skeleton-message\"></ax-skeleton>\n              </div>\n            </div>\n          }\n        } @else if (filteredConversations().length === 0) {\n          <div class=\"list-empty\">\n            <div class=\"empty-icon\"><i class=\"fa-light fa-comments\"></i></div>\n            <h3 class=\"empty-title\">{{ '@acorex:chat.sidebar.empty-title' | translate | async }}</h3>\n            <p class=\"empty-description\">\n              @if (sidebar.searchQuery()) {\n                {{ '@acorex:chat.sidebar.empty-search' | translate | async }}\n              } @else {\n                {{ '@acorex:chat.sidebar.empty-default' | translate | async }}\n              }\n            </p>\n          </div>\n        } @else {\n          @for (conversation of filteredConversations(); track conversation.id) {\n            <ax-conversation-item [conversation]=\"conversation\" (clicked)=\"selectConversation($event)\" />\n          }\n          @if (loadingMore()) {\n            <div\n              class=\"list-loading-more list-loading-more--append\"\n              role=\"status\"\n              animate.enter=\"load-more-enter\"\n              animate.leave=\"load-more-leave\"\n              [attr.aria-label]=\"'@acorex:chat.status.loading-more' | translate | async\"\n            >\n              <div class=\"load-more-indicator\" aria-hidden=\"true\">\n                <span class=\"load-more-dot\"></span>\n                <span class=\"load-more-dot\"></span>\n                <span class=\"load-more-dot\"></span>\n              </div>\n              <ax-label class=\"load-more-label\">{{ '@acorex:chat.status.loading-more' | translate | async }}</ax-label>\n            </div>\n          }\n        }\n      </div>\n\n      <div class=\"new-conversation-button-container\">\n        <ng-content select=\"ax-suffix\">\n          <div class=\"new-conversation-button-container-inner\">\n            <ax-button\n              class=\"new-conversation-btn\"\n              [text]=\"'@acorex:chat.actions.new-conversation' | translate | async\"\n              [look]=\"'solid'\"\n              (onClick)=\"openNewConversationPopup()\"\n            ></ax-button>\n          </div>\n        </ng-content>\n      </div>\n    </div>\n  </div>\n</div>\n","import { AXClosableComponent, AXComponentCloseEvent, AXDataSource } from '@acorex/cdk/common';\nimport { AXButtonComponent } from '@acorex/components/button';\nimport { AXDecoratorGenericComponent } from '@acorex/components/decorators';\nimport { AXListComponent } from '@acorex/components/list';\nimport { AXBasePageComponent } from '@acorex/components/page';\nimport type { AXPopupRef } from '@acorex/components/popup';\nimport { AXSearchBoxComponent } from '@acorex/components/search-box';\nimport { AXSkeletonComponent } from '@acorex/components/skeleton';\nimport { AXToastService } from '@acorex/components/toast';\nimport { AXTranslationModule, AXTranslationService } from '@acorex/core/translation';\nimport { CommonModule } from '@angular/common';\nimport {\n  Component,\n  TemplateRef,\n  ViewEncapsulation,\n  computed,\n  DestroyRef,\n  effect,\n  inject,\n  input,\n  signal,\n  viewChild,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { AXConversation, AXConversationParticipant } from '../../models';\nimport { AX_CONVERSATION_DEFAULT_GROUP_ICON } from '../../utils/conversation-display.utils';\nimport { AXConversationService } from '../../services';\nimport { AX_CONVERSATION_CONFIG } from '../../tokens';\nimport { AXConversationAvatarPickerComponent } from '../shared/avatar-picker.component';\nimport { AXConversationAvatarComponent } from '../shared/conversation-avatar.component';\n\ntype AXConversationNewWizardStep = 'selectUsers' | 'groupDetails';\n\n@Component({\n  selector: 'ax-conversation-new-dialog',\n  encapsulation: ViewEncapsulation.None,\n\n  imports: [\n    CommonModule,\n    FormsModule,\n    AXButtonComponent,\n    AXListComponent,\n    AXSearchBoxComponent,\n    AXDecoratorGenericComponent,\n    AXSkeletonComponent,\n    AXConversationAvatarPickerComponent,\n    AXConversationAvatarComponent,\n    AXTranslationModule,\n  ],\n  providers: [{ provide: AXClosableComponent, useExisting: AXConversationNewDialogComponent }],\n  templateUrl: './new-conversation-dialog.component.html',\n  styleUrl: './new-conversation-dialog.component.css',\n})\nexport class AXConversationNewDialogComponent extends AXBasePageComponent {\n  /**\n   * Assigned by {@link AXPopupComponent} from `open(..., { data: { conversationService } })`.\n   * Not injected: popup content is created on the root view container, so route-scoped providers\n   * would not see the same `AXConversationService` instance as the conversation feature.\n   */\n  conversationService!: AXConversationService;\n  private readonly toastService = inject(AXToastService);\n  private readonly translation = inject(AXTranslationService);\n  private readonly config = inject(AX_CONVERSATION_CONFIG);\n  private readonly destroyRef = inject(DestroyRef);\n\n  private searchDebounceTimer?: ReturnType<typeof setTimeout>;\n\n  constructor() {\n    super();\n    this.destroyRef.onDestroy(() => {\n      if (this.searchDebounceTimer) {\n        clearTimeout(this.searchDebounceTimer);\n      }\n    });\n  }\n\n  /**\n   * Injected by {@link AXPopupComponent} when this dialog is opened via {@link AXPopupService}.\n   * Required for `setTitle` / dynamic header — {@link AXBasePageComponent#setTitle} is otherwise unset.\n   */\n  readonly __popup__ = input<AXPopupRef | undefined>(undefined);\n\n  readonly availableUsers = signal<AXConversationParticipant[]>([]);\n  readonly selectedUserIds = signal<string[]>([]);\n  readonly groupTitle = signal('');\n  readonly groupAvatar = signal('');\n  readonly searchQuery = signal('');\n  readonly creating = signal(false);\n  /** For 2+ users: step 1 = pick users, step 2 = title + avatar. */\n  readonly wizardStep = signal<AXConversationNewWizardStep>('selectUsers');\n\n  readonly showUserPickerStep = computed(() => {\n    const n = this.selectedUserIds().length;\n    if (n <= 1) return true;\n    return this.wizardStep() === 'selectUsers';\n  });\n\n  readonly showGroupDetailsStep = computed(\n    () => this.selectedUserIds().length > 1 && this.wizardStep() === 'groupDetails',\n  );\n\n  readonly showNextButton = computed(() => this.selectedUserIds().length > 1 && this.wizardStep() === 'selectUsers');\n\n  readonly showGroupBackButton = computed(\n    () => this.selectedUserIds().length > 1 && this.wizardStep() === 'groupDetails',\n  );\n\n  readonly showCreateButton = computed(() => {\n    const n = this.selectedUserIds().length;\n    if (n === 0) return false;\n    if (n === 1) return true;\n    return this.wizardStep() === 'groupDetails';\n  });\n\n  readonly canGoNextToGroupDetails = computed(() => this.selectedUserIds().length > 1);\n\n  readonly canCreate = computed(() => {\n    const selectedCount = this.selectedUserIds().length;\n    if (selectedCount === 0) return false;\n    if (selectedCount === 1) return true;\n    return this.groupTitle().trim().length > 0;\n  });\n\n  private readonly _resetWizardWhenSingleEffect = effect(() => {\n    if (this.selectedUserIds().length <= 1) {\n      this.wizardStep.set('selectUsers');\n    }\n  });\n\n  private readonly _syncPopupTitleEffect = effect(() => {\n    const popupRef = this.__popup__();\n    const count = this.selectedUserIds().length;\n    const step = this.wizardStep();\n    let title = this.translation.translateSync('@acorex:chat.dialog.new-conversation.title');\n    if (count > 1) {\n      title =\n        step === 'groupDetails'\n          ? this.translation.translateSync('@acorex:chat.dialog.new-conversation.group-details')\n          : this.translation.translateSync('@acorex:chat.dialog.new-conversation.selected-count', {\n              params: { count },\n            });\n    }\n    if (popupRef) {\n      this.setTitle = (t: string) => popupRef.setTitle(t);\n      popupRef.setTitle(title);\n    }\n  });\n\n  readonly usersListEmptyTpl = viewChild.required<TemplateRef<unknown>>('usersListEmpty');\n  readonly usersListLoadingTpl = viewChild.required<TemplateRef<unknown>>('usersListLoading');\n  readonly usersList = viewChild<AXListComponent>('usersList');\n\n  readonly usersListDataSource = new AXDataSource<unknown>({\n    pageSize: 10,\n    key: 'id',\n    load: async (e) => {\n      const query = this.searchQuery().trim();\n      const filters = query ? { query } : undefined;\n      const page = e.take > 0 ? Math.floor(e.skip / e.take) : 0;\n      const result = await this.conversationService.getUsers(filters, {\n        page,\n        pageSize: e.take,\n      });\n      this.mergeUsersCache(result.items);\n      return {\n        items: result.items as unknown[],\n        total: result.total ?? result.items.length,\n      };\n    },\n    byKey: (key) => Promise.resolve(this.availableUsers().find((u) => u.id === key) ?? null),\n  });\n\n  onCancel(): void {\n    const event = new AXComponentCloseEvent();\n    event.component = this;\n    event.data = null;\n    this.onClosed.emit(event);\n  }\n\n  onSelectedUsersChange(ids: string[]): void {\n    this.selectedUserIds.set(ids);\n  }\n\n  onNextToGroupDetails(): void {\n    if (!this.canGoNextToGroupDetails()) return;\n    this.wizardStep.set('groupDetails');\n  }\n\n  onBackFromGroupDetails(): void {\n    this.wizardStep.set('selectUsers');\n  }\n\n  onSearchChange(value: string): void {\n    this.searchQuery.set(value ?? '');\n\n    if (this.searchDebounceTimer) {\n      clearTimeout(this.searchDebounceTimer);\n    }\n\n    this.searchDebounceTimer = setTimeout(() => {\n      this.searchDebounceTimer = undefined;\n      this.usersList()?.refresh(false);\n    }, this.config.debounceSearch);\n  }\n\n  isUserSelected(id: string): boolean {\n    return this.selectedUserIds().includes(id);\n  }\n\n  userFromItem(item: unknown): AXConversationParticipant | null {\n    if (!item || typeof item !== 'object' || !('data' in item)) return null;\n    return (item as { data?: AXConversationParticipant }).data ?? null;\n  }\n\n  private mergeUsersCache(users: AXConversationParticipant[]): void {\n    if (users.length === 0) {\n      return;\n    }\n    this.availableUsers.update((existing) => {\n      const byId = new Map(existing.map((user) => [user.id, user]));\n      for (const user of users) {\n        byId.set(user.id, user);\n      }\n      return Array.from(byId.values());\n    });\n  }\n\n  async onCreateConversation(): Promise<void> {\n    if (this.creating()) return;\n\n    const selectedIds = this.selectedUserIds();\n    if (selectedIds.length === 0) return;\n    if (selectedIds.length > 1 && this.wizardStep() !== 'groupDetails') return;\n\n    this.creating.set(true);\n    try {\n      let conversation: AXConversation;\n\n      if (selectedIds.length === 1) {\n        conversation = await this.conversationService.createConversation(selectedIds, 'private');\n      } else {\n        const metadata = {\n          title: this.groupTitle().trim(),\n          avatar: this.groupAvatar() || undefined,\n          icon: AX_CONVERSATION_DEFAULT_GROUP_ICON,\n        };\n        conversation = await this.conversationService.createConversation(selectedIds, 'group', metadata);\n      }\n\n      const event = new AXComponentCloseEvent();\n      event.component = this;\n      event.data = conversation;\n      this.onClosed.emit(event);\n    } catch (error: unknown) {\n      console.error('Failed to create conversation:', error);\n      const message =\n        error &&\n        typeof error === 'object' &&\n        'message' in error &&\n        typeof (error as { message: unknown }).message === 'string'\n          ? (error as { message: string }).message\n          : this.translation.translateSync('@acorex:chat.errors.failed-to-create-conversation');\n      this.toastService.danger(message);\n    } finally {\n      this.creating.set(false);\n    }\n  }\n}\n","    <div class=\"new-conversation-panel\">\n      <div class=\"new-conversation-dialog-content\">\n        @if (showUserPickerStep()) {\n          <div class=\"form-field form-field--grow\">\n            <div class=\"users-list-wrap\">\n              <div class=\"users-list-search\">\n                <ax-search-box\n                  [value]=\"searchQuery()\"\n                  (valueChange)=\"onSearchChange($event)\"\n                  [disabled]=\"creating()\"\n                  [placeholder]=\"'@acorex:chat.placeholders.search-users' | translate | async\"\n                ></ax-search-box>\n              </div>\n              <ax-list\n                #usersList\n                class=\"users-list\"\n                [dataSource]=\"usersListDataSource\"\n                [multiple]=\"true\"\n                [checkbox]=\"false\"\n                [disabled]=\"creating()\"\n                [valueField]=\"'id'\"\n                [textField]=\"'name'\"\n                [itemHeight]=\"60\"\n                [ngModel]=\"selectedUserIds()\"\n                (ngModelChange)=\"onSelectedUsersChange($event ?? [])\"\n                [emptyTemplate]=\"usersListEmptyTpl()\"\n                [loadingTemplate]=\"usersListLoadingTpl()\"\n                [itemTemplate]=\"userItemTpl\"\n              ></ax-list>\n            </div>\n          </div>\n        }\n\n        @if (showGroupDetailsStep()) {\n          <div class=\"group-details-step\">\n            <div class=\"form-field\">\n              <input\n                class=\"title-input\"\n                [ngModel]=\"groupTitle()\"\n                (ngModelChange)=\"groupTitle.set($event ?? '')\"\n                [disabled]=\"creating()\"\n                [placeholder]=\"'@acorex:chat.placeholders.group-title-required' | translate | async\"\n              />\n            </div>\n            <div class=\"form-field\">\n              <ax-conversation-avatar-picker [(avatarUrl)]=\"groupAvatar\"></ax-conversation-avatar-picker>\n            </div>\n          </div>\n        }\n      </div>\n      <ax-footer class=\"dialog-footer\">\n        <ax-suffix>\n          @if (showGroupBackButton()) {\n            <ax-button\n              [text]=\"'@acorex:chat.actions.back' | translate | async\"\n              [look]=\"'solid'\"\n              [disabled]=\"creating()\"\n              (onClick)=\"onBackFromGroupDetails()\"\n            ></ax-button>\n          } @else {\n            <ax-button\n              [text]=\"'@acorex:chat.actions.cancel' | translate | async\"\n              [look]=\"'solid'\"\n              [disabled]=\"creating()\"\n              (onClick)=\"onCancel()\"\n            ></ax-button>\n          }\n          @if (showNextButton()) {\n            <ax-button\n              [text]=\"'@acorex:chat.actions.next' | translate | async\"\n              [look]=\"'solid'\"\n              [color]=\"'primary'\"\n              [disabled]=\"!canGoNextToGroupDetails() || creating()\"\n              (onClick)=\"onNextToGroupDetails()\"\n            ></ax-button>\n          }\n          @if (showCreateButton()) {\n            <ax-button\n              [text]=\"'@acorex:chat.actions.create' | translate | async\"\n              [look]=\"'solid'\"\n              [color]=\"'primary'\"\n              [disabled]=\"!canCreate() || creating()\"\n              (onClick)=\"onCreateConversation()\"\n            ></ax-button>\n          }\n        </ax-suffix>\n      </ax-footer>\n    </div>\n\n    <ng-template #usersListEmpty>\n      <div class=\"users-list-empty\">\n        @if (searchQuery()) {\n          {{ '@acorex:chat.dialog.new-conversation.no-users-search' | translate | async }}\n        } @else {\n          {{ '@acorex:chat.dialog.new-conversation.no-users-available' | translate | async }}\n        }\n      </div>\n    </ng-template>\n\n    <ng-template #usersListLoading>\n      <div class=\"user-item-skeleton\">\n        <ax-skeleton class=\"skeleton-checkbox\" [animated]=\"true\"></ax-skeleton>\n        <ax-skeleton class=\"skeleton-avatar\" [animated]=\"true\"></ax-skeleton>\n        <div class=\"skeleton-text\">\n          <ax-skeleton class=\"skeleton-name\" [animated]=\"true\"></ax-skeleton>\n          <ax-skeleton class=\"skeleton-description\" [animated]=\"true\"></ax-skeleton>\n        </div>\n      </div>\n    </ng-template>\n\n    <ng-template #userItemTpl let-item>\n      @if (userFromItem(item); as user) {\n        <div class=\"user-item-content\">\n          <input class=\"ax-checkbox\" type=\"checkbox\" [checked]=\"isUserSelected(user.id)\" tabindex=\"0\" />\n          <ax-conversation-avatar\n            kind=\"user\"\n            [userId]=\"user.id\"\n            [size]=\"48\"\n            [name]=\"user.name\"\n            [avatar]=\"user.avatar\"\n            [icon]=\"user.icon\"\n          />\n          <div class=\"user-item-text\">\n            <span class=\"truncated user-name-text\">{{ user.name }}</span>\n            @if (user.description) {\n              <span class=\"user-description-text truncated\">{{ user.description }}</span>\n            }\n          </div>\n        </div>\n      }\n    </ng-template>\n","/**\n * Conversation-specific upload/message types.\n * Storage contracts live in {@link @acorex/cdk/uploader}.\n */\n\nimport type { AXFileUploadOptions, AXUploadReference, AXUploadResult } from '@acorex/cdk/uploader';\n\nexport type AXConversationUploaderReference = AXUploadReference;\nexport type AXConversationUploaderResult = AXUploadResult;\n\n/** Upload options with conversation scope in metadata. */\nexport type AXConversationUploadOptions = Omit<AXFileUploadOptions, 'source'> & {\n  metadata?: Record<string, unknown> & { conversationId?: string };\n};\n\nexport interface AXConversationSendMessageUploadSource {\n  source: File | Blob;\n  fileName?: string;\n  mimeType?: string;\n  onProgress?: (percent: number) => void;\n  signal?: AbortSignal;\n}\n\nexport interface AXConversationSendMessageOptions {\n  media?: AXConversationSendMessageUploadSource;\n  localPreviewUrl?: string;\n}\n\nexport interface AXConversationUploaderFilePreview {\n  file: File;\n  preview?: string;\n  type: 'image' | 'video' | 'audio' | 'file';\n}\n","/**\n * Conversation Model\n * Represents a chat conversation (private, group, or channel)\n */\n\nimport type { InputSignal, Type } from '@angular/core';\nimport type { AXConversationMessage } from './message.model';\nimport type { AXConversationParticipant } from './participant.model';\n\nexport type AXConversationType = 'private' | 'group' | 'channel' | 'bot';\n\n/** Theme-specific CSS `background` values for the message list area. */\nexport interface AXConversationMessageListThemeBackground {\n  light: string;\n  dark: string;\n}\n\n/** Single CSS value (both themes) or per-theme `{ light, dark }` backgrounds. */\nexport type AXConversationMessageListBackground = string | AXConversationMessageListThemeBackground;\n\n/**\n * Conversation metadata\n * Extensible map for app-specific conversation data.\n */\nexport interface AXConversationMetadata extends Record<string, unknown> {\n  /** Optional custom background CSS for message list (per light/dark theme). */\n  messageListBackground?: AXConversationMessageListBackground;\n\n  /** Optional custom empty-state component for the message list. */\n  messageListEmptyComponent?: Type<AXConversationMessageListEmptyComponent>;\n\n  /**\n   * When `false`, hides reaction UI (add button, bubbles, picker) for this conversation.\n   * Defaults to `true` when omitted.\n   */\n  reactionsEnabled?: boolean;\n}\n\n/** Contract for custom empty-state components rendered by message list. */\nexport interface AXConversationMessageListEmptyComponent {\n  readonly conversation: InputSignal<AXConversation>;\n}\n\n/**\n * Main Conversation interface\n */\nexport interface AXConversation {\n  /** Unique conversation identifier */\n  id: string;\n\n  /** Conversation type */\n  type: AXConversationType;\n\n  /** User who created this conversation */\n  creatorId?: string;\n\n  /** Conversation title/name */\n  title: string;\n\n  /** Conversation avatar/image URL */\n  avatar?: string;\n\n  /**\n   * Font Awesome icon class(es) for this conversation when no image avatar is used\n   * (e.g. default placeholder for senders without a participant avatar/icon).\n   */\n  icon?: string;\n\n  /** Conversation description (for groups/channels) */\n  description?: string;\n\n  /** List of participants */\n  participants: AXConversationParticipant[];\n\n  /** Last message in the conversation */\n  lastMessage?: AXConversationMessage;\n\n  /** Timestamp of last message */\n  lastMessageAt: Date;\n\n  /** Number of unread messages */\n  unreadCount: number;\n\n  /** Number of unread mentions */\n  unreadMentions?: number;\n\n  /** Pinned messages IDs */\n  pinnedMessageIds?: string[];\n\n  /** Conversation creation timestamp */\n  createdAt: Date;\n\n  /** Last update timestamp */\n  updatedAt: Date;\n\n  /** Whether conversation is blocked */\n  blocked?: boolean;\n\n  /** Whether conversation is pinned */\n  pinned?: boolean;\n\n  /** Whether conversation is archived */\n  archived?: boolean;\n\n  /** Custom metadata */\n  metadata?: AXConversationMetadata;\n}\n\n/**\n * Typing indicator (realtime event — ephemeral, not stored on the room entity).\n */\nexport interface AXConversationTypingIndicator {\n  /** Conversation ID */\n  conversationId: string;\n\n  /** User ID who is typing */\n  userId: string;\n\n  /** User name */\n  userName?: string;\n\n  /** Timestamp */\n  timestamp: Date;\n\n  /** When false, user stopped typing */\n  isTyping?: boolean;\n}\n\n/**\n * Conversation filter options\n */\nexport interface AXConversationFilter {\n  /** Filter by type */\n  type?: AXConversationType;\n\n  /** Filter by unread */\n  unread?: boolean;\n\n  /** Filter by archived */\n  archived?: boolean;\n\n  /** Search query */\n  searchQuery?: string;\n\n  /** Filter by tags */\n  tags?: string[];\n\n  /** Custom filters */\n  custom?: Record<string, unknown>;\n}\n\n/**\n * Conversation sort options\n */\nexport interface AXConversationSort {\n  /** Sort field */\n  field: 'lastMessageAt' | 'title' | 'unreadCount' | 'createdAt';\n\n  /** Sort direction */\n  direction: 'asc' | 'desc';\n}\n","/**\n * Message Payload Types\n */\n\n/** Fields for one uploaded or remote media item. */\nexport interface AXConversationMediaItemFields {\n  /** HTTP(S) or other persistable URL; omit when only {@link mediaId} is stored. */\n  url?: string;\n  mediaId?: string;\n  mimeType?: string;\n  size?: number;\n  metadata?: Record<string, unknown>;\n}\n\nexport interface AXConversationTextFormat {\n  start: number;\n  end: number;\n  type: 'bold' | 'italic' | 'code' | 'strikethrough' | 'underline' | 'spoiler';\n}\n\nexport interface AXConversationMention {\n  start: number;\n  end: number;\n  userId: string;\n  userName: string;\n}\n\nexport interface AXConversationLink {\n  start: number;\n  end: number;\n  url: string;\n  preview?: AXConversationLinkPreview;\n}\n\nexport interface AXConversationLinkPreview {\n  title?: string;\n  description?: string;\n  image?: string;\n  siteName?: string;\n}\n\nexport interface AXConversationTextPayload {\n  type: 'text';\n  text: string;\n  formatting?: AXConversationTextFormat[];\n  mentions?: AXConversationMention[];\n  links?: AXConversationLink[];\n}\n\nexport interface AXConversationImageMediaItem extends AXConversationMediaItemFields {\n  thumbnailUrl?: string;\n  width: number;\n  height: number;\n  blurhash?: string;\n}\n\nexport interface AXConversationImagePayload {\n  type: 'image';\n  images: AXConversationImageMediaItem[];\n  caption?: string;\n}\n\nexport interface AXConversationVideoMediaItem extends AXConversationMediaItemFields {\n  thumbnailUrl?: string;\n  duration: number;\n  width: number;\n  height: number;\n}\n\nexport interface AXConversationVideoPayload {\n  type: 'video';\n  videos: AXConversationVideoMediaItem[];\n  caption?: string;\n}\n\nexport interface AXConversationAudioMediaItem extends AXConversationMediaItemFields {\n  duration: number;\n  title?: string;\n  artist?: string;\n  coverUrl?: string;\n  waveform?: number[];\n}\n\nexport interface AXConversationAudioPayload {\n  type: 'audio';\n  audios: AXConversationAudioMediaItem[];\n  caption?: string;\n}\n\nexport interface AXConversationVoicePayload extends AXConversationMediaItemFields {\n  type: 'voice';\n  duration: number;\n  waveform?: number[];\n  played?: boolean;\n}\n\nexport interface AXConversationFileMediaItem extends AXConversationMediaItemFields {\n  name: string;\n  mimeType: string;\n  thumbnailUrl?: string;\n  extension?: string;\n}\n\nexport interface AXConversationFilePayload {\n  type: 'file';\n  files: AXConversationFileMediaItem[];\n  caption?: string;\n}\n\nexport interface AXConversationLocationPayload {\n  type: 'location';\n  latitude: number;\n  longitude: number;\n  name?: string;\n  address?: string;\n  mapImageUrl?: string;\n  accuracy?: number;\n}\n\nexport interface AXConversationStickerPayload extends AXConversationMediaItemFields {\n  type: 'sticker';\n  id: string;\n  packId: string;\n  animated: boolean;\n  width?: number;\n  height?: number;\n  emoji?: string;\n}\n\nexport interface AXConversationPollOption {\n  id: string;\n  text: string;\n  votes: number;\n  voters?: string[];\n}\n\nexport interface AXConversationPollPayload {\n  type: 'poll';\n  question: string;\n  options: AXConversationPollOption[];\n  multipleChoice: boolean;\n  anonymous: boolean;\n  expiresAt?: Date;\n  totalVotes?: number;\n}\n\nexport interface AXConversationSystemPayload {\n  type: 'system';\n  eventType: 'user_joined' | 'user_left' | 'title_changed' | 'avatar_changed' | 'custom';\n  text: string;\n  userIds?: string[];\n  data?: Record<string, unknown>;\n}\n\nexport type AXConversationMessagePayload =\n  | AXConversationTextPayload\n  | AXConversationImagePayload\n  | AXConversationVideoPayload\n  | AXConversationAudioPayload\n  | AXConversationVoicePayload\n  | AXConversationFilePayload\n  | AXConversationLocationPayload\n  | AXConversationStickerPayload\n  | AXConversationPollPayload\n  | AXConversationSystemPayload;\n","/**\n * Message Model\n * Represents a single message in a conversation\n */\n\nimport type { AXConversationMessagePayload } from './message-payloads.model';\n\nexport type AXConversationMessageStatus = 'sending' | 'sent' | 'delivered' | 'read' | 'failed';\n\nexport type AXConversationMessageType =\n  | 'text'\n  | 'image'\n  | 'video'\n  | 'audio'\n  | 'voice'\n  | 'file'\n  | 'location'\n  | 'sticker'\n  | 'poll'\n  | 'system'\n  | string; // Allow custom types\n\n/**\n * Reaction on a message\n */\nexport interface AXConversationReaction {\n  /** Emoji character */\n  emoji: string;\n  /** User ID who reacted */\n  userId: string;\n  /** Reaction timestamp */\n  timestamp: Date;\n}\n\n/**\n * Message interface\n */\nexport interface AXConversationMessage {\n  /** Unique message identifier */\n  id: string;\n\n  /** Conversation ID this message belongs to */\n  conversationId: string;\n\n  /** Sender user ID */\n  senderId: string;\n\n  /** Message type */\n  type: AXConversationMessageType;\n\n  /**\n   * File-type catalog name when this message uses a composer file type (image, video, …).\n   * Omitted for text, location, system, etc.\n   */\n  fileType?: string;\n\n  /** Message creation timestamp */\n  timestamp: Date;\n\n  /** Type-specific message payload */\n  payload: AXConversationMessagePayload;\n\n  /** Message delivery/read status */\n  status: AXConversationMessageStatus;\n\n  /** Replied message reference (for quote replies) */\n  replyTo?: AXConversationMessage;\n\n  /** Whether this message was forwarded */\n  forwarded?: boolean;\n\n  /** Original sender information (if forwarded) */\n  forwardedFrom?: {\n    /** Original message ID */\n    messageId: string;\n    /** Original sender ID */\n    senderId: string;\n    /** Original sender name */\n    senderName?: string;\n    /** Original conversation ID */\n    conversationId: string;\n    /** Original conversation title */\n    conversationTitle?: string;\n  };\n\n  /** Message reactions */\n  reactions: AXConversationReaction[];\n\n  /**\n   * Total reply count when provided by the message API (`getMessages` or realtime).\n   * When omitted, the UI derives a minimum from loaded messages in the active conversation.\n   */\n  replyCount?: number;\n\n  /**\n   * Total forward count when provided by the message API (`getMessages` or realtime).\n   * When omitted, the UI derives a minimum from loaded messages in the active conversation.\n   */\n  forwardCount?: number;\n\n  /** Whether message is pinned */\n  pinned?: boolean;\n\n  /** Edit timestamp (if edited) */\n  editedAt?: Date;\n\n  /** Whether message is deleted */\n  deleted?: boolean;\n\n  /** Deleted timestamp */\n  deletedAt?: Date;\n\n  /** Local-only flag (not synced to server yet) */\n  isLocal?: boolean;\n\n  /** Custom metadata */\n  metadata?: Record<string, unknown>;\n}\n\n/**\n * Grouped reactions (emoji -> count and users)\n */\nexport interface AXConversationGroupedReaction {\n  /** Emoji character */\n  emoji: string;\n  /** Count of reactions */\n  count: number;\n  /** User IDs who reacted */\n  userIds: string[];\n  /** Whether current user reacted */\n  hasReacted: boolean;\n}\n\n/**\n * Command to send a new message\n */\nexport interface AXConversationSendMessageCommand {\n  /** Conversation ID */\n  conversationId: string;\n  /** Message type */\n  type: AXConversationMessageType;\n  /** File-type catalog when applicable (see {@link AXConversationMessage.fileType}). */\n  fileType?: string;\n  /** Message payload */\n  payload: AXConversationMessagePayload;\n  /** Reply to message ID (optional) */\n  replyToId?: string;\n  /** Temporary client-generated ID */\n  tempId?: string;\n  /** Whether this message is forwarded */\n  forwarded?: boolean;\n  /** Original sender information (if forwarded) */\n  forwardedFrom?: {\n    /** Original message ID */\n    messageId: string;\n    /** Original sender ID */\n    senderId: string;\n    /** Original conversation ID */\n    conversationId: string;\n    /** Original sender name */\n    senderName?: string;\n    /** Original conversation title */\n    conversationTitle?: string;\n  };\n  /** Custom metadata */\n  metadata?: Record<string, unknown>;\n}\n\n/**\n * Command to edit a message\n */\nexport interface AXConversationEditMessageCommand {\n  /** Message ID to edit */\n  messageId: string;\n  /** New payload */\n  payload: AXConversationMessagePayload;\n}\n\n/**\n * Command to delete a message\n */\nexport interface AXConversationDeleteMessageCommand {\n  /** Message ID to delete */\n  messageId: string;\n  /** Delete for everyone or just sender */\n  forEveryone?: boolean;\n}\n","/**\n * Participant Model\n * Membership in a conversation (identity fields are snapshots; live presence is on the user store).\n */\n\nexport type AXConversationParticipantRole = 'owner' | 'admin' | 'moderator' | 'member' | 'guest';\n\n/** Extended profile fields shown in private-chat info panels. */\nexport interface AXConversationUserProfile {\n  bio?: string;\n  phone?: string;\n  email?: string;\n  username?: string;\n  location?: string;\n  company?: string;\n  title?: string;\n}\n\n/** Authenticated user profile (includes per-room preferences). */\nexport interface AXConversationUser {\n  id: string;\n  name: string;\n  description?: string;\n  profile?: AXConversationUserProfile;\n  avatar?: string;\n  icon?: string;\n  metadata?: Record<string, unknown>;\n  /** User-specific settings per conversation (key = conversationId). */\n  conversationPreferences?: import('./room-preferences.model').AXConversationRoomPreferencesMap;\n}\n\nexport interface AXConversationParticipant {\n  /** Unique identifier for the participant */\n  id: string;\n\n  /** Display name of the participant */\n  name: string;\n\n  /**\n   * Short line shown under the name in lists (e.g. job title, status line).\n   * Distinct from long-form bio in optional `profile.bio`.\n   */\n  description?: string;\n\n  /** Optional extended profile details for private chats. */\n  profile?: AXConversationUserProfile;\n\n  /** Avatar/profile image URL */\n  avatar?: string;\n\n  /**\n   * Font Awesome icon class(es) used when `avatar` is not set (e.g. `'fa-light fa-user'`).\n   */\n  icon?: string;\n\n  /** Role in the conversation (for groups/channels) */\n  role?: AXConversationParticipantRole;\n\n  /** Custom metadata */\n  metadata?: Record<string, unknown>;\n}\n","/**\n * User presence — global per-user live state (not room-scoped).\n */\n\nexport type AXConversationPresenceStatus = 'online' | 'offline' | 'away' | 'busy';\n\n/** Live presence for a single user. */\nexport interface AXConversationUserPresence {\n  userId: string;\n  status: AXConversationPresenceStatus;\n  lastSeen?: Date;\n  statusText?: string;\n  updatedAt?: Date;\n}\n\n/** Realtime / API presence event payload. */\nexport interface AXConversationPresenceUpdate {\n  userId: string;\n  status: AXConversationPresenceStatus;\n  lastSeen?: Date;\n  statusText?: string;\n}\n","export function formatFileSize(bytes: number): string {\n  if (bytes < 1024) return `${bytes} B`;\n  if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n  if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n  return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`;\n}\n\nexport function formatDuration(seconds: number): string {\n  const mins = Math.floor(seconds / 60);\n  const secs = Math.floor(seconds % 60);\n  return `${mins}:${secs.toString().padStart(2, '0')}`;\n}\n","import type { AXFileCopyData, AXFileType } from '@acorex/core/file';\nimport { AXFileTypeInfoProvider, createFileTypeMetadata } from '@acorex/core/file';\nimport { isPlatformBrowser } from '@angular/common';\nimport { Injectable } from '@angular/core';\nimport type { AXConversationAudioPayload } from '../../../../models';\nimport { AX_CONVERSATION_AUDIO_CATALOG } from '../../../../models/message-file-type-catalog';\nimport { normalizeAudioPayload } from '../../../message-list/components/audio-renderer/audio.payload';\nimport { formatDuration, formatFileSize } from '../shared/media-formatters';\n\nexport { AX_CONVERSATION_AUDIO_CATALOG };\n\nconst MB = 1024 * 1024;\n\nexport const AX_CONVERSATION_AUDIO_PRESENTATION = {\n  icon: 'fa-light fa-music text-amber-500',\n  title: 'Audio',\n} as const;\n\ntype AXConversationFileTypeUtilityContext = {\n  readAsDataUrl: (file: File | Blob) => Promise<string>;\n  platformId: object;\n};\n\nconst AX_CONVERSATION_AUDIO_UTILITY = {\n  preview: 'preview',\n  duration: 'duration',\n  formatSize: 'formatSize',\n  formatDuration: 'formatDuration',\n  createLocalPreviewUrl: 'createLocalPreviewUrl',\n} as const;\n\nfunction blobUrl(ctx: AXConversationFileTypeUtilityContext, blob: Blob): string {\n  if (!isPlatformBrowser(ctx.platformId)) {\n    return '';\n  }\n  return URL.createObjectURL(blob);\n}\n\nfunction mediaDuration(ctx: AXConversationFileTypeUtilityContext, file: File | Blob): Promise<number> {\n  if (!isPlatformBrowser(ctx.platformId)) {\n    return Promise.resolve(0);\n  }\n  return new Promise((resolve, reject) => {\n    const el = document.createElement('audio');\n    el.preload = 'metadata';\n    el.onloadedmetadata = () => {\n      URL.revokeObjectURL(el.src);\n      resolve(el.duration);\n    };\n    el.onerror = () => {\n      URL.revokeObjectURL(el.src);\n      reject(new Error('Failed to load audio metadata'));\n    };\n    el.src = URL.createObjectURL(file);\n  });\n}\n\nexport function conversationAudioUtilities(): NonNullable<AXFileType['utilities']> {\n  return {\n    [AX_CONVERSATION_AUDIO_UTILITY.preview]: (ctx, file) =>\n      (ctx as AXConversationFileTypeUtilityContext).readAsDataUrl(file as File),\n    [AX_CONVERSATION_AUDIO_UTILITY.duration]: (ctx, file) =>\n      mediaDuration(ctx as AXConversationFileTypeUtilityContext, file as File | Blob),\n    [AX_CONVERSATION_AUDIO_UTILITY.formatSize]: (_ctx, bytes) => formatFileSize(bytes as number),\n    [AX_CONVERSATION_AUDIO_UTILITY.formatDuration]: (_ctx, seconds) => formatDuration(seconds as number),\n    [AX_CONVERSATION_AUDIO_UTILITY.createLocalPreviewUrl]: (ctx, source) =>\n      blobUrl(ctx as AXConversationFileTypeUtilityContext, source as Blob),\n  };\n}\n\nexport function createConversationAudioFileType(): AXFileType {\n  const presentation = AX_CONVERSATION_AUDIO_PRESENTATION;\n  return {\n    name: AX_CONVERSATION_AUDIO_CATALOG,\n    metadata: createFileTypeMetadata('conversation'),\n    title: presentation.title,\n    icon: presentation.icon,\n    validations: {\n      mimeTypes: ['audio/*'],\n      minSize: 1,\n      maxSize: 50 * MB,\n    },\n    extensions: [\n      { name: 'mp3', title: 'MP3' },\n      { name: 'wav', title: 'WAV', validations: { maxSize: 30 * MB } },\n      { name: 'ogg', title: 'OGG' },\n      { name: 'm4a', title: 'M4A' },\n    ],\n    utilities: conversationAudioUtilities(),\n    copy: (payload): AXFileCopyData => {\n      const audio = normalizeAudioPayload(payload as AXConversationAudioPayload);\n      const caption = audio.caption?.trim();\n      const items = audio.audios.map((item) => ({\n        url: item.url?.trim(),\n        title: item.title?.trim(),\n      }));\n      return {\n        text: caption ?? '',\n        meta: { kind: 'audio', caption, items, count: audio.audios.length },\n      };\n    },\n  };\n}\n\n@Injectable({ providedIn: 'root' })\nexport class AXConversationAudioFileTypeProvider extends AXFileTypeInfoProvider {\n  items() {\n    return Promise.resolve([createConversationAudioFileType()]);\n  }\n}\n","import type { AXUploadResult } from '@acorex/cdk/uploader';\nimport type { AXConversationAudioMediaItem, AXConversationAudioPayload, AXConversationMessagePayload } from '../../../../models';\nimport type { AXConversationUploaderResult } from '../../../../models/conversation-upload.types';\nimport { normalizeAudioPayload } from '../../../message-list/components/audio-renderer/audio.payload';\nimport { resolvePersistableMediaUrl } from '../shared/persisted-media-url';\n\nexport function audioItemFromUpload(file: File, result: AXConversationUploaderResult, duration: number): AXConversationAudioMediaItem {\n  const url = resolvePersistableMediaUrl(result.url);\n  const item: AXConversationAudioMediaItem = {\n    mediaId: result.mediaId,\n    mimeType: result.mimeType,\n    size: result.size,\n    duration,\n    title: file.name,\n    metadata: result.metadata,\n  };\n  if (url) {\n    item.url = url;\n  }\n  return item;\n}\n\nexport function mergeAudioUploadResult(\n  payload: AXConversationMessagePayload,\n  result: AXUploadResult,\n): AXConversationMessagePayload {\n  const base = normalizeAudioPayload(payload as AXConversationAudioPayload);\n  const audios = [...base.audios];\n  const i = audios.findIndex((x) => !x.mediaId && !resolvePersistableMediaUrl(x.url));\n  const slot = i >= 0 ? audios[i] : undefined;\n  const url = resolvePersistableMediaUrl(result.url);\n  const next: AXConversationAudioMediaItem = {\n    ...(slot ?? { duration: 0 }),\n    mediaId: result.mediaId,\n    mimeType: result.mimeType,\n    size: result.size,\n    metadata: result.metadata,\n  };\n  if (url) {\n    next.url = url;\n  }\n  if (i >= 0) audios[i] = next;\n  else audios.push(next);\n  return { ...base, type: 'audio', audios };\n}\n\nexport function applyAudioLocalPreview(\n  payload: AXConversationMessagePayload,\n  localUrl: string,\n  mimeType = 'application/octet-stream',\n): AXConversationMessagePayload {\n  const base = normalizeAudioPayload(payload as AXConversationAudioPayload);\n  const audios = [...base.audios];\n  const slot = audios.findIndex((x) => !x.mediaId && !resolvePersistableMediaUrl(x.url));\n  const preview = { url: localUrl, duration: 0, mimeType };\n  if (slot >= 0) {\n    audios[slot] = { ...audios[slot], ...preview };\n  } else if (audios.length === 0) {\n    audios.push(preview);\n  } else {\n    audios[0] = { ...audios[0], ...preview };\n  }\n  return { ...base, type: 'audio', audios };\n}\n","/**\n * Picker Header Component\n * Telegram-style header: close, title, overflow menu.\n */\n\nimport { AXButtonComponent, AXButtonItemComponent, AXButtonItemListComponent } from '@acorex/components/button';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXDropdownPanelComponent } from '@acorex/components/dropdown';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport { AsyncPipe } from '@angular/common';\nimport { Component, ViewEncapsulation, input, output } from '@angular/core';\n\n@Component({\n  selector: 'ax-conversation-picker-header',\n  encapsulation: ViewEncapsulation.None,\n  imports: [\n    AXTranslationModule,\n    AsyncPipe,\n    AXButtonComponent,\n    AXButtonItemComponent,\n    AXButtonItemListComponent,\n    AXDecoratorModule,\n    AXDropdownPanelComponent,\n  ],\n  templateUrl: './picker-header.component.html',\n  styleUrl: './picker-header.component.css',\n})\nexport class AXConversationPickerHeaderComponent {\n  readonly title = input.required<string>();\n  readonly showMenu = input(false);\n  readonly addMoreLabel = input('Add more files');\n  readonly onClose = output<void>();\n  readonly onAddMore = output<void>();\n}\n","<div class=\"ax-conversation-picker-header\">\n  <button\n    type=\"button\"\n    class=\"ax-conversation-picker-header__close\"\n    (click)=\"onClose.emit()\"\n    [attr.aria-label]=\"'@acorex:chat.actions.close' | translate | async\"\n  >\n    <i class=\"fa-light fa-xmark\"></i>\n  </button>\n\n  <span class=\"ax-conversation-picker-header__title\">{{ title() }}</span>\n\n  @if (showMenu()) {\n    <ax-button class=\"ax-conversation-picker-header__menu rounded-full\" look=\"blank\" [iconOnly]=\"true\">\n      <ax-icon><i class=\"fa-light fa-ellipsis-vertical\"></i></ax-icon>\n      <ax-dropdown-panel>\n        <ax-button-item-list>\n          <ax-button-item [text]=\"addMoreLabel()\" (onClick)=\"onAddMore.emit()\">\n            <ax-prefix>\n              <ax-icon><i class=\"fa-light fa-plus\"></i></ax-icon>\n            </ax-prefix>\n          </ax-button-item>\n        </ax-button-item-list>\n      </ax-dropdown-panel>\n    </ax-button>\n  } @else {\n    <span class=\"ax-conversation-picker-header__menu-spacer\" aria-hidden=\"true\"></span>\n  }\n</div>\n","import { AXPopoverComponent } from '@acorex/components/popover';\nimport { AXTextBoxModule } from '@acorex/components/text-box';\nimport type { AXHtmlEvent } from '@acorex/cdk/common';\nimport { AXTranslationModule, AXTranslationService } from '@acorex/core/translation';\nimport { Component, ViewEncapsulation, inject, input, model, output, signal, viewChild } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { AXConversationComposerPopupComponent } from '../../../../components/composer/composer-popup.component';\nimport type { AXConversationStickerPayload } from '../../../../models';\n\n/** Caption field with emoji picker for composer media pickers. */\n@Component({\n  selector: 'ax-conversation-picker-caption',\n  encapsulation: ViewEncapsulation.None,\n  imports: [\n    AXTextBoxModule,\n    AXTranslationModule,\n    FormsModule,\n    AXPopoverComponent,\n    AXConversationComposerPopupComponent,\n  ],\n  templateUrl: './picker-caption.component.html',\n  styleUrls: ['./picker-caption.component.css', '../../../../components/composer/composer-popup.component.css'],\n})\nexport class AXConversationPickerCaptionComponent {\n  readonly translation = inject(AXTranslationService);\n  readonly caption = model('');\n  readonly sendDisabled = input(true);\n  readonly onSend = output<void>();\n\n  readonly emojiPopoverTarget = signal<HTMLElement | null>(null);\n  private readonly emojiPopoverRef = viewChild<AXPopoverComponent>('emojiPopover');\n\n  onEmojiClick(event: MouseEvent): void {\n    const target = event.currentTarget;\n    if (!(target instanceof HTMLElement)) {\n      return;\n    }\n\n    const popover = this.emojiPopoverRef();\n    if (popover?.isOpen) {\n      popover.close();\n      this.emojiPopoverTarget.set(null);\n      return;\n    }\n\n    this.emojiPopoverTarget.set(target);\n    setTimeout(() => this.emojiPopoverRef()?.open(), 0);\n  }\n\n  onEmojiPopoverClosed(): void {\n    this.emojiPopoverTarget.set(null);\n  }\n\n  onEmojiItemSelected = (item: string | AXConversationStickerPayload): void => {\n    if (typeof item === 'string') {\n      this.caption.update((value) => value + item);\n    }\n    this.emojiPopoverRef()?.close();\n  };\n\n  onCaptionKeyDown(event: AXHtmlEvent<KeyboardEvent>): void {\n    const key = event?.nativeEvent?.key;\n    const shiftKey = event?.nativeEvent?.shiftKey;\n\n    if (key === 'Enter' && !shiftKey) {\n      event?.nativeEvent?.preventDefault();\n      if (!this.sendDisabled()) {\n        this.onSend.emit();\n      }\n    }\n  }\n}\n","<div class=\"ax-conversation-picker-caption\">\n  <!-- <button\n    type=\"button\"\n    class=\"ax-conversation-picker-caption__emoji\"\n    (click)=\"onEmojiClick($event)\"\n    [attr.aria-label]=\"translation.translateSync('@acorex:chat.tooltips.emoji')\"\n  >\n    <i class=\"fa-light fa-face-smile\"></i>\n  </button> -->\n\n  <div class=\"ax-conversation-picker-caption__field\">\n    <ax-text-box\n      [(value)]=\"caption\"\n      [look]=\"'none'\"\n      [placeholder]=\"translation.translateSync('@acorex:chat.pickers.common.caption-optional')\"\n      (onKeyDown)=\"onCaptionKeyDown($event)\"\n    />\n  </div>\n\n  <button\n    type=\"button\"\n    class=\"ax-conversation-picker-caption__send\"\n    [disabled]=\"sendDisabled()\"\n    (click)=\"onSend.emit()\"\n    [attr.aria-label]=\"translation.translateSync('@acorex:chat.actions.send')\"\n  >\n    <i class=\"fa-solid fa-paper-plane\"></i>\n  </button>\n</div>\n\n@if (emojiPopoverTarget()) {\n  <ax-popover\n    #emojiPopover\n    [target]=\"emojiPopoverTarget()\"\n    [openOn]=\"'manual'\"\n    [closeOn]=\"'clickOut'\"\n    [placement]=\"'top-start'\"\n    panelClass=\"composer-emoji-popover-panel\"\n    (onClosed)=\"onEmojiPopoverClosed()\"\n  >\n    <div class=\"composer-emoji-popover\">\n      <ax-conversation-composer-popup [onItemSelected]=\"onEmojiItemSelected\" />\n    </div>\n  </ax-popover>\n}\n","import { AXUploaderBrowseDirective } from '@acorex/cdk/uploader';\nimport { Component, ElementRef, ViewEncapsulation, inject, input } from '@angular/core';\n\n@Component({\n  selector: 'ax-conversation-picker-empty',\n  encapsulation: ViewEncapsulation.None,\n  imports: [AXUploaderBrowseDirective],\n  templateUrl: './picker-empty.component.html',\n  styleUrls: ['./picker-shared.css'],\n})\nexport class AXConversationPickerEmptyComponent {\n  private readonly host = inject(ElementRef<HTMLElement>);\n\n  readonly title = input.required<string>();\n  readonly hint = input.required<string>();\n  readonly iconClass = input.required<string>();\n  readonly dragOver = input(false);\n\n  onKeyboardActivate(event: Event): void {\n    event.preventDefault();\n    this.host.nativeElement.click();\n  }\n}\n","<div\n  class=\"ax-conversation-picker__empty\"\n  [class.ax-conversation-picker__empty--drag]=\"dragOver()\"\n  role=\"button\"\n  tabindex=\"0\"\n  axUploaderBrowseHandle\n  (keydown.enter)=\"onKeyboardActivate($event)\"\n  (keydown.space)=\"onKeyboardActivate($event)\"\n>\n  <i class=\"ax-conversation-picker__empty-icon\" [class]=\"iconClass()\"></i>\n  <p class=\"ax-conversation-picker__empty-title\">{{ title() }}</p>\n  <p class=\"ax-conversation-picker__empty-hint\">{{ hint() }}</p>\n</div>\n","/**\n * Shared upload state and helpers for composer media pickers.\n */\n\nimport { AXUploaderService } from '@acorex/cdk/uploader';\nimport { AXToastService } from '@acorex/components/toast';\nimport type { AXActionSheetRef } from '@acorex/components/action-sheet';\nimport type { AXPopupRef } from '@acorex/components/popup';\nimport { formatFileSizeBytes } from '@acorex/core/file';\nimport type { AXTranslationService } from '@acorex/core/translation';\nimport type { AXValidationRuleResult } from '@acorex/core/validation';\nimport type { AXConversationComposerService } from '../../../../components/composer/composer.service';\nimport type { AXConversationUploaderReference } from '../../../../models/conversation-upload.types';\n\nlet pickerUploadItemIdSeq = 0;\n\n/** Stable id for `@for` tracking while upload state is patched immutably. */\nexport function createPickerUploadItemId(): string {\n  if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n    return crypto.randomUUID();\n  }\n  pickerUploadItemIdSeq += 1;\n  return `picker-upload-${pickerUploadItemIdSeq}`;\n}\n\nexport interface AXConversationComposerPickerUploadItem {\n  id: string;\n  file: File;\n  preview?: string;\n  duration?: number;\n  uploadProgress?: number;\n  uploading?: boolean;\n  uploaded?: boolean;\n  uploadedUrl?: string;\n  mediaId?: string;\n  error?: string;\n  abortController?: AbortController;\n}\n\nexport function getPickerCancelUploadLabel(translation: AXTranslationService): string {\n  return translation.translateSync('@acorex:chat.pickers.common.cancel-upload');\n}\n\nexport function abortPickerUploads(items: Iterable<{ abortController?: AbortController } | null | undefined>): void {\n  for (const item of items) {\n    const controller = item?.abortController;\n    if (controller && !controller.signal.aborted) {\n      controller.abort();\n    }\n  }\n}\n\nexport interface AXConversationCleanupPickerUploadsOptions {\n  retainUploaded?: boolean;\n}\n\n/** Upload finished; reference is {@link mediaId} and/or a non-empty session url. */\nexport function isPickerItemReadyToSend(\n  item: Pick<AXConversationComposerPickerUploadItem, 'uploaded' | 'uploadedUrl' | 'mediaId'>,\n): boolean {\n  return !!item.uploaded && !!(item.mediaId || item.uploadedUrl?.trim());\n}\n\n/** Build uploader result shape for {@link *ItemFromUpload} after picker upload. */\nexport function pickerItemToUploadResult(\n  item: Pick<AXConversationComposerPickerUploadItem, 'uploaded' | 'uploadedUrl' | 'mediaId' | 'file'>,\n): { url: string; mediaId?: string; mimeType: string; size: number } | null {\n  if (!isPickerItemReadyToSend(item)) {\n    return null;\n  }\n  return {\n    url: item.uploadedUrl?.trim() ?? '',\n    mediaId: item.mediaId,\n    mimeType: item.file.type,\n    size: item.file.size,\n  };\n}\n\nexport function pickerItemToMediaReference(\n  item: Pick<AXConversationComposerPickerUploadItem, 'uploaded' | 'uploadedUrl' | 'mediaId' | 'file'>,\n): AXConversationUploaderReference | null {\n  if (!isPickerItemReadyToSend(item)) {\n    return null;\n  }\n  return {\n    url: item.uploadedUrl,\n    mediaId: item.mediaId,\n    mimeType: item.file.type,\n    size: item.file.size,\n  };\n}\n\nexport async function deleteUploadedPickerMedia(\n  uploader: AXUploaderService,\n  items: Iterable<AXConversationComposerPickerUploadItem | null | undefined>,\n): Promise<void> {\n  const tasks: Promise<void>[] = [];\n  for (const item of items) {\n    const reference = item ? pickerItemToMediaReference(item) : null;\n    if (reference) {\n      tasks.push(\n        uploader.deleteMedia(reference).catch(() => {\n          /* ignore cleanup failures */\n        }),\n      );\n    }\n  }\n  await Promise.all(tasks);\n}\n\nexport function cleanupPickerUploads(\n  uploader: AXUploaderService,\n  items: Iterable<AXConversationComposerPickerUploadItem | null | undefined>,\n  options?: AXConversationCleanupPickerUploadsOptions,\n): void {\n  abortPickerUploads(items);\n  if (!options?.retainUploaded) {\n    void deleteUploadedPickerMedia(uploader, items);\n  }\n  revokePickerBlobPreviews(items);\n}\n\nexport function revokePickerBlobPreviews(items: Iterable<{ preview?: string } | null | undefined>): void {\n  if (typeof URL === 'undefined' || typeof URL.revokeObjectURL !== 'function') {\n    return;\n  }\n  for (const item of items) {\n    const preview = item?.preview;\n    if (preview?.startsWith('blob:')) {\n      URL.revokeObjectURL(preview);\n    }\n  }\n}\n\nexport function isUploadAborted(error: unknown, signal?: AbortSignal): boolean {\n  if (signal?.aborted) {\n    return true;\n  }\n  const code = (error as { code?: string } | null)?.code;\n  return code === 'UPLOAD_ABORTED' || code === 'RESOLVE_ABORTED';\n}\n\nexport function limitFilesToCapacity(files: File[], currentCount: number, maxFiles: number): File[] {\n  return files.slice(0, Math.max(0, maxFiles - currentCount));\n}\n\nexport async function uploadPickerFile(\n  uploader: AXUploaderService,\n  conversationId: string,\n  file: File,\n  onProgress: (percent: number) => void,\n  signal?: AbortSignal,\n): Promise<{ url: string; mediaId?: string; mimeType: string; size: number }> {\n  return uploader.upload({\n    source: file,\n    fileName: file.name,\n    mimeType: file.type,\n    onProgress,\n    signal,\n    metadata: { conversationId },\n  });\n}\n\nexport function notifyMaxFilesCapacityExceeded(\n  toast: AXToastService,\n  translation: AXTranslationService,\n  maxFiles: number,\n): void {\n  toast.warning(\n    translation.translateSync('@acorex:chat.errors.max-files-per-message', {\n      params: { count: maxFiles },\n    }),\n  );\n}\n\n/** User-facing message for a file validation failure. */\nexport function formatPickerValidationMessage(\n  translation: AXTranslationService,\n  file: File,\n  error: AXValidationRuleResult | undefined,\n): string {\n  if (!error) {\n    return translation.translateSync('@acorex:chat.errors.upload-failed');\n  }\n\n  const maxSize = typeof error['maxSize'] === 'number' ? error['maxSize'] : undefined;\n  const minSize = typeof error['minSize'] === 'number' ? error['minSize'] : undefined;\n\n  switch (error.rule) {\n    case 'fileMaxSize':\n      return translation.translateSync('@acorex:chat.errors.file-size-exceeds-limit', {\n        params: {\n          fileName: file.name,\n          fileSize: formatFileSizeBytes(file.size),\n          maxSize: formatFileSizeBytes(maxSize ?? 0),\n        },\n      });\n    case 'fileMinSize':\n      return translation.translateSync('@acorex:chat.errors.file-below-minimum-size', {\n        params: {\n          fileName: file.name,\n          minSize: formatFileSizeBytes(minSize ?? 0),\n        },\n      });\n    case 'fileMimeType':\n      return translation.translateSync('@acorex:chat.errors.file-type-not-allowed', {\n        params: {\n          fileName: file.name,\n          fileType: (file.type || 'unknown').trim() || 'unknown',\n        },\n      });\n    default:\n      return error.message?.trim()\n        ? file.name\n          ? `${file.name}: ${error.message}`\n          : error.message\n        : translation.translateSync('@acorex:chat.errors.upload-failed');\n  }\n}\n\n/** Show a warning toast for each failed validation rule result. */\nexport function notifyPickerValidationErrors(\n  toast: AXToastService,\n  translation: AXTranslationService,\n  rejected: { file: File; errors: AXValidationRuleResult[] }[],\n): void {\n  for (const { file, errors } of rejected) {\n    toast.warning(formatPickerValidationMessage(translation, file, errors[0]));\n  }\n}\n\n/** Close popup/action-sheet host or inline composer shell after send/cancel. */\nexport function dismissComposerPickerHost(\n  composerService: AXConversationComposerService,\n  popupRef?: AXPopupRef | null,\n  actionSheetRef?: AXActionSheetRef | null,\n): void {\n  if (popupRef) {\n    popupRef.close();\n    return;\n  }\n  if (actionSheetRef) {\n    actionSheetRef.close();\n    return;\n  }\n  composerService.hideComponent();\n}\n","import { AXUploaderFileChangeEvent, AXUploaderZoneDirective } from '@acorex/cdk/uploader';\nimport { AXToastService } from '@acorex/components/toast';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { Component, ViewEncapsulation, inject, input, output, viewChild } from '@angular/core';\nimport { notifyPickerValidationErrors } from './picker-upload';\n\n/**\n * Wraps composer pickers with {@link AXUploaderZoneDirective} for browse, drop, and validation.\n */\n@Component({\n  selector: 'ax-conversation-picker-shell',\n  encapsulation: ViewEncapsulation.None,\n  imports: [AXUploaderZoneDirective],\n  styleUrl: './picker-shell.component.css',\n  templateUrl: './picker-shell.component.html',\n})\nexport class AXConversationPickerShellComponent {\n  private readonly toast = inject(AXToastService);\n  private readonly translation = inject(AXTranslationService);\n  private readonly zone = viewChild(AXUploaderZoneDirective);\n\n  readonly fileType = input.required<string>();\n  readonly multiple = input(false);\n\n  readonly filesSelected = output<File[]>();\n  readonly dragEnter = output<DragEvent>();\n  readonly dragLeave = output<DragEvent>();\n  readonly dragOver = output<DragEvent>();\n\n  /** Open the OS file picker for this shell's catalog. */\n  browse(): Promise<void> {\n    return this.zone()?.browser() ?? Promise.resolve();\n  }\n\n  protected onZoneFileChange(event: AXUploaderFileChangeEvent): void {\n    if (event.rejected?.length) {\n      notifyPickerValidationErrors(this.toast, this.translation, event.rejected);\n    }\n    if (event.files.length > 0) {\n      this.filesSelected.emit(event.files);\n    }\n  }\n}\n","<div\n  class=\"ax-conversation-picker\"\n  axUploaderZone\n  [fileType]=\"fileType()\"\n  [multiple]=\"multiple()\"\n  [disableBrowse]=\"true\"\n  (fileChange)=\"onZoneFileChange($event)\"\n  (dragEnter)=\"dragEnter.emit($event)\"\n  (dragLeave)=\"dragLeave.emit($event)\"\n  (dragOver)=\"dragOver.emit($event)\"\n>\n  <div class=\"ax-conversation-picker__content\">\n    <ng-content />\n  </div>\n</div>\n","import { AXUploaderService } from '@acorex/cdk/uploader';\nimport type { AXFileTypeRegistryService } from '@acorex/core/file';\nimport type { AXToastService } from '@acorex/components/toast';\nimport type { AXTranslationService } from '@acorex/core/translation';\nimport { afterNextRender, type InputSignal } from '@angular/core';\nimport { ensureConversationFileCatalogRegistered } from '../../composer-actions/conversation-composer-file-types.provider';\nimport { notifyPickerValidationErrors } from './picker-upload';\n\nexport interface ComposerPickerAutoRunBrowseOptions {\n  fileTypeRegistry: AXFileTypeRegistryService;\n  uploader: AXUploaderService;\n  toast: AXToastService;\n  translation: AXTranslationService;\n  catalogFileType: string;\n  maxFiles: number;\n  hasExistingFiles: () => boolean;\n  handleFiles: (files: File[]) => void | Promise<void>;\n  onCancelled: () => void;\n}\n\n/** Open the OS file dialog after the picker panel is mounted, then start uploads. */\nexport async function runComposerPickerAutoRunBrowse(options: ComposerPickerAutoRunBrowseOptions): Promise<void> {\n  if (options.hasExistingFiles()) {\n    return;\n  }\n\n  await ensureConversationFileCatalogRegistered(options.fileTypeRegistry, options.catalogFileType);\n\n  const { accepted, rejected } = await options.uploader.chooseFiles({\n    fileType: options.catalogFileType,\n    multiple: options.maxFiles > 1,\n  });\n\n  notifyPickerValidationErrors(options.toast, options.translation, rejected);\n\n  if (accepted.length === 0) {\n    options.onCancelled();\n    return;\n  }\n\n  await options.handleFiles(accepted);\n}\n\ntype ComposerPickerAutoRunHost = {\n  autoRun: InputSignal<boolean>;\n  initialFiles: InputSignal<File[]>;\n  activate: () => void | Promise<void>;\n  seedFiles: (files: File[]) => void | Promise<void>;\n};\n\n/**\n * After the upload panel is rendered, seed drag-and-drop files or run {@link activate}.\n */\nexport function installComposerPickerAutoRun(host: ComposerPickerAutoRunHost): void {\n  afterNextRender(() => {\n    const prefilled = host.initialFiles();\n    if (prefilled.length > 0) {\n      void host.seedFiles([...prefilled]);\n      return;\n    }\n\n    if (!host.autoRun()) {\n      return;\n    }\n\n    void host.activate();\n  });\n}\n","/**\n * Audio Picker Component\n * Full-width audio file selection interface for the composer\n */\n\nimport { AXUploaderService } from '@acorex/cdk/uploader';\nimport type { AXActionSheetRef } from '@acorex/components/action-sheet';\nimport type { AXPopupRef } from '@acorex/components/popup';\nimport { AXProgressBarModule } from '@acorex/components/progress-bar';\nimport { AXToastService } from '@acorex/components/toast';\nimport {\n  AXFileService,\n  AXFileTypeRegistryService,\n  runFileTypeUtility,\n  runFileTypeUtilityForFile,\n  type AXFileType,\n} from '@acorex/core/file';\nimport { AXTranslationModule, AXTranslationService } from '@acorex/core/translation';\nimport { CommonModule } from '@angular/common';\nimport { Component, OnDestroy, PLATFORM_ID, ViewEncapsulation, computed, inject, input, signal, viewChild } from '@angular/core';\nimport { AXConversationComposerService } from '../../../../components/composer/composer.service';\nimport { AXConversation, AXConversationSendMessageCommand } from '../../../../models';\nimport type { AXConversationComposerActionComponent } from '../../../../registries/composer-action.registry';\nimport { AXConversationPickerHeaderComponent } from '../picker-header/picker-header.component';\nimport { AXConversationPickerCaptionComponent } from '../shared/picker-caption.component';\nimport { AXConversationPickerEmptyComponent } from '../shared/picker-empty.component';\nimport { AXConversationPickerShellComponent } from '../shared/picker-shell.component';\nimport {\n  cleanupPickerUploads,\n  createPickerUploadItemId,\n  dismissComposerPickerHost,\n  getPickerCancelUploadLabel,\n  isUploadAborted,\n  limitFilesToCapacity,\n  notifyMaxFilesCapacityExceeded,\n  notifyPickerValidationErrors,\n  pickerItemToUploadResult,\n  uploadPickerFile,\n  type AXConversationComposerPickerUploadItem,\n} from '../shared/picker-upload';\nimport { installComposerPickerAutoRun, runComposerPickerAutoRunBrowse } from '../shared/picker-auto-run';\nimport { audioItemFromUpload } from './audio-composer.payload';\nimport {\n  AX_CONVERSATION_AUDIO_CATALOG,\n  AX_CONVERSATION_AUDIO_PRESENTATION,\n  createConversationAudioFileType,\n} from './conversation-audio.file-type';\n\ninterface AXConversationAudioFile extends AXConversationComposerPickerUploadItem {\n  duration?: number;\n  dataUrl?: string;\n}\n\n@Component({\n  selector: 'ax-conversation-audio-picker',\n  encapsulation: ViewEncapsulation.None,\n  imports: [\n    CommonModule,\n    AXProgressBarModule,\n    AXTranslationModule,\n    AXConversationPickerHeaderComponent,\n    AXConversationPickerEmptyComponent,\n    AXConversationPickerCaptionComponent,\n    AXConversationPickerShellComponent,\n  ],\n  templateUrl: './audio-picker.component.html',\n  styleUrls: ['../shared/picker-shared.css'],\n})\nexport class AXConversationAudioPickerComponent implements OnDestroy, AXConversationComposerActionComponent {\n  private uploadsDismissed = false;\n  private retainUploadedOnDismiss = false;\n  readonly service = input<AXConversationComposerService | undefined>();\n  private readonly composerServiceFromInjector = inject(AXConversationComposerService, { optional: true });\n\n  private get composerService(): AXConversationComposerService {\n    const svc = this.service() ?? this.composerServiceFromInjector;\n    if (!svc) {\n      throw new Error('AXConversationComposerService is required for the audio picker');\n    }\n    return svc;\n  }\n  private readonly uploader = inject(AXUploaderService);\n  private readonly fileService = inject(AXFileService);\n  private readonly fileTypeRegistry = inject(AXFileTypeRegistryService);\n  private readonly platformId = inject(PLATFORM_ID);\n  private readonly toast = inject(AXToastService);\n  readonly translation = inject(AXTranslationService);\n\n  readonly conversation = input.required<AXConversation>();\n  readonly maxFiles = input<number>(10);\n  readonly initialFiles = input<File[]>([]);\n  readonly autoRun = input(false);\n  readonly __popup__ = input<AXPopupRef | undefined>();\n  readonly __actionSheet__ = input<AXActionSheetRef | undefined>();\n\n  readonly catalogFileType = AX_CONVERSATION_AUDIO_CATALOG;\n\n  readonly audioFiles = signal<AXConversationAudioFile[]>([]);\n  readonly isDragging = signal(false);\n  private readonly pickerShell = viewChild<AXConversationPickerShellComponent>('pickerShell');\n  readonly typeIconClass = AX_CONVERSATION_AUDIO_PRESENTATION.icon;\n  readonly emptyIconClass = computed(() =>\n    this.isDragging() ? 'fa-light fa-cloud-arrow-up' : AX_CONVERSATION_AUDIO_PRESENTATION.icon,\n  );\n\n  private catalogFileTypeDef?: AXFileType;\n  caption = '';\n\n  readonly allowMultiple = computed(() => this.maxFiles() > 1);\n\n  constructor() {\n    this.fileTypeRegistry.registerTypes([createConversationAudioFileType()]);\n    installComposerPickerAutoRun({\n      autoRun: this.autoRun,\n      initialFiles: this.initialFiles,\n      activate: () => this.activate(),\n      seedFiles: (files) => this.handleFiles(files),\n    });\n  }\n\n  activate(): Promise<void> {\n    return runComposerPickerAutoRunBrowse({\n      fileTypeRegistry: this.fileTypeRegistry,\n      uploader: this.uploader,\n      toast: this.toast,\n      translation: this.translation,\n      catalogFileType: this.catalogFileType,\n      maxFiles: this.maxFiles(),\n      hasExistingFiles: () => this.audioFiles().length > 0,\n      handleFiles: (files) => this.handleFiles(files),\n      onCancelled: () => this.cancel(),\n    });\n  }\n\n  private createUtilityContext() {\n    return {\n      readAsDataUrl: (file: File | Blob) => this.fileService.blobToBase64(file),\n      platformId: this.platformId,\n    };\n  }\n\n  private async getCatalogFileTypeDef(): Promise<AXFileType | undefined> {\n    this.catalogFileTypeDef ??= await this.fileService.getFileType(this.catalogFileType);\n    return this.catalogFileTypeDef;\n  }\n\n  private async runUtility(name: string, file: File, ...args: unknown[]): Promise<unknown> {\n    const fileType = await this.getCatalogFileTypeDef();\n    if (!fileType) return undefined;\n    return runFileTypeUtilityForFile(fileType, this.createUtilityContext(), file, name, ...args);\n  }\n\n  async handleFiles(files: File[]): Promise<void> {\n    const max = this.maxFiles();\n    const capacity = limitFilesToCapacity(files, this.audioFiles().length, max);\n    if (capacity.length < files.length) {\n      notifyMaxFilesCapacityExceeded(this.toast, this.translation, max);\n    }\n    if (capacity.length === 0) {\n      return;\n    }\n\n    const { accepted, rejected } = await this.uploader.validateFiles(capacity, this.catalogFileType);\n\n    notifyPickerValidationErrors(this.toast, this.translation, rejected);\n\n    for (const file of accepted) {\n      try {\n        const durationResult = await this.runUtility('duration', file);\n        const previewResult = await this.runUtility('preview', file);\n        const duration = typeof durationResult === 'number' ? durationResult : 0;\n        const dataUrl = typeof previewResult === 'string' ? previewResult : undefined;\n        let index = -1;\n        this.audioFiles.update((audios) => {\n          index = audios.length;\n          return [...audios, { id: createPickerUploadItemId(), file, duration, dataUrl, uploadProgress: 0, uploading: true }];\n        });\n        if (index >= 0) {\n          void this.uploadAudioAt(index, file);\n        }\n      } catch (error) {\n        console.error('Failed to process audio:', error);\n      }\n    }\n  }\n\n  private async uploadAudioAt(index: number, file: File): Promise<void> {\n    const abortController = new AbortController();\n    this.patchAudio(index, { abortController });\n\n    try {\n      const result = await uploadPickerFile(\n        this.uploader,\n        this.conversation().id,\n        file,\n        (progress) => this.patchAudio(index, { uploadProgress: progress, uploading: true }),\n        abortController.signal,\n      );\n      this.patchAudio(index, {\n        uploadProgress: 100,\n        uploading: false,\n        uploaded: true,\n        uploadedUrl: result.url,\n        mediaId: result.mediaId,\n      });\n    } catch (err) {\n      if (this.uploadsDismissed || isUploadAborted(err, abortController.signal)) {\n        return;\n      }\n      this.patchAudio(index, {\n        uploading: false,\n        error: this.translation.translateSync('@acorex:chat.errors.upload-failed'),\n      });\n    }\n  }\n\n  private patchAudio(index: number, patch: Partial<AXConversationAudioFile>): void {\n    if (this.uploadsDismissed) {\n      return;\n    }\n    this.audioFiles.update((items) => {\n      const next = [...items];\n      if (next[index]) {\n        next[index] = { ...next[index], ...patch };\n      }\n      return next;\n    });\n  }\n\n  removeAudio(index: number): void {\n    const item = this.audioFiles()[index];\n    if (item) {\n      cleanupPickerUploads(this.uploader, [item]);\n    }\n    this.audioFiles.update((audios) => audios.filter((_, i) => i !== index));\n  }\n\n  async sendAudio(): Promise<void> {\n    const audioList = this.audioFiles();\n    if (!this.canSend()) return;\n\n    const audios = audioList.flatMap((audio) => {\n      const result = pickerItemToUploadResult(audio);\n      return result ? [audioItemFromUpload(audio.file, result, audio.duration ?? 0)] : [];\n    });\n\n    if (audios.length === 0) {\n      return;\n    }\n\n    const command: AXConversationSendMessageCommand = {\n      conversationId: this.conversation().id,\n      type: 'audio',\n      payload: {\n        type: 'audio',\n        audios,\n        caption: this.caption.trim() || undefined,\n      },\n    };\n\n    this.retainUploadedOnDismiss = true;\n    const popup = this.__popup__();\n    this.dismissPicker();\n    dismissComposerPickerHost(this.composerService, popup, this.__actionSheet__());\n\n    void this.composerService.sendMessage(command).catch(() => {\n      this.retainUploadedOnDismiss = false;\n    });\n  }\n\n  canSend(): boolean {\n    const list = this.audioFiles();\n    return list.length > 0 && list.every((a) => a.uploaded && !a.error && !a.uploading);\n  }\n\n  getUploadingLabel(progress: number): string {\n    return this.translation.translateSync('@acorex:chat.pickers.files.uploading-progress', {\n      params: { progress },\n    });\n  }\n\n  getCancelUploadLabel(): string {\n    return getPickerCancelUploadLabel(this.translation);\n  }\n\n  getHeaderTitle(): string {\n    const count = this.audioFiles().length;\n    if (count === 0) {\n      return this.translation.translateSync('@acorex:chat.pickers.audio.title');\n    }\n    return this.translation.translateSync('@acorex:chat.pickers.audio.send-count', {\n      params: { count },\n    });\n  }\n\n  onAddMoreFiles(): void {\n    void this.pickerShell()?.browse();\n  }\n\n  cancel(): void {\n    this.dismissPicker();\n    dismissComposerPickerHost(this.composerService, this.__popup__(), this.__actionSheet__());\n  }\n\n  ngOnDestroy(): void {\n    this.dismissPicker();\n  }\n\n  private dismissPicker(): void {\n    if (this.uploadsDismissed) {\n      return;\n    }\n    this.uploadsDismissed = true;\n    const snapshot = [...this.audioFiles()];\n    cleanupPickerUploads(this.uploader, snapshot, {\n      retainUploaded: this.retainUploadedOnDismiss,\n    });\n    this.retainUploadedOnDismiss = false;\n    this.audioFiles.set([]);\n    this.caption = '';\n  }\n\n  formatFileSize(bytes: number): string {\n    const fileType = this.catalogFileTypeDef;\n    const result = fileType\n      ? runFileTypeUtility(fileType, this.createUtilityContext(), undefined, 'formatSize', bytes)\n      : undefined;\n    return typeof result === 'string' ? result : `${bytes} B`;\n  }\n\n  formatDuration(seconds: number): string {\n    const fileType = this.catalogFileTypeDef;\n    const result = fileType\n      ? runFileTypeUtility(fileType, this.createUtilityContext(), undefined, 'formatDuration', seconds)\n      : undefined;\n    return typeof result === 'string' ? result : '0:00';\n  }\n\n  getEmptyTitle(): string {\n    return this.isDragging()\n      ? this.translation.translateSync('@acorex:chat.pickers.audio.drop-to-attach')\n      : this.translation.translateSync('@acorex:chat.pickers.audio.select');\n  }\n\n  getEmptySubtitle(): string {\n    return this.isDragging()\n      ? this.translation.translateSync('@acorex:chat.pickers.common.release-to-upload')\n      : this.translation.translateSync('@acorex:chat.pickers.common.click-to-browse');\n  }\n\n  getSelectedCountText(): string {\n    return this.translation.translateSync('@acorex:chat.pickers.audio.selected-count', {\n      params: { count: this.audioFiles().length },\n    });\n  }\n\n  getSendText(): string {\n    return this.translation.translateSync('@acorex:chat.pickers.audio.send-count', {\n      params: { count: this.audioFiles().length },\n    });\n  }\n}\n","<ax-conversation-picker-shell\n  #pickerShell\n  [fileType]=\"catalogFileType\"\n  [multiple]=\"allowMultiple()\"\n  (filesSelected)=\"handleFiles($event)\"\n  (dragEnter)=\"isDragging.set(true)\"\n  (dragLeave)=\"isDragging.set(false)\"\n>\n  <ax-conversation-picker-header\n    [title]=\"getHeaderTitle()\"\n    [showMenu]=\"audioFiles().length > 0\"\n    [addMoreLabel]=\"translation.translateSync('@acorex:chat.pickers.common.add-more')\"\n    (onClose)=\"cancel()\"\n    (onAddMore)=\"onAddMoreFiles()\"\n  />\n\n  <div class=\"ax-conversation-picker__scroll\">\n    @if (audioFiles().length === 0) {\n      <ax-conversation-picker-empty\n        [title]=\"getEmptyTitle()\"\n        [hint]=\"getEmptySubtitle()\"\n        [iconClass]=\"emptyIconClass()\"\n        [dragOver]=\"isDragging()\"\n      />\n    } @else {\n      <div class=\"ax-conversation-picker__body\">\n        <div class=\"ax-conversation-picker__list\">\n          @for (audio of audioFiles(); track audio.id) {\n            <div class=\"ax-conversation-picker__row\">\n              <div class=\"ax-conversation-picker__row-main\">\n                <div class=\"ax-conversation-picker__thumb\">\n                  <i [class]=\"typeIconClass\"></i>\n                </div>\n                <div class=\"ax-conversation-picker__details\">\n                  <div class=\"ax-conversation-picker__name\">{{ audio.file.name }}</div>\n                  <div class=\"ax-conversation-picker__status\">\n                    @if (audio.uploading) {\n                      <span>{{ getUploadingLabel(audio.uploadProgress ?? 0) }}</span>\n                    } @else if (audio.error) {\n                      <span class=\"ax-conversation-picker__status--err\"\n                        ><i class=\"fa-light fa-xmark\"></i> {{ audio.error }}</span\n                      >\n                    } @else {\n                      <span>{{ formatFileSize(audio.file.size) }}</span>\n                      @if (audio.duration) {\n                        <span>{{ formatDuration(audio.duration) }}</span>\n                      }\n                    }\n                  </div>\n                  @if (audio.uploading) {\n                    <div class=\"ax-conversation-picker__progress\">\n                      <ax-progress-bar [progress]=\"audio.uploadProgress || 0\" [mode]=\"'determinate'\" [height]=\"3\" />\n                    </div>\n                  }\n                </div>\n              </div>\n              <button\n                type=\"button\"\n                class=\"ax-conversation-picker__remove\"\n                (click)=\"removeAudio($index)\"\n                [attr.aria-label]=\"\n                  audio.uploading\n                    ? getCancelUploadLabel()\n                    : translation.translateSync('@acorex:chat.pickers.common.remove')\n                \"\n              >\n                <i class=\"fa-light fa-trash-can\"></i>\n              </button>\n            </div>\n          }\n        </div>\n      </div>\n    }\n  </div>\n\n  @if (audioFiles().length > 0) {\n    <ax-conversation-picker-caption\n      [(caption)]=\"caption\"\n      [sendDisabled]=\"!canSend()\"\n      (onSend)=\"sendAudio()\"\n    />\n  }\n</ax-conversation-picker-shell>\n","/**\n * Composer Tabs Plugins\n */\n\nexport * from './default-tabs.plugin';\n","/**\n * Emoji Tab Component\n * Emoji picker for composer popup\n */\n\nimport { AXSearchBoxModule } from '@acorex/components/search-box';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport { CommonModule } from '@angular/common';\nimport { Component, ViewEncapsulation, computed, output, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\n\ninterface AXConversationEmoji {\n  char: string;\n  name: string;\n  keywords: string[];\n}\n\ninterface AXConversationEmojiCategory {\n  id: string;\n  name: string;\n  icon: string;\n  emojis: AXConversationEmoji[];\n}\n\nlet emojiCategoriesCache: AXConversationEmojiCategory[] | null = null;\n\nasync function loadEmojiCategories(): Promise<AXConversationEmojiCategory[]> {\n  if (emojiCategoriesCache) {\n    return emojiCategoriesCache;\n  }\n  const module = await import('./emoji-categories.json');\n  emojiCategoriesCache =\n    (module as { default: AXConversationEmojiCategory[] }).default ??\n    (module as unknown as AXConversationEmojiCategory[]);\n  return emojiCategoriesCache;\n}\n\n@Component({\n  selector: 'ax-conversation-emoji-tab',\n  encapsulation: ViewEncapsulation.None,\n  imports: [CommonModule, FormsModule, AXSearchBoxModule, AXTranslationModule],\n  templateUrl: './emoji-tab.component.html',\n  styleUrl: './emoji-tab.component.css',\n})\nexport class AXConversationEmojiTabComponent {\n  /** Emoji selected event */\n  readonly itemSelected = output<string>();\n\n  /** Search query */\n  readonly searchQuery = signal('');\n\n  /** Active category */\n  private readonly activeCategoryId = signal<string>('smileys');\n\n  /** Categories */\n  readonly categories = signal<AXConversationEmojiCategory[]>([]);\n\n  constructor() {\n    void loadEmojiCategories().then((categories) => this.categories.set(categories));\n  }\n\n  /** Filtered emojis */\n  readonly filteredEmojis = computed(() => {\n    const query = this.searchQuery().toLowerCase().trim();\n    const categoryId = this.activeCategoryId();\n\n    if (query) {\n      // Search across all categories by name and keywords\n      return this.categories()\n        .flatMap((cat) => cat.emojis)\n        .filter((emoji) => {\n          const searchText = `${emoji.name} ${emoji.keywords.join(' ')}`.toLowerCase();\n          return searchText.includes(query);\n        });\n    } else {\n      // Show active category\n      const category = this.categories().find((c) => c.id === categoryId);\n      return category ? category.emojis : [];\n    }\n  });\n\n  /** Select category */\n  selectCategory(categoryId: string): void {\n    this.activeCategoryId.set(categoryId);\n    this.searchQuery.set('');\n  }\n\n  /** Get category CSS classes */\n  getCategoryClasses(categoryId: string): string {\n    const classes = ['category-button'];\n    if (this.activeCategoryId() === categoryId) {\n      classes.push('category-button-active');\n    }\n    return classes.join(' ');\n  }\n\n  onSearchChange(event: { value?: string }): void {\n    this.searchQuery.set(event?.value || '');\n  }\n\n  /** Select emoji */\n  selectEmoji(emoji: string): void {\n    this.itemSelected.emit(emoji);\n  }\n}\n","<div class=\"emoji-tab\">\n  <!-- Search -->\n  <div class=\"emoji-search\">\n    <ax-search-box\n      [value]=\"searchQuery()\"\n      [placeholder]=\"'Search emoji...'\"\n      (onValueChanged)=\"onSearchChange($event)\"\n    ></ax-search-box>\n  </div>\n\n  <!-- Categories -->\n  <div class=\"emoji-categories\">\n    @for (category of categories(); track category.id) {\n      <button\n        type=\"button\"\n        [class]=\"getCategoryClasses(category.id)\"\n        (click)=\"selectCategory(category.id)\"\n        [attr.aria-label]=\"category.name\"\n        [title]=\"category.name\"\n      >\n        {{ category.icon }}\n      </button>\n    }\n  </div>\n\n  <!-- Emoji Grid -->\n  <div class=\"emoji-grid\">\n    @for (emoji of filteredEmojis(); track emoji.char) {\n      <button\n        type=\"button\"\n        class=\"emoji-button\"\n        (click)=\"selectEmoji(emoji.char)\"\n        [attr.aria-label]=\"emoji.name\"\n        [title]=\"emoji.name\"\n      >\n        {{ emoji.char }}\n      </button>\n    }\n  </div>\n\n  @if (filteredEmojis().length === 0) {\n    <div class=\"emoji-empty\">\n      <p>{{ '@acorex:chat.empty.no-emojis-found' | translate | async }}</p>\n    </div>\n  }\n</div>\n","import type { AXFileCopyData, AXFileType } from '@acorex/core/file';\nimport { AXFileTypeInfoProvider, createFileTypeMetadata } from '@acorex/core/file';\nimport { isPlatformBrowser } from '@angular/common';\nimport { Injectable } from '@angular/core';\nimport type { AXConversationFilePayload } from '../../../../models';\nimport {\n  AX_CONVERSATION_AUDIO_CATALOG,\n  AX_CONVERSATION_FILE_CATALOG,\n  AX_CONVERSATION_IMAGE_CATALOG,\n  AX_CONVERSATION_VIDEO_CATALOG,\n} from '../../../../models/message-file-type-catalog';\nimport { normalizeFilePayload } from '../../../message-list/components/file-renderer/file.payload';\nimport { formatFileSize } from '../shared/media-formatters';\n\nexport { AX_CONVERSATION_FILE_CATALOG };\n\nconst MB = 1024 * 1024;\n\nexport const AX_CONVERSATION_FILE_PRESENTATION = {\n  icon: 'fa-light fa-file text-neutral-500',\n  title: 'File',\n} as const;\n\nconst AX_CONVERSATION_FILE_ALLOWED_MIME_TYPES = [\n  'image/*',\n  'video/*',\n  'audio/*',\n  'application/pdf',\n  'application/msword',\n  'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n  'application/vnd.ms-excel',\n  'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n  'application/zip',\n  'application/x-zip-compressed',\n  'application/x-7z-compressed',\n  'application/vnd.rar',\n  'application/octet-stream',\n  'text/plain',\n] as const;\n\ntype AXConversationFileTypeUtilityContext = {\n  readAsDataUrl: (file: File | Blob) => Promise<string>;\n  platformId: object;\n};\n\nconst AX_CONVERSATION_FILE_UTILITY = {\n  preview: 'preview',\n  formatSize: 'formatSize',\n  createLocalPreviewUrl: 'createLocalPreviewUrl',\n  pickerCatalog: 'pickerCatalog',\n} as const;\n\nfunction blobUrl(ctx: AXConversationFileTypeUtilityContext, blob: Blob): string {\n  if (!isPlatformBrowser(ctx.platformId)) {\n    return '';\n  }\n  return URL.createObjectURL(blob);\n}\n\nexport function conversationFileUtilities(): NonNullable<AXFileType['utilities']> {\n  return {\n    [AX_CONVERSATION_FILE_UTILITY.preview]: async (ctx, file) => {\n      const f = file as File;\n      if (f.type.startsWith('image/')) {\n        return (ctx as AXConversationFileTypeUtilityContext).readAsDataUrl(f);\n      }\n      return undefined;\n    },\n    [AX_CONVERSATION_FILE_UTILITY.formatSize]: (_ctx, bytes) => formatFileSize(bytes as number),\n    [AX_CONVERSATION_FILE_UTILITY.createLocalPreviewUrl]: (ctx, source) => blobUrl(ctx as AXConversationFileTypeUtilityContext, source as Blob),\n    [AX_CONVERSATION_FILE_UTILITY.pickerCatalog]: (_ctx, file) => {\n      const f = file as File;\n      if (f.type.startsWith('image/')) return AX_CONVERSATION_IMAGE_CATALOG;\n      if (f.type.startsWith('video/')) return AX_CONVERSATION_VIDEO_CATALOG;\n      if (f.type.startsWith('audio/')) return AX_CONVERSATION_AUDIO_CATALOG;\n      return AX_CONVERSATION_FILE_CATALOG;\n    },\n  };\n}\n\nexport function createConversationFileFileType(): import('@acorex/core/file').AXFileType {\n  const presentation = AX_CONVERSATION_FILE_PRESENTATION;\n  return {\n    name: AX_CONVERSATION_FILE_CATALOG,\n    metadata: createFileTypeMetadata('conversation'),\n    title: presentation.title,\n    icon: presentation.icon,\n    validations: {\n      mimeTypes: [...AX_CONVERSATION_FILE_ALLOWED_MIME_TYPES],\n      minSize: 1,\n      maxSize: 100 * MB,\n    },\n    extensions: [\n      { name: 'pdf', title: 'PDF', validations: { mimeTypes: ['application/pdf'], maxSize: 25 * MB } },\n      { name: 'doc', title: 'Word' },\n      { name: 'docx', title: 'Word' },\n      { name: 'txt', title: 'Text', validations: { mimeTypes: ['text/plain'], maxSize: 5 * MB } },\n      {\n        name: 'zip',\n        title: 'ZIP',\n        validations: {\n          mimeTypes: ['application/zip', 'application/x-zip-compressed', 'application/octet-stream', 'application/*'],\n          maxSize: 50 * MB,\n        },\n      },\n      {\n        name: 'rar',\n        title: 'RAR',\n        validations: {\n          mimeTypes: [\n            'application/vnd.rar',\n            'application/x-rar-compressed',\n            'application/octet-stream',\n            'application/*',\n          ],\n          maxSize: 50 * MB,\n        },\n      },\n    ],\n    utilities: conversationFileUtilities(),\n    copy: (payload): AXFileCopyData => {\n      const file = normalizeFilePayload(payload as AXConversationFilePayload);\n      const caption = file.caption?.trim();\n      const items = file.files.map((item) => {\n        const name = item.name?.trim();\n        const url = item.url?.trim();\n        const line = name && url ? `${name} — ${url}` : url || name;\n        return { name, url, line };\n      });\n      return {\n        text: caption ?? '',\n        meta: { kind: 'file', caption, items, count: file.files.length },\n      };\n    },\n  };\n}\n\n@Injectable({ providedIn: 'root' })\nexport class AXConversationFileFileTypeProvider extends AXFileTypeInfoProvider {\n  items() {\n    return Promise.resolve([createConversationFileFileType()]);\n  }\n}\n","import type { AXUploadResult } from '@acorex/cdk/uploader';\nimport type { AXConversationFileMediaItem, AXConversationFilePayload, AXConversationMessagePayload } from '../../../../models';\nimport type { AXConversationUploaderResult } from '../../../../models/conversation-upload.types';\nimport { normalizeFilePayload } from '../../../message-list/components/file-renderer/file.payload';\nimport { resolvePersistableMediaUrl, resolvePersistedThumbnailUrl } from '../shared/persisted-media-url';\n\nexport function fileItemFromUpload(file: File, result: AXConversationUploaderResult): AXConversationFileMediaItem {\n  const extension = file.name.includes('.') ? file.name.split('.').pop() : undefined;\n  const url = resolvePersistableMediaUrl(result.url);\n  const item: AXConversationFileMediaItem = {\n    mediaId: result.mediaId,\n    mimeType: result.mimeType,\n    size: result.size,\n    name: file.name,\n    thumbnailUrl: resolvePersistedThumbnailUrl(result.thumbnailUrl, url),\n    extension,\n    metadata: result.metadata,\n  };\n  if (url) {\n    item.url = url;\n  }\n  return item;\n}\n\nexport function mergeFileUploadResult(\n  payload: AXConversationMessagePayload,\n  result: AXUploadResult,\n): AXConversationMessagePayload {\n  const base = normalizeFilePayload(payload as AXConversationFilePayload);\n  const files = [...base.files];\n  const i = files.findIndex((x) => !x.mediaId && !resolvePersistableMediaUrl(x.url));\n  const slot = i >= 0 ? files[i] : undefined;\n  const name = slot?.name ?? (result.metadata?.['fileName'] as string | undefined) ?? 'file';\n  const url = resolvePersistableMediaUrl(result.url);\n  const next: AXConversationFileMediaItem = {\n    ...(slot ?? { name, mimeType: result.mimeType }),\n    mediaId: result.mediaId,\n    mimeType: result.mimeType,\n    size: result.size,\n    name,\n    thumbnailUrl: resolvePersistedThumbnailUrl(result.thumbnailUrl ?? slot?.thumbnailUrl, url),\n    metadata: result.metadata,\n  };\n  if (url) {\n    next.url = url;\n  }\n  if (i >= 0) files[i] = next;\n  else files.push(next);\n  return { ...base, type: 'file', files };\n}\n\nexport function applyFileLocalPreview(\n  payload: AXConversationMessagePayload,\n  localUrl: string,\n  mimeType = 'application/octet-stream',\n): AXConversationMessagePayload {\n  const base = normalizeFilePayload(payload as AXConversationFilePayload);\n  const files = [...base.files];\n  const slot = files.findIndex((x) => !x.mediaId && !resolvePersistableMediaUrl(x.url));\n  const preview = { url: localUrl, name: 'upload', mimeType };\n  if (slot >= 0) {\n    files[slot] = { ...files[slot], ...preview };\n  } else if (files.length === 0) {\n    files.push(preview);\n  } else {\n    files[0] = { ...files[0], ...preview };\n  }\n  return { ...base, type: 'file', files };\n}\n","export interface AXConversationPickerFileBadge {\n  ext: string;\n  color: string;\n}\n\nconst PICKER_FILE_BADGE_COLORS: Record<string, string> = {\n  pdf: '#e53935',\n  rar: '#f57c00',\n  zip: '#f57c00',\n  '7z': '#f57c00',\n  ppt: '#f57c00',\n  pptx: '#f57c00',\n  pot: '#f57c00',\n  potx: '#f57c00',\n  doc: '#1e88e5',\n  docx: '#1e88e5',\n  xls: '#43a047',\n  xlsx: '#43a047',\n  csv: '#43a047',\n  mp3: '#8e24aa',\n  wav: '#8e24aa',\n  flac: '#8e24aa',\n  aac: '#8e24aa',\n  mp4: '#5e35b1',\n  mov: '#5e35b1',\n  avi: '#5e35b1',\n  mkv: '#5e35b1',\n  png: '#00897b',\n  jpg: '#00897b',\n  jpeg: '#00897b',\n  gif: '#00897b',\n  webp: '#00897b',\n};\n\n/** Telegram-style colored document badge for picker file rows. */\nexport function resolvePickerFileBadge(fileName: string): AXConversationPickerFileBadge {\n  const ext = (fileName.split('.').pop() ?? 'file').toLowerCase();\n  return {\n    ext: ext.slice(0, 4),\n    color: PICKER_FILE_BADGE_COLORS[ext] ?? '#607d8b',\n  };\n}\n","/**\n * File Picker Component\n * General-purpose file attachment interface for the composer\n */\n\nimport { AXUploaderService } from '@acorex/cdk/uploader';\nimport type { AXActionSheetRef } from '@acorex/components/action-sheet';\nimport type { AXPopupRef } from '@acorex/components/popup';\nimport { AXProgressBarModule } from '@acorex/components/progress-bar';\nimport { AXToastService } from '@acorex/components/toast';\nimport {\n  AXFileService,\n  AXFileTypeRegistryService,\n  runFileTypeUtility,\n  runFileTypeUtilityForFile,\n  type AXFileType,\n} from '@acorex/core/file';\nimport { AXTranslationModule, AXTranslationService } from '@acorex/core/translation';\nimport { CommonModule } from '@angular/common';\nimport { Component, OnDestroy, PLATFORM_ID, ViewEncapsulation, computed, inject, input, signal, viewChild } from '@angular/core';\nimport { AXConversationComposerService } from '../../../../components/composer/composer.service';\nimport { AXConversation, AXConversationSendMessageCommand } from '../../../../models';\nimport type { AXConversationComposerActionComponent } from '../../../../registries/composer-action.registry';\nimport { AXConversationPickerHeaderComponent } from '../picker-header/picker-header.component';\nimport { AXConversationPickerCaptionComponent } from '../shared/picker-caption.component';\nimport { AXConversationPickerEmptyComponent } from '../shared/picker-empty.component';\nimport { AXConversationPickerShellComponent } from '../shared/picker-shell.component';\nimport { resolvePickerFileBadge } from '../shared/picker-file-badge.utils';\nimport {\n  cleanupPickerUploads,\n  createPickerUploadItemId,\n  dismissComposerPickerHost,\n  getPickerCancelUploadLabel,\n  isUploadAborted,\n  limitFilesToCapacity,\n  notifyMaxFilesCapacityExceeded,\n  notifyPickerValidationErrors,\n  pickerItemToUploadResult,\n  uploadPickerFile,\n  type AXConversationComposerPickerUploadItem,\n} from '../shared/picker-upload';\nimport { installComposerPickerAutoRun, runComposerPickerAutoRunBrowse } from '../shared/picker-auto-run';\nimport {\n  AX_CONVERSATION_FILE_CATALOG,\n  AX_CONVERSATION_FILE_PRESENTATION,\n  createConversationFileFileType,\n} from './conversation-file.file-type';\nimport { fileItemFromUpload } from './file-composer.payload';\n\ninterface AXConversationAttachedFile extends AXConversationComposerPickerUploadItem {\n  icon: string;\n  type: 'image' | 'video' | 'audio' | 'file';\n}\n\n@Component({\n  selector: 'ax-conversation-file-picker',\n  encapsulation: ViewEncapsulation.None,\n  imports: [\n    CommonModule,\n    AXProgressBarModule,\n    AXTranslationModule,\n    AXConversationPickerHeaderComponent,\n    AXConversationPickerEmptyComponent,\n    AXConversationPickerCaptionComponent,\n    AXConversationPickerShellComponent,\n  ],\n  templateUrl: './file-picker.component.html',\n  styleUrls: ['../shared/picker-shared.css'],\n})\nexport class AXConversationFilePickerComponent implements OnDestroy, AXConversationComposerActionComponent {\n  private uploadsDismissed = false;\n  private retainUploadedOnDismiss = false;\n  private readonly uploader = inject(AXUploaderService);\n  private readonly fileService = inject(AXFileService);\n  private readonly fileTypeRegistry = inject(AXFileTypeRegistryService);\n  private readonly platformId = inject(PLATFORM_ID);\n  readonly service = input<AXConversationComposerService | undefined>();\n  private readonly composerServiceFromInjector = inject(AXConversationComposerService, { optional: true });\n\n  private get composerService(): AXConversationComposerService {\n    const svc = this.service() ?? this.composerServiceFromInjector;\n    if (!svc) {\n      throw new Error('AXConversationComposerService is required for the file picker');\n    }\n    return svc;\n  }\n  private readonly toast = inject(AXToastService);\n  readonly translation = inject(AXTranslationService);\n\n  readonly conversation = input.required<AXConversation>();\n  readonly maxFiles = input<number>(10);\n  readonly initialFiles = input<File[]>([]);\n  readonly autoRun = input(false);\n  readonly __popup__ = input<AXPopupRef | undefined>();\n  readonly __actionSheet__ = input<AXActionSheetRef | undefined>();\n\n  readonly catalogFileType = AX_CONVERSATION_FILE_CATALOG;\n\n  readonly allowMultiple = computed(() => this.maxFiles() > 1);\n\n  readonly files = signal<AXConversationAttachedFile[]>([]);\n  readonly isDragging = signal(false);\n  readonly isUploading = signal(false);\n  private readonly pickerShell = viewChild<AXConversationPickerShellComponent>('pickerShell');\n  readonly emptyIconClass = computed(() =>\n    this.isDragging() ? 'fa-light fa-cloud-arrow-up' : AX_CONVERSATION_FILE_PRESENTATION.icon,\n  );\n\n  private catalogFileTypeDef?: AXFileType;\n  caption = '';\n\n  constructor() {\n    this.fileTypeRegistry.registerTypes([createConversationFileFileType()]);\n    installComposerPickerAutoRun({\n      autoRun: this.autoRun,\n      initialFiles: this.initialFiles,\n      activate: () => this.activate(),\n      seedFiles: (files) => this.handleFiles(files),\n    });\n  }\n\n  activate(): Promise<void> {\n    return runComposerPickerAutoRunBrowse({\n      fileTypeRegistry: this.fileTypeRegistry,\n      uploader: this.uploader,\n      toast: this.toast,\n      translation: this.translation,\n      catalogFileType: this.catalogFileType,\n      maxFiles: this.maxFiles(),\n      hasExistingFiles: () => this.files().length > 0,\n      handleFiles: (files) => this.handleFiles(files),\n      onCancelled: () => this.cancel(),\n    });\n  }\n\n  private createUtilityContext() {\n    return {\n      readAsDataUrl: (file: File | Blob) => this.fileService.blobToBase64(file),\n      platformId: this.platformId,\n    };\n  }\n\n  private async getCatalogFileTypeDef(): Promise<AXFileType | undefined> {\n    this.catalogFileTypeDef ??= await this.fileService.getFileType(this.catalogFileType);\n    return this.catalogFileTypeDef;\n  }\n\n  private pickerKind(catalogName: string): AXConversationAttachedFile['type'] {\n    if (catalogName === 'conversation-image') return 'image';\n    if (catalogName === 'conversation-video') return 'video';\n    if (catalogName === 'conversation-audio') return 'audio';\n    return 'file';\n  }\n\n  async handleFiles(fileList: File[]): Promise<void> {\n    const max = this.maxFiles();\n    const capacity = limitFilesToCapacity(fileList, this.files().length, max);\n    if (capacity.length < fileList.length) {\n      notifyMaxFilesCapacityExceeded(this.toast, this.translation, max);\n    }\n    if (capacity.length === 0) {\n      return;\n    }\n\n    const { accepted, rejected } = await this.uploader.validateFiles(capacity, this.catalogFileType);\n\n    notifyPickerValidationErrors(this.toast, this.translation, rejected);\n\n    const fileType = await this.getCatalogFileTypeDef();\n    const ctx = this.createUtilityContext();\n\n    for (const file of accepted) {\n      try {\n        const previewResult = fileType ? await runFileTypeUtilityForFile(fileType, ctx, file, 'preview') : undefined;\n        const rowCatalogResult = fileType\n          ? await runFileTypeUtilityForFile(fileType, ctx, file, 'pickerCatalog')\n          : undefined;\n        const preview = typeof previewResult === 'string' ? previewResult : undefined;\n        const rowCatalog = typeof rowCatalogResult === 'string' ? rowCatalogResult : this.catalogFileType;\n        const rowType = await this.fileService.getFileType(rowCatalog);\n        const icon = rowType?.icon ?? fileType?.icon ?? 'fa-light fa-file';\n        const pickerKind = this.pickerKind(rowCatalog);\n\n        let fileIndex = -1;\n        this.files.update((files) => {\n          fileIndex = files.length;\n          return [\n            ...files,\n            { id: createPickerUploadItemId(), file, preview, icon, type: pickerKind, uploadProgress: 0, uploading: true },\n          ];\n        });\n\n        if (fileIndex >= 0) {\n          void this.uploadFile(fileIndex, file);\n        }\n      } catch (error) {\n        console.error('Failed to process file:', error);\n      }\n    }\n  }\n\n  private async uploadFile(index: number, file: File): Promise<void> {\n    const abortController = new AbortController();\n    this.files.update((files) => {\n      const updated = [...files];\n      updated[index] = { ...updated[index], abortController };\n      return updated;\n    });\n\n    try {\n      const result = await this.uploadFileWithProgress(\n        file,\n        (progress) => {\n          this.updateFileProgress(index, progress, true);\n        },\n        abortController.signal,\n      );\n\n      this.updateFileProgress(index, 100, false, true, result.url, result.mediaId);\n    } catch (error) {\n      if (this.uploadsDismissed || isUploadAborted(error, abortController.signal)) {\n        return;\n      }\n      console.error('Failed to upload file:', error);\n      this.updateFileProgress(\n        index,\n        0,\n        false,\n        false,\n        undefined,\n        undefined,\n        this.translation.translateSync('@acorex:chat.errors.upload-failed'),\n      );\n    }\n  }\n\n  removeFile(index: number): void {\n    const item = this.files()[index];\n    if (item) {\n      cleanupPickerUploads(this.uploader, [item]);\n    }\n    this.files.update((files) => files.filter((_, i) => i !== index));\n  }\n\n  async sendFiles(): Promise<void> {\n    const fileList = this.files();\n    if (fileList.length === 0) return;\n\n    // Check if all files are uploaded\n    const allUploaded = fileList.every((f) => f.uploaded && !f.error);\n    if (!allUploaded) {\n      console.warn('Some files are still uploading or failed');\n      return;\n    }\n\n    const files = fileList.flatMap((f) => {\n      const result = pickerItemToUploadResult(f);\n      return result ? [fileItemFromUpload(f.file, result)] : [];\n    });\n\n    if (files.length === 0) {\n      return;\n    }\n\n    const command: AXConversationSendMessageCommand = {\n      conversationId: this.conversation().id,\n      type: 'file',\n      payload: {\n        type: 'file',\n        files,\n        caption: this.caption.trim() || undefined,\n      },\n    };\n\n    this.retainUploadedOnDismiss = true;\n    const popup = this.__popup__();\n    this.dismissPicker();\n    dismissComposerPickerHost(this.composerService, popup, this.__actionSheet__());\n\n    void this.composerService.sendMessage(command).catch(() => {\n      this.retainUploadedOnDismiss = false;\n    });\n  }\n\n  private updateFileProgress(\n    index: number,\n    progress: number,\n    uploading: boolean,\n    uploaded = false,\n    uploadedUrl?: string,\n    mediaId?: string,\n    error?: string,\n  ): void {\n    if (this.uploadsDismissed) {\n      return;\n    }\n    this.files.update((files) => {\n      const updated = [...files];\n      updated[index] = {\n        ...updated[index],\n        uploadProgress: progress,\n        uploading,\n        uploaded,\n        uploadedUrl,\n        mediaId,\n        error,\n      };\n      return updated;\n    });\n  }\n\n  private async uploadFileWithProgress(\n    file: File,\n    onProgress: (progress: number) => void,\n    signal?: AbortSignal,\n  ): Promise<{ url: string; mediaId?: string; thumbnailUrl?: string; size: number; mimeType: string }> {\n    return uploadPickerFile(this.uploader, this.conversation().id, file, onProgress, signal);\n  }\n\n  cancel(): void {\n    this.dismissPicker();\n    dismissComposerPickerHost(this.composerService, this.__popup__(), this.__actionSheet__());\n  }\n\n  ngOnDestroy(): void {\n    this.dismissPicker();\n  }\n\n  private dismissPicker(): void {\n    if (this.uploadsDismissed) {\n      return;\n    }\n    this.uploadsDismissed = true;\n    const snapshot = [...this.files()];\n    cleanupPickerUploads(this.uploader, snapshot, {\n      retainUploaded: this.retainUploadedOnDismiss,\n    });\n    this.retainUploadedOnDismiss = false;\n    this.files.set([]);\n    this.caption = '';\n  }\n\n  getHeaderTitle(): string {\n    const count = this.files().length;\n    if (count === 0) {\n      return this.translation.translateSync('@acorex:chat.pickers.files.title');\n    }\n    return this.translation.translateSync('@acorex:chat.pickers.files.send-count', {\n      params: { count },\n    });\n  }\n\n  getFileBadge(fileName: string) {\n    return resolvePickerFileBadge(fileName);\n  }\n\n  onAddMoreFiles(): void {\n    void this.pickerShell()?.browse();\n  }\n\n  getCancelUploadLabel(): string {\n    return getPickerCancelUploadLabel(this.translation);\n  }\n\n  formatFileSize(bytes: number): string {\n    const fileType = this.catalogFileTypeDef;\n    const result = fileType\n      ? runFileTypeUtility(fileType, this.createUtilityContext(), undefined, 'formatSize', bytes)\n      : undefined;\n    return typeof result === 'string' ? result : `${bytes} B`;\n  }\n\n  canSend(): boolean {\n    const fileList = this.files();\n    if (fileList.length === 0) return false;\n\n    // Can send if all files are uploaded and no errors\n    return fileList.every((f) => f.uploaded && !f.error && !f.uploading);\n  }\n\n  getSendButtonText(): string {\n    const fileList = this.files();\n    const uploadingCount = fileList.filter((f) => f.uploading).length;\n    const uploadedCount = fileList.filter((f) => f.uploaded).length;\n\n    if (uploadingCount > 0) {\n      return this.translation.translateSync('@acorex:chat.pickers.files.uploading-count', {\n        params: { count: uploadingCount },\n      });\n    }\n\n    if (uploadedCount === fileList.length) {\n      return this.translation.translateSync('@acorex:chat.pickers.files.send-count', {\n        params: { count: fileList.length },\n      });\n    }\n\n    return this.translation.translateSync('@acorex:chat.pickers.files.ready-count', {\n      params: { ready: uploadedCount, total: fileList.length },\n    });\n  }\n\n  getEmptyTitle(): string {\n    return this.isDragging()\n      ? this.translation.translateSync('@acorex:chat.pickers.files.drop-here')\n      : this.translation.translateSync('@acorex:chat.pickers.files.select');\n  }\n\n  getEmptySubtitle(): string {\n    return this.isDragging()\n      ? this.translation.translateSync('@acorex:chat.pickers.common.release-to-upload')\n      : this.translation.translateSync('@acorex:chat.pickers.common.click-to-browse');\n  }\n\n  getSelectedCountText(): string {\n    return this.translation.translateSync('@acorex:chat.pickers.files.selected-count', {\n      params: { count: this.files().length },\n    });\n  }\n\n  getUploadingLabel(progress: number): string {\n    return this.translation.translateSync('@acorex:chat.pickers.files.uploading-progress', {\n      params: { progress },\n    });\n  }\n}\n","<ax-conversation-picker-shell\n  #pickerShell\n  [fileType]=\"catalogFileType\"\n  [multiple]=\"allowMultiple()\"\n  (filesSelected)=\"handleFiles($event)\"\n  (dragEnter)=\"isDragging.set(true)\"\n  (dragLeave)=\"isDragging.set(false)\"\n>\n  <ax-conversation-picker-header\n    [title]=\"getHeaderTitle()\"\n    [showMenu]=\"files().length > 0\"\n    [addMoreLabel]=\"translation.translateSync('@acorex:chat.pickers.common.add-more')\"\n    (onClose)=\"cancel()\"\n    (onAddMore)=\"onAddMoreFiles()\"\n  />\n\n  <div class=\"ax-conversation-picker__scroll\">\n    @if (files().length === 0) {\n      <ax-conversation-picker-empty\n        [title]=\"getEmptyTitle()\"\n        [hint]=\"getEmptySubtitle()\"\n        [iconClass]=\"emptyIconClass()\"\n        [dragOver]=\"isDragging()\"\n      />\n    } @else {\n      <div class=\"ax-conversation-picker__body\">\n        <div class=\"ax-conversation-picker__list\">\n          @for (file of files(); track file.id) {\n            @if (file.type === 'image' && file.preview) {\n              <div class=\"ax-conversation-picker__row ax-conversation-picker__row--media\">\n                <div class=\"ax-conversation-picker__media-preview\">\n                  <img [src]=\"file.preview\" [alt]=\"file.file.name\" />\n                  @if (file.uploading || file.error) {\n                    <div class=\"ax-conversation-picker__media-overlay\">\n                      @if (file.uploading) {\n                        <span class=\"ax-conversation-picker__media-status\">{{\n                          getUploadingLabel(file.uploadProgress ?? 0)\n                        }}</span>\n                        <ax-progress-bar [progress]=\"file.uploadProgress || 0\" [mode]=\"'determinate'\" [height]=\"3\" />\n                      } @else if (file.error) {\n                        <span class=\"ax-conversation-picker__media-status\">{{ file.error }}</span>\n                      }\n                    </div>\n                  }\n                </div>\n                <div class=\"ax-conversation-picker__row-main\">\n                  <div class=\"ax-conversation-picker__details\">\n                    <div class=\"ax-conversation-picker__name\">{{ file.file.name }}</div>\n                    <div class=\"ax-conversation-picker__status\">\n                      @if (file.uploaded) {\n                        <span>{{ formatFileSize(file.file.size) }}</span>\n                      } @else if (!file.uploading && !file.error) {\n                        <span>{{ formatFileSize(file.file.size) }}</span>\n                      }\n                    </div>\n                  </div>\n                  <button\n                    type=\"button\"\n                    class=\"ax-conversation-picker__remove\"\n                    (click)=\"removeFile($index)\"\n                    [attr.aria-label]=\"\n                      file.uploading\n                        ? getCancelUploadLabel()\n                        : translation.translateSync('@acorex:chat.pickers.common.remove')\n                    \"\n                  >\n                    <i class=\"fa-light fa-trash-can\"></i>\n                  </button>\n                </div>\n              </div>\n            } @else {\n              <div class=\"ax-conversation-picker__row\">\n                <div class=\"ax-conversation-picker__row-main\">\n                  @if (file.type === 'image' && file.preview) {\n                    <div class=\"ax-conversation-picker__thumb\">\n                      <img [src]=\"file.preview\" [alt]=\"file.file.name\" />\n                    </div>\n                  } @else {\n                    @let badge = getFileBadge(file.file.name);\n                    <div class=\"ax-conversation-picker__doc-icon\" [style.background-color]=\"badge.color\">\n                      <span class=\"ax-conversation-picker__doc-ext\">{{ badge.ext }}</span>\n                    </div>\n                  }\n                  <div class=\"ax-conversation-picker__details\">\n                    <div class=\"ax-conversation-picker__name\">{{ file.file.name }}</div>\n                    <div class=\"ax-conversation-picker__status\">\n                      @if (file.uploading) {\n                        <span>{{ getUploadingLabel(file.uploadProgress ?? 0) }}</span>\n                      } @else if (file.uploaded) {\n                        <span>{{ formatFileSize(file.file.size) }}</span>\n                      } @else if (file.error) {\n                        <span class=\"ax-conversation-picker__status--err\"\n                          ><i class=\"fa-light fa-xmark\"></i> {{ file.error }}</span\n                        >\n                      } @else {\n                        <span>{{ formatFileSize(file.file.size) }}</span>\n                      }\n                    </div>\n                    @if (file.uploading) {\n                      <div class=\"ax-conversation-picker__progress\">\n                        <ax-progress-bar [progress]=\"file.uploadProgress || 0\" [mode]=\"'determinate'\" [height]=\"3\" />\n                      </div>\n                    }\n                  </div>\n                </div>\n                <button\n                  type=\"button\"\n                  class=\"ax-conversation-picker__remove\"\n                  (click)=\"removeFile($index)\"\n                  [attr.aria-label]=\"\n                    file.uploading\n                      ? getCancelUploadLabel()\n                      : translation.translateSync('@acorex:chat.pickers.common.remove')\n                  \"\n                >\n                  <i class=\"fa-light fa-trash-can\"></i>\n                </button>\n              </div>\n            }\n          }\n        </div>\n      </div>\n    }\n  </div>\n\n  @if (files().length > 0) {\n    <ax-conversation-picker-caption\n      [(caption)]=\"caption\"\n      [sendDisabled]=\"!canSend()\"\n      (onSend)=\"sendFiles()\"\n    />\n  }\n</ax-conversation-picker-shell>\n","import type { AXFileCopyData, AXFileType } from '@acorex/core/file';\nimport { AXFileTypeInfoProvider, createFileTypeMetadata } from '@acorex/core/file';\nimport { isPlatformBrowser } from '@angular/common';\nimport { Injectable } from '@angular/core';\nimport type { AXConversationImagePayload } from '../../../../models';\nimport { AX_CONVERSATION_IMAGE_CATALOG } from '../../../../models/message-file-type-catalog';\nimport { normalizeImagePayload } from '../../../message-list/components/image-renderer/image.payload';\nimport { formatFileSize } from '../shared/media-formatters';\n\nexport { AX_CONVERSATION_IMAGE_CATALOG };\n\nconst MB = 1024 * 1024;\n\nexport const AX_CONVERSATION_IMAGE_PRESENTATION = {\n  icon: 'fa-light fa-image text-purple-500',\n  title: 'Image',\n} as const;\n\ntype AXConversationFileTypeUtilityContext = {\n  readAsDataUrl: (file: File | Blob) => Promise<string>;\n  platformId: object;\n};\n\nconst AX_CONVERSATION_IMAGE_UTILITY = {\n  preview: 'preview',\n  formatSize: 'formatSize',\n  createLocalPreviewUrl: 'createLocalPreviewUrl',\n} as const;\n\nfunction blobUrl(ctx: AXConversationFileTypeUtilityContext, blob: Blob): string {\n  if (!isPlatformBrowser(ctx.platformId)) {\n    return '';\n  }\n  return URL.createObjectURL(blob);\n}\n\nexport function conversationImageUtilities(): NonNullable<AXFileType['utilities']> {\n  return {\n    [AX_CONVERSATION_IMAGE_UTILITY.preview]: (ctx, file) =>\n      (ctx as AXConversationFileTypeUtilityContext).readAsDataUrl(file as File),\n    [AX_CONVERSATION_IMAGE_UTILITY.formatSize]: (_ctx, bytes) => formatFileSize(bytes as number),\n    [AX_CONVERSATION_IMAGE_UTILITY.createLocalPreviewUrl]: (ctx, source) => {\n      const blob = source as File | Blob;\n      if (blob.type.startsWith('image/')) {\n        return (ctx as AXConversationFileTypeUtilityContext).readAsDataUrl(blob);\n      }\n      return blobUrl(ctx as AXConversationFileTypeUtilityContext, blob);\n    },\n  };\n}\n\nexport function createConversationImageFileType(): AXFileType {\n  const presentation = AX_CONVERSATION_IMAGE_PRESENTATION;\n  return {\n    name: AX_CONVERSATION_IMAGE_CATALOG,\n    metadata: createFileTypeMetadata('conversation'),\n    title: presentation.title,\n    icon: presentation.icon,\n    validations: {\n      mimeTypes: ['image/*'],\n      minSize: 1,\n      maxSize: 100 * MB,\n    },\n    extensions: [\n      { name: 'jpg', title: 'JPEG' },\n      { name: 'jpeg', title: 'JPEG', validations: { maxSize: 5 * MB } },\n      { name: 'png', title: 'PNG' },\n      { name: 'gif', title: 'GIF' },\n      { name: 'webp', title: 'WebP' },\n      { name: 'svg', title: 'SVG', validations: { maxSize: 2 * MB } },\n    ],\n    utilities: conversationImageUtilities(),\n    copy: (payload): AXFileCopyData => {\n      const image = normalizeImagePayload(payload as AXConversationImagePayload);\n      const caption = image.caption?.trim();\n      const urls = image.images\n        .map((item) => item.url?.trim() || item.thumbnailUrl?.trim())\n        .filter((url): url is string => !!url);\n      return {\n        text: caption ?? '',\n        meta: { kind: 'image', caption, urls, count: image.images.length },\n      };\n    },\n  };\n}\n\n@Injectable({ providedIn: 'root' })\nexport class AXConversationImageFileTypeProvider extends AXFileTypeInfoProvider {\n  items() {\n    return Promise.resolve([createConversationImageFileType()]);\n  }\n}\n","/**\n * Image Picker Component\n * Full-width image selection and preview interface for the composer\n */\n\nimport { AXUploaderService } from '@acorex/cdk/uploader';\nimport type { AXActionSheetRef } from '@acorex/components/action-sheet';\nimport type { AXPopupRef } from '@acorex/components/popup';\nimport { AXProgressBarModule } from '@acorex/components/progress-bar';\nimport { AXToastService } from '@acorex/components/toast';\nimport {\n  AXFileService,\n  AXFileTypeRegistryService,\n  runFileTypeUtilityForFile,\n  type AXFileType,\n} from '@acorex/core/file';\nimport { AXTranslationModule, AXTranslationService } from '@acorex/core/translation';\nimport { CommonModule } from '@angular/common';\nimport { Component, OnDestroy, PLATFORM_ID, ViewEncapsulation, computed, inject, input, signal, viewChild } from '@angular/core';\nimport { AXConversationComposerService } from '../../../../components/composer/composer.service';\nimport { AXConversation, AXConversationImageMediaItem, AXConversationSendMessageCommand } from '../../../../models';\nimport type { AXConversationUploaderResult } from '../../../../models/conversation-upload.types';\nimport type { AXConversationComposerActionComponent } from '../../../../registries/composer-action.registry';\nimport { AXConversationPickerHeaderComponent } from '../picker-header/picker-header.component';\nimport { resolvePersistableMediaUrl, resolvePersistedThumbnailUrl } from '../shared/persisted-media-url';\nimport { AXConversationPickerCaptionComponent } from '../shared/picker-caption.component';\nimport { AXConversationPickerEmptyComponent } from '../shared/picker-empty.component';\nimport { AXConversationPickerShellComponent } from '../shared/picker-shell.component';\nimport {\n  cleanupPickerUploads,\n  createPickerUploadItemId,\n  dismissComposerPickerHost,\n  getPickerCancelUploadLabel,\n  isUploadAborted,\n  limitFilesToCapacity,\n  notifyMaxFilesCapacityExceeded,\n  notifyPickerValidationErrors,\n  pickerItemToUploadResult,\n  uploadPickerFile,\n  type AXConversationComposerPickerUploadItem,\n} from '../shared/picker-upload';\nimport { installComposerPickerAutoRun, runComposerPickerAutoRunBrowse } from '../shared/picker-auto-run';\nimport {\n  AX_CONVERSATION_IMAGE_CATALOG,\n  AX_CONVERSATION_IMAGE_PRESENTATION,\n  createConversationImageFileType,\n} from './conversation-image.file-type';\n\ninterface AXConversationImageFile extends AXConversationComposerPickerUploadItem {\n  preview: string;\n}\n\nfunction imageItemFromUpload(file: File, result: AXConversationUploaderResult): AXConversationImageMediaItem {\n  const url = resolvePersistableMediaUrl(result.url);\n  const item: AXConversationImageMediaItem = {\n    mediaId: result.mediaId,\n    mimeType: result.mimeType,\n    size: result.size,\n    thumbnailUrl: resolvePersistedThumbnailUrl(result.thumbnailUrl, url),\n    width: 0,\n    height: 0,\n    metadata: result.metadata,\n  };\n  if (url) {\n    item.url = url;\n  }\n  return item;\n}\n\n@Component({\n  selector: 'ax-conversation-image-picker',\n  encapsulation: ViewEncapsulation.None,\n  imports: [\n    CommonModule,\n    AXProgressBarModule,\n    AXTranslationModule,\n    AXConversationPickerHeaderComponent,\n    AXConversationPickerEmptyComponent,\n    AXConversationPickerCaptionComponent,\n    AXConversationPickerShellComponent,\n  ],\n  templateUrl: './image-picker.component.html',\n  styleUrls: ['../shared/picker-shared.css'],\n})\nexport class AXConversationImagePickerComponent implements OnDestroy, AXConversationComposerActionComponent {\n  private uploadsDismissed = false;\n  /** Uploaded blobs are referenced by the sent message — do not delete on dismiss. */\n  private retainUploadedOnDismiss = false;\n  readonly service = input<AXConversationComposerService | undefined>();\n  private readonly composerServiceFromInjector = inject(AXConversationComposerService, { optional: true });\n\n  private get composerService(): AXConversationComposerService {\n    const svc = this.service() ?? this.composerServiceFromInjector;\n    if (!svc) {\n      throw new Error('AXConversationComposerService is required for the image picker');\n    }\n    return svc;\n  }\n  private readonly uploader = inject(AXUploaderService);\n  private readonly fileService = inject(AXFileService);\n  private readonly fileTypeRegistry = inject(AXFileTypeRegistryService);\n  private readonly platformId = inject(PLATFORM_ID);\n  private readonly toast = inject(AXToastService);\n  readonly translation = inject(AXTranslationService);\n\n  readonly catalogFileType = AX_CONVERSATION_IMAGE_CATALOG;\n\n  readonly conversation = input.required<AXConversation>();\n  readonly maxFiles = input<number>(10);\n  readonly initialFiles = input<File[]>([]);\n  readonly autoRun = input(false);\n  readonly __popup__ = input<AXPopupRef | undefined>();\n  readonly __actionSheet__ = input<AXActionSheetRef | undefined>();\n\n  readonly images = signal<AXConversationImageFile[]>([]);\n  private readonly pickerShell = viewChild<AXConversationPickerShellComponent>('pickerShell');\n  readonly isDragging = signal(false);\n  readonly emptyIconClass = computed(() =>\n    this.isDragging() ? 'fa-light fa-cloud-arrow-up' : AX_CONVERSATION_IMAGE_PRESENTATION.icon,\n  );\n  caption = '';\n\n  readonly allowMultiple = computed(() => this.maxFiles() > 1);\n  private imageFileType?: AXFileType;\n\n  constructor() {\n    this.fileTypeRegistry.registerTypes([createConversationImageFileType()]);\n    installComposerPickerAutoRun({\n      autoRun: this.autoRun,\n      initialFiles: this.initialFiles,\n      activate: () => this.activate(),\n      seedFiles: (files) => this.handleFiles(files),\n    });\n  }\n\n  activate(): Promise<void> {\n    return runComposerPickerAutoRunBrowse({\n      fileTypeRegistry: this.fileTypeRegistry,\n      uploader: this.uploader,\n      toast: this.toast,\n      translation: this.translation,\n      catalogFileType: this.catalogFileType,\n      maxFiles: this.maxFiles(),\n      hasExistingFiles: () => this.images().length > 0,\n      handleFiles: (files) => this.handleFiles(files),\n      onCancelled: () => this.cancel(),\n    });\n  }\n\n  private createUtilityContext() {\n    return {\n      readAsDataUrl: (file: File | Blob) => this.fileService.blobToBase64(file),\n      platformId: this.platformId,\n    };\n  }\n\n  private async loadImageFileType(): Promise<AXFileType | undefined> {\n    this.imageFileType ??= await this.fileService.getFileType(this.catalogFileType);\n    return this.imageFileType;\n  }\n\n  async handleFiles(files: File[]): Promise<void> {\n    const max = this.maxFiles();\n    const capacity = limitFilesToCapacity(files, this.images().length, max);\n    if (capacity.length < files.length) {\n      notifyMaxFilesCapacityExceeded(this.toast, this.translation, max);\n    }\n    if (capacity.length === 0) {\n      return;\n    }\n\n    const { accepted, rejected } = await this.uploader.validateFiles(capacity, this.catalogFileType);\n    notifyPickerValidationErrors(this.toast, this.translation, rejected);\n\n    const fileType = await this.loadImageFileType();\n    const ctx = this.createUtilityContext();\n\n    for (const file of accepted) {\n      try {\n        const previewValue = fileType ? await runFileTypeUtilityForFile(fileType, ctx, file, 'preview') : undefined;\n        const preview = typeof previewValue === 'string' ? previewValue : '';\n        let index = -1;\n        this.images.update((images) => {\n          index = images.length;\n          return [...images, { id: createPickerUploadItemId(), file, preview, uploadProgress: 0, uploading: true }];\n        });\n        if (index >= 0) {\n          void this.uploadImageAt(index, file);\n        }\n      } catch (error) {\n        console.error('Failed to process image:', error);\n      }\n    }\n  }\n\n  private async uploadImageAt(index: number, file: File): Promise<void> {\n    const abortController = new AbortController();\n    this.patchImage(index, { abortController });\n\n    try {\n      const result = await uploadPickerFile(\n        this.uploader,\n        this.conversation().id,\n        file,\n        (progress) => this.patchImage(index, { uploadProgress: progress, uploading: true }),\n        abortController.signal,\n      );\n      this.patchImage(index, {\n        uploadProgress: 100,\n        uploading: false,\n        uploaded: true,\n        uploadedUrl: result.url,\n        mediaId: result.mediaId,\n      });\n    } catch (err) {\n      if (this.uploadsDismissed || isUploadAborted(err, abortController.signal)) {\n        return;\n      }\n      this.patchImage(index, {\n        uploadProgress: 0,\n        uploading: false,\n        uploaded: false,\n        error: this.translation.translateSync('@acorex:chat.errors.upload-failed'),\n      });\n    }\n  }\n\n  private patchImage(index: number, patch: Partial<AXConversationImageFile>): void {\n    if (this.uploadsDismissed) {\n      return;\n    }\n    this.images.update((items) => {\n      const next = [...items];\n      if (next[index]) {\n        next[index] = { ...next[index], ...patch };\n      }\n      return next;\n    });\n  }\n\n  removeImage(index: number): void {\n    const item = this.images()[index];\n    if (item) {\n      cleanupPickerUploads(this.uploader, [item]);\n    }\n    this.images.update((images) => images.filter((_, i) => i !== index));\n  }\n\n  async sendImages(): Promise<void> {\n    const imageList = this.images();\n    if (!this.canSend()) return;\n\n    const images = imageList.flatMap((image) => {\n      const result = pickerItemToUploadResult(image);\n      return result ? [imageItemFromUpload(image.file, result)] : [];\n    });\n\n    if (images.length === 0) {\n      return;\n    }\n\n    const command: AXConversationSendMessageCommand = {\n      conversationId: this.conversation().id,\n      type: 'image',\n      payload: {\n        type: 'image',\n        images,\n        caption: this.caption.trim() || undefined,\n      },\n    };\n\n    this.retainUploadedOnDismiss = true;\n    const popup = this.__popup__();\n    this.dismissPicker();\n    dismissComposerPickerHost(this.composerService, popup, this.__actionSheet__());\n\n    void this.composerService.sendMessage(command).catch(() => {\n      this.retainUploadedOnDismiss = false;\n    });\n  }\n\n  canSend(): boolean {\n    const list = this.images();\n    return list.length > 0 && list.every((i) => i.uploaded && !i.error && !i.uploading);\n  }\n\n  getUploadingLabel(progress: number): string {\n    return this.translation.translateSync('@acorex:chat.pickers.files.uploading-progress', {\n      params: { progress },\n    });\n  }\n\n  getCancelUploadLabel(): string {\n    return getPickerCancelUploadLabel(this.translation);\n  }\n\n  getHeaderTitle(): string {\n    const count = this.images().length;\n    if (count === 0) {\n      return this.translation.translateSync('@acorex:chat.pickers.images.title');\n    }\n    return this.translation.translateSync('@acorex:chat.pickers.images.send-count', {\n      params: { count },\n    });\n  }\n\n  onAddMoreFiles(): void {\n    void this.pickerShell()?.browse();\n  }\n\n  cancel(): void {\n    this.dismissPicker();\n    dismissComposerPickerHost(this.composerService, this.__popup__(), this.__actionSheet__());\n  }\n\n  ngOnDestroy(): void {\n    this.dismissPicker();\n  }\n\n  private dismissPicker(): void {\n    if (this.uploadsDismissed) {\n      return;\n    }\n    this.uploadsDismissed = true;\n    const snapshot = [...this.images()];\n    cleanupPickerUploads(this.uploader, snapshot, {\n      retainUploaded: this.retainUploadedOnDismiss,\n    });\n    this.retainUploadedOnDismiss = false;\n    this.images.set([]);\n    this.caption = '';\n  }\n\n  getEmptyTitle(): string {\n    return this.isDragging()\n      ? this.translation.translateSync('@acorex:chat.pickers.images.drop-to-attach')\n      : this.translation.translateSync('@acorex:chat.pickers.images.select');\n  }\n\n  getEmptySubtitle(): string {\n    return this.isDragging()\n      ? this.translation.translateSync('@acorex:chat.pickers.common.release-to-upload')\n      : this.translation.translateSync('@acorex:chat.pickers.common.click-to-browse');\n  }\n\n  getSelectedCountText(): string {\n    return this.translation.translateSync('@acorex:chat.pickers.images.selected-count', {\n      params: { count: this.images().length },\n    });\n  }\n\n  getSendText(): string {\n    return this.translation.translateSync('@acorex:chat.pickers.images.send-count', {\n      params: { count: this.images().length },\n    });\n  }\n}\n","<ax-conversation-picker-shell\n  #pickerShell\n  [fileType]=\"catalogFileType\"\n  [multiple]=\"allowMultiple()\"\n  (filesSelected)=\"handleFiles($event)\"\n  (dragEnter)=\"isDragging.set(true)\"\n  (dragLeave)=\"isDragging.set(false)\"\n>\n  <ax-conversation-picker-header\n    [title]=\"getHeaderTitle()\"\n    [showMenu]=\"images().length > 0\"\n    [addMoreLabel]=\"translation.translateSync('@acorex:chat.pickers.common.add-more')\"\n    (onClose)=\"cancel()\"\n    (onAddMore)=\"onAddMoreFiles()\"\n  />\n\n  <div class=\"ax-conversation-picker__scroll\">\n    @if (images().length === 0) {\n      <ax-conversation-picker-empty\n        [title]=\"getEmptyTitle()\"\n        [hint]=\"getEmptySubtitle()\"\n        [iconClass]=\"emptyIconClass()\"\n        [dragOver]=\"isDragging()\"\n      />\n    } @else {\n      <div class=\"ax-conversation-picker__body\">\n        <div class=\"ax-conversation-picker__list\">\n          @for (image of images(); track image.id) {\n            <div class=\"ax-conversation-picker__row ax-conversation-picker__row--media\">\n              <div class=\"ax-conversation-picker__media-preview\">\n                <img [src]=\"image.preview\" [alt]=\"image.file.name\" />\n                @if (image.uploading || image.error) {\n                  <div class=\"ax-conversation-picker__media-overlay\">\n                    @if (image.uploading) {\n                      <span class=\"ax-conversation-picker__media-status\">{{\n                        getUploadingLabel(image.uploadProgress ?? 0)\n                      }}</span>\n                      <ax-progress-bar [progress]=\"image.uploadProgress || 0\" [mode]=\"'determinate'\" [height]=\"3\" />\n                    } @else if (image.error) {\n                      <span class=\"ax-conversation-picker__media-status\">{{ image.error }}</span>\n                    }\n                  </div>\n                }\n              </div>\n              <div class=\"ax-conversation-picker__row-main\">\n                <div class=\"ax-conversation-picker__details\">\n                  <div class=\"ax-conversation-picker__name\">{{ image.file.name }}</div>\n                </div>\n                <button\n                  type=\"button\"\n                  class=\"ax-conversation-picker__remove\"\n                  (click)=\"removeImage($index)\"\n                  [attr.aria-label]=\"\n                    image.uploading\n                      ? getCancelUploadLabel()\n                      : translation.translateSync('@acorex:chat.pickers.common.remove')\n                  \"\n                >\n                  <i class=\"fa-light fa-trash-can\"></i>\n                </button>\n              </div>\n            </div>\n          }\n        </div>\n      </div>\n    }\n  </div>\n\n  @if (images().length > 0) {\n    <ax-conversation-picker-caption\n      [(caption)]=\"caption\"\n      [sendDisabled]=\"!canSend()\"\n      (onSend)=\"sendImages()\"\n    />\n  }\n</ax-conversation-picker-shell>\n","/**\n * Picker Footer Component\n * Reusable footer for all picker components\n */\n\nimport { AXButtonComponent } from '@acorex/components/button';\nimport { Component, ViewEncapsulation, input, output } from '@angular/core';\n\n@Component({\n  selector: 'ax-conversation-picker-footer',\n  encapsulation: ViewEncapsulation.None,\n  imports: [AXButtonComponent],\n  templateUrl: './picker-footer.component.html',\n  styleUrl: './picker-footer.component.css',\n})\nexport class AXConversationPickerFooterComponent {\n  readonly sendText = input.required<string>();\n  readonly sendDisabled = input<boolean>(false);\n  readonly onCancel = output<void>();\n  readonly onSend = output<void>();\n}\n","<div class=\"ax-conversation-picker-footer\">\n  <ax-button text=\"Cancel\" look=\"solid\" color=\"danger\" (onClick)=\"onCancel.emit()\" />\n  <ax-button\n    [text]=\"sendText()\"\n    look=\"outline\"\n    color=\"primary\"\n    [disabled]=\"sendDisabled()\"\n    (onClick)=\"onSend.emit()\"\n  />\n</div>\n","/**\n * Location Picker Component\n * Full-width location selection interface for the composer\n */\n\nimport type { AXActionSheetRef } from '@acorex/components/action-sheet';\nimport type { AXPopupRef } from '@acorex/components/popup';\nimport { AXMapMarker, AXMapModule } from '@acorex/components/map';\nimport { AXTranslationModule, AXTranslationService } from '@acorex/core/translation';\nimport { CommonModule } from '@angular/common';\nimport { Component, ViewEncapsulation, inject, input, signal } from '@angular/core';\nimport { AXConversationComposerService } from '../../../../components/composer/composer.service';\nimport { AXConversation, AXConversationLocationPayload, AXConversationSendMessageCommand } from '../../../../models';\nimport { AXConversationPickerFooterComponent } from '../picker-footer/picker-footer.component';\nimport { AXConversationPickerHeaderComponent } from '../picker-header/picker-header.component';\nimport { dismissComposerPickerHost } from '../shared/picker-upload';\n\n@Component({\n  selector: 'ax-conversation-location-picker',\n  encapsulation: ViewEncapsulation.None,\n  imports: [\n    CommonModule,\n    AXMapModule,\n    AXTranslationModule,\n    AXConversationPickerHeaderComponent,\n    AXConversationPickerFooterComponent,\n  ],\n  templateUrl: './location-picker.component.html',\n  styleUrls: ['../shared/picker-shared.css', './location-picker.component.css'],\n})\nexport class AXConversationLocationPickerComponent {\n  readonly service = input<AXConversationComposerService | undefined>();\n  private readonly composerServiceFromInjector = inject(AXConversationComposerService, { optional: true });\n\n  private get composerService(): AXConversationComposerService {\n    const svc = this.service() ?? this.composerServiceFromInjector;\n    if (!svc) {\n      throw new Error('AXConversationComposerService is required for the location picker');\n    }\n    return svc;\n  }\n\n  readonly translation = inject(AXTranslationService);\n\n  readonly conversation = input.required<AXConversation>();\n  readonly __popup__ = input<AXPopupRef | undefined>();\n  readonly __actionSheet__ = input<AXActionSheetRef | undefined>();\n  // Default location\n  readonly currentLocation = signal<AXConversationLocationPayload>({\n    type: 'location',\n    latitude: 30,\n    longitude: 50,\n  });\n\n  onMarkerAdded(event: AXMapMarker): void {\n    // Event from ax-map markerAdded\n    this.currentLocation.set({\n      type: 'location',\n\n      latitude: event.latitude,\n      longitude: event.longitude,\n    });\n  }\n\n  async sendLocation(): Promise<void> {\n    const location = this.currentLocation();\n\n    const command: AXConversationSendMessageCommand = {\n      conversationId: this.conversation().id,\n      type: 'location',\n      payload: location,\n    };\n\n    this.cancel();\n\n    void this.composerService.sendMessage(command).catch((error) => {\n      console.error('Failed to send location:', error);\n    });\n  }\n\n  cancel(): void {\n    // Reset to default location\n    this.currentLocation.set({\n      type: 'location',\n      latitude: 0,\n      longitude: 0,\n    });\n    dismissComposerPickerHost(this.composerService, this.__popup__(), this.__actionSheet__());\n  }\n}\n","<div class=\"ax-conversation-picker ax-conversation-picker--location\">\n  <ax-conversation-picker-header\n    [title]=\"translation.translateSync('@acorex:chat.pickers.location.title')\"\n    (onClose)=\"cancel()\"\n  />\n\n  <div class=\"ax-conversation-picker__scroll\">\n    <!-- Map with Single Marker -->\n    <div class=\"map-container\">\n      <ax-map\n        [latitude]=\"currentLocation().latitude\"\n        [longitude]=\"currentLocation().longitude\"\n        [maxMarker]=\"1\"\n        [addMarkerOnTap]=\"true\"\n        [hasLocator]=\"true\"\n        (onMarkerAdded)=\"onMarkerAdded($event)\"\n      />\n    </div>\n\n    <!-- Location Info -->\n    <!-- <div class=\"location-info\">\n      <div class=\"info-row\">\n        <i class=\"fa-light fa-location-dot\"></i>\n        <div class=\"info-text\">\n          <div class=\"info-label\">{{ '@acorex:chat.pickers.location.coordinates' | translate | async }}</div>\n          <div class=\"info-value\">\n            {{ currentLocation().latitude.toFixed(6) }}, {{ currentLocation().longitude.toFixed(6) }}\n          </div>\n        </div>\n      </div>\n    </div> -->\n  </div>\n\n  <ax-conversation-picker-footer\n    [sendText]=\"translation.translateSync('@acorex:chat.pickers.location.send')\"\n    [sendDisabled]=\"false\"\n    (onCancel)=\"cancel()\"\n    (onSend)=\"sendLocation()\"\n  />\n</div>\n","import type { WritableSignal } from '@angular/core';\n\n/** Shared drag-and-drop handlers for composer pickers. */\nexport function createPickerDragHandlers(isDragging: WritableSignal<boolean>) {\n  return {\n    onDragEnter(event: DragEvent): void {\n      event.preventDefault();\n      event.stopPropagation();\n      isDragging.set(true);\n    },\n    onDragOver(event: DragEvent): void {\n      event.preventDefault();\n      event.stopPropagation();\n    },\n    onDragLeave(event: DragEvent): void {\n      event.preventDefault();\n      event.stopPropagation();\n      isDragging.set(false);\n    },\n    onDrop(event: DragEvent, onFiles: (files: File[]) => void): void {\n      event.preventDefault();\n      event.stopPropagation();\n      isDragging.set(false);\n      const files = Array.from(event.dataTransfer?.files ?? []);\n      if (files.length > 0) {\n        onFiles(files);\n      }\n    },\n  };\n}\n","import { AXUploaderBrowseDirective } from '@acorex/cdk/uploader';\nimport { AXButtonComponent } from '@acorex/components/button';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { Component, ViewEncapsulation, input } from '@angular/core';\n\n@Component({\n  selector: 'ax-conversation-picker-toolbar',\n  encapsulation: ViewEncapsulation.None,\n  imports: [AXButtonComponent, AXDecoratorModule, AXUploaderBrowseDirective],\n  templateUrl: './picker-toolbar.component.html',\n  styleUrl: './picker-toolbar.component.css',\n})\nexport class AXConversationPickerToolbarComponent {\n  readonly countLabel = input.required<string>();\n  readonly addMoreLabel = input.required<string>();\n}\n","<span class=\"ax-conversation-picker__count\">{{ countLabel() }}</span>\n<ax-button [text]=\"addMoreLabel()\" [look]=\"'ghost'\" axUploaderBrowseHandle>\n  <ax-prefix>\n    <ax-icon><i class=\"fa-light fa-plus\"></i></ax-icon>\n  </ax-prefix>\n</ax-button>\n","/**\n * Sticker Tab Component\n * Sticker picker for composer popup\n */\n\nimport { AXSearchBoxModule } from '@acorex/components/search-box';\nimport { AXSkeletonModule } from '@acorex/components/skeleton';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport { CommonModule } from '@angular/common';\nimport { HttpClient } from '@angular/common/http';\nimport { Component, DestroyRef, InjectionToken, ViewEncapsulation, effect, inject, output, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { firstValueFrom } from 'rxjs';\nimport { AXConversationStickerPayload } from '../../../../models';\n\ninterface AXConversationGiphyImage {\n  url: string;\n  width: string;\n  height: string;\n}\n\ninterface AXConversationGiphySticker {\n  id: string;\n  title: string;\n  images: {\n    fixed_height: AXConversationGiphyImage;\n  };\n}\n\ninterface AXConversationGiphyResponse {\n  data: AXConversationGiphySticker[];\n}\n\nexport const AX_CONVERSATION_STICKER_API_KEY = new InjectionToken<string>('AX_CONVERSATION_STICKER_API_KEY', {\n  providedIn: 'root',\n  factory: () => 'sXpGFDGZs0Dv1mmNFvYaGUvYwKX0PWIh',\n});\n\ninterface AXConversationStickerCategory {\n  id: string;\n  name: string;\n  icon: string;\n  searchTerm: string;\n}\n\n// Sticker categories using Giphy API\nconst AX_CONVERSATION_STICKER_CATEGORIES: AXConversationStickerCategory[] = [\n  { id: 'trending', name: 'Trending', icon: '🔥', searchTerm: 'trending' },\n  { id: 'happy', name: 'Happy', icon: '😊', searchTerm: 'happy' },\n  { id: 'love', name: 'Love', icon: '❤️', searchTerm: 'love' },\n  { id: 'funny', name: 'Funny', icon: '😂', searchTerm: 'funny' },\n  { id: 'cool', name: 'Cool', icon: '😎', searchTerm: 'cool' },\n  { id: 'party', name: 'Party', icon: '🎉', searchTerm: 'party' },\n];\n\n@Component({\n  selector: 'ax-conversation-sticker-tab',\n  encapsulation: ViewEncapsulation.None,\n  imports: [CommonModule, FormsModule, AXSkeletonModule, AXSearchBoxModule, AXTranslationModule],\n  templateUrl: './sticker-tab.component.html',\n  styleUrl: './sticker-tab.component.css',\n})\nexport class AXConversationStickerTabComponent {\n  private readonly http = inject(HttpClient);\n  private readonly destroyRef = inject(DestroyRef);\n  private readonly apiKey = inject(AX_CONVERSATION_STICKER_API_KEY);\n\n  readonly itemSelected = output<AXConversationStickerPayload>();\n  readonly searchQuery = signal('');\n  readonly activeStickers = signal<AXConversationStickerPayload[]>([]);\n  readonly loading = signal(false);\n  readonly stickerCategories = AX_CONVERSATION_STICKER_CATEGORIES;\n  readonly skeletonItems = Array.from({ length: 20 }, (_, i) => i);\n\n  private readonly activeCategoryId = signal<string>('trending');\n  private searchTimeout?: ReturnType<typeof setTimeout>;\n\n  constructor() {\n    effect(() => {\n      const categoryId = this.activeCategoryId();\n      const query = this.searchQuery();\n\n      if (query.trim()) {\n        this.searchStickers(query);\n      } else {\n        this.loadStickers(categoryId);\n      }\n    });\n\n    this.destroyRef.onDestroy(() => {\n      if (this.searchTimeout) clearTimeout(this.searchTimeout);\n    });\n  }\n\n  private async loadStickers(categoryId: string): Promise<void> {\n    this.loading.set(true);\n    try {\n      const category = AX_CONVERSATION_STICKER_CATEGORIES.find((c) => c.id === categoryId);\n      if (!category) return;\n\n      const endpoint =\n        categoryId === 'trending'\n          ? `https://api.giphy.com/v1/stickers/trending?api_key=${this.apiKey}&limit=20`\n          : `https://api.giphy.com/v1/stickers/search?api_key=${this.apiKey}&q=${category.searchTerm}&limit=20`;\n\n      const response = await firstValueFrom(this.http.get<AXConversationGiphyResponse>(endpoint));\n      this.activeStickers.set(this.mapGiphyStickers(response, categoryId));\n    } catch (error) {\n      console.error('Failed to load stickers:', error);\n      this.activeStickers.set([]);\n    } finally {\n      this.loading.set(false);\n    }\n  }\n\n  /** Select category */\n  selectPack(categoryId: string): void {\n    this.activeCategoryId.set(categoryId);\n    this.searchQuery.set('');\n  }\n\n  private async searchStickers(query: string): Promise<void> {\n    if (!query.trim()) {\n      this.loadStickers(this.activeCategoryId());\n      return;\n    }\n\n    this.loading.set(true);\n    try {\n      const endpoint = `https://api.giphy.com/v1/stickers/search?api_key=${this.apiKey}&q=${encodeURIComponent(query)}&limit=20`;\n      const response = await firstValueFrom(this.http.get<AXConversationGiphyResponse>(endpoint));\n      this.activeStickers.set(this.mapGiphyStickers(response, 'search'));\n    } catch (error) {\n      console.error('Failed to search stickers:', error);\n      this.activeStickers.set([]);\n    } finally {\n      this.loading.set(false);\n    }\n  }\n\n  onSearchChange(event: { value?: string }): void {\n    const query = event?.value || '';\n\n    if (this.searchTimeout) {\n      clearTimeout(this.searchTimeout);\n    }\n\n    this.searchTimeout = setTimeout(() => {\n      this.searchQuery.set(query);\n    }, 500);\n  }\n\n  /** Get category CSS classes */\n  getPackClasses(categoryId: string): string {\n    const classes = ['pack-button'];\n    if (this.activeCategoryId() === categoryId) {\n      classes.push('pack-button-active');\n    }\n    return classes.join(' ');\n  }\n\n  private mapGiphyStickers(response: AXConversationGiphyResponse, packId: string): AXConversationStickerPayload[] {\n    if (!response?.data) return [];\n    return response.data.map((item) => ({\n      type: 'sticker' as const,\n      id: item.id,\n      packId,\n      url: item.images.fixed_height.url,\n      animated: item.images.fixed_height.url.endsWith('.gif'),\n      width: Number(item.images.fixed_height.width),\n      height: Number(item.images.fixed_height.height),\n      emoji: item.title || 'Sticker',\n    }));\n  }\n\n  selectSticker(sticker: AXConversationStickerPayload): void {\n    this.itemSelected.emit(sticker);\n  }\n}\n","<div class=\"sticker-tab\">\n  <!-- Search -->\n  <div class=\"sticker-search\">\n    <ax-search-box\n      [value]=\"searchQuery()\"\n      [placeholder]=\"'Search stickers...'\"\n      (onValueChanged)=\"onSearchChange($event)\"\n    ></ax-search-box>\n  </div>\n\n  <!-- Categories -->\n  <div class=\"sticker-packs\">\n    @for (category of stickerCategories; track category.id) {\n      <button\n        type=\"button\"\n        [class]=\"getPackClasses(category.id)\"\n        (click)=\"selectPack(category.id)\"\n        [attr.aria-label]=\"category.name\"\n        [title]=\"category.name\"\n      >\n        {{ category.icon }}\n      </button>\n    }\n  </div>\n\n  <!-- Loading State -->\n  @if (loading()) {\n    <div class=\"sticker-grid\">\n      @for (i of skeletonItems; track i) {\n        <div class=\"sticker-skeleton\">\n          <ax-skeleton [animated]=\"true\" class=\"skeleton-item\"></ax-skeleton>\n        </div>\n      }\n    </div>\n  }\n\n  <!-- Stickers Grid -->\n  @if (!loading() && activeStickers().length > 0) {\n    <div class=\"sticker-grid\">\n      @for (sticker of activeStickers(); track sticker.id) {\n        <button\n          type=\"button\"\n          class=\"sticker-button\"\n          (click)=\"selectSticker(sticker)\"\n          [attr.aria-label]=\"sticker.emoji\"\n        >\n          <img [src]=\"sticker.url\" [alt]=\"sticker.emoji || 'Sticker'\" class=\"sticker-image\" loading=\"lazy\" />\n        </button>\n      }\n    </div>\n  }\n\n  <!-- Empty State -->\n  @if (!loading() && activeStickers().length === 0) {\n    <div class=\"sticker-empty\">\n      <p>{{ '@acorex:chat.empty.no-stickers-available' | translate | async }}</p>\n    </div>\n  }\n</div>\n","import type { AXFileCopyData, AXFileType } from '@acorex/core/file';\nimport { AXFileTypeInfoProvider, createFileTypeMetadata } from '@acorex/core/file';\nimport { isPlatformBrowser } from '@angular/common';\nimport { Injectable } from '@angular/core';\nimport type { AXConversationVideoPayload } from '../../../../models';\nimport { AX_CONVERSATION_VIDEO_CATALOG } from '../../../../models/message-file-type-catalog';\nimport { normalizeVideoPayload } from '../../../message-list/components/video-renderer/video.payload';\nimport { formatDuration, formatFileSize } from '../shared/media-formatters';\n\nexport { AX_CONVERSATION_VIDEO_CATALOG };\n\nconst MB = 1024 * 1024;\n\nexport const AX_CONVERSATION_VIDEO_PRESENTATION = {\n  icon: 'fa-light fa-video ax-text-blue-500',\n  title: 'Video',\n} as const;\n\ntype AXConversationFileTypeUtilityContext = {\n  readAsDataUrl: (file: File | Blob) => Promise<string>;\n  platformId: object;\n};\n\nconst AX_CONVERSATION_VIDEO_UTILITY = {\n  preview: 'preview',\n  duration: 'duration',\n  formatSize: 'formatSize',\n  formatDuration: 'formatDuration',\n  createLocalPreviewUrl: 'createLocalPreviewUrl',\n} as const;\n\nfunction blobUrl(ctx: AXConversationFileTypeUtilityContext, blob: Blob): string {\n  if (!isPlatformBrowser(ctx.platformId)) {\n    return '';\n  }\n  return URL.createObjectURL(blob);\n}\n\nfunction mediaDuration(ctx: AXConversationFileTypeUtilityContext, file: File | Blob, tag: 'video' | 'audio'): Promise<number> {\n  if (!isPlatformBrowser(ctx.platformId)) {\n    return Promise.resolve(0);\n  }\n  return new Promise((resolve, reject) => {\n    const el = document.createElement(tag);\n    el.preload = 'metadata';\n    el.onloadedmetadata = () => {\n      URL.revokeObjectURL(el.src);\n      resolve(el.duration);\n    };\n    el.onerror = () => {\n      URL.revokeObjectURL(el.src);\n      reject(new Error(`Failed to load ${tag} metadata`));\n    };\n    el.src = URL.createObjectURL(file);\n  });\n}\n\nexport function conversationVideoUtilities(): NonNullable<AXFileType['utilities']> {\n  return {\n    [AX_CONVERSATION_VIDEO_UTILITY.preview]: (ctx, file) => (ctx as AXConversationFileTypeUtilityContext).readAsDataUrl(file as File),\n    [AX_CONVERSATION_VIDEO_UTILITY.duration]: (ctx, file) => mediaDuration(ctx as AXConversationFileTypeUtilityContext, file as File, 'video'),\n    [AX_CONVERSATION_VIDEO_UTILITY.formatSize]: (_ctx, bytes) => formatFileSize(bytes as number),\n    [AX_CONVERSATION_VIDEO_UTILITY.formatDuration]: (_ctx, seconds) => formatDuration(seconds as number),\n    [AX_CONVERSATION_VIDEO_UTILITY.createLocalPreviewUrl]: async (ctx, source) => {\n      const blob = source as File | Blob;\n      if (blob.type.startsWith('image/')) {\n        return (ctx as AXConversationFileTypeUtilityContext).readAsDataUrl(blob);\n      }\n      return blobUrl(ctx as AXConversationFileTypeUtilityContext, blob);\n    },\n  };\n}\n\nexport function createConversationVideoFileType(): AXFileType {\n  const presentation = AX_CONVERSATION_VIDEO_PRESENTATION;\n  return {\n    name: AX_CONVERSATION_VIDEO_CATALOG,\n    metadata: createFileTypeMetadata('conversation'),\n    title: presentation.title,\n    icon: presentation.icon,\n    validations: {\n      mimeTypes: ['video/*'],\n      minSize: 1,\n      maxSize: 500 * MB,\n    },\n    extensions: [\n      { name: 'mp4', title: 'MP4' },\n      { name: 'webm', title: 'WebM', validations: { maxSize: 200 * MB } },\n      { name: 'ogg', title: 'OGG' },\n    ],\n    utilities: conversationVideoUtilities(),\n    copy: (payload): AXFileCopyData => {\n      const video = normalizeVideoPayload(payload as AXConversationVideoPayload);\n      const caption = video.caption?.trim();\n      const urls = video.videos.map((item) => item.url?.trim()).filter((url): url is string => !!url);\n      return {\n        text: caption ?? '',\n        meta: { kind: 'video', caption, urls, count: video.videos.length },\n      };\n    },\n  };\n}\n\n@Injectable({ providedIn: 'root' })\nexport class AXConversationVideoFileTypeProvider extends AXFileTypeInfoProvider {\n  items() {\n    return Promise.resolve([createConversationVideoFileType()]);\n  }\n}\n","import type { AXUploadResult } from '@acorex/cdk/uploader';\nimport type { AXConversationMessagePayload, AXConversationVideoMediaItem, AXConversationVideoPayload } from '../../../../models';\nimport type { AXConversationUploaderResult } from '../../../../models/conversation-upload.types';\nimport { normalizeVideoPayload } from '../../../message-list/components/video-renderer/video.payload';\nimport { resolvePersistableMediaUrl, resolvePersistedThumbnailUrl } from '../shared/persisted-media-url';\n\nexport function videoItemFromUpload(\n  file: File,\n  result: AXConversationUploaderResult,\n  duration: number,\n): AXConversationVideoMediaItem {\n  const url = resolvePersistableMediaUrl(result.url);\n  const item: AXConversationVideoMediaItem = {\n    mediaId: result.mediaId,\n    mimeType: result.mimeType,\n    size: result.size,\n    thumbnailUrl: resolvePersistedThumbnailUrl(result.thumbnailUrl, url),\n    duration,\n    width: 0,\n    height: 0,\n    metadata: result.metadata,\n  };\n  if (url) {\n    item.url = url;\n  }\n  return item;\n}\n\nexport function mergeVideoUploadResult(\n  payload: AXConversationMessagePayload,\n  result: AXUploadResult,\n): AXConversationMessagePayload {\n  const base = normalizeVideoPayload(payload as AXConversationVideoPayload);\n  const videos = [...base.videos];\n  const i = videos.findIndex((x) => !x.mediaId && !resolvePersistableMediaUrl(x.url));\n  const slot = i >= 0 ? videos[i] : undefined;\n  const url = resolvePersistableMediaUrl(result.url);\n  const next: AXConversationVideoMediaItem = {\n    ...(slot ?? { duration: 0, width: 0, height: 0 }),\n    mediaId: result.mediaId,\n    mimeType: result.mimeType,\n    size: result.size,\n    thumbnailUrl: resolvePersistedThumbnailUrl(result.thumbnailUrl ?? slot?.thumbnailUrl, url),\n    metadata: result.metadata,\n  };\n  if (url) {\n    next.url = url;\n  }\n  if (i >= 0) videos[i] = next;\n  else videos.push(next);\n  return { ...base, type: 'video', videos };\n}\n\nexport function applyVideoLocalPreview(\n  payload: AXConversationMessagePayload,\n  localUrl: string,\n  mimeType = 'application/octet-stream',\n): AXConversationMessagePayload {\n  const base = normalizeVideoPayload(payload as AXConversationVideoPayload);\n  const videos = [...base.videos];\n  const slot = videos.findIndex((x) => !x.mediaId && !resolvePersistableMediaUrl(x.url));\n  const preview = { url: localUrl, duration: 0, width: 0, height: 0, mimeType };\n  if (slot >= 0) {\n    videos[slot] = { ...videos[slot], ...preview };\n  } else if (videos.length === 0) {\n    videos.push(preview);\n  } else {\n    videos[0] = { ...videos[0], ...preview };\n  }\n  return { ...base, type: 'video', videos };\n}\n","/**\n * Video Picker Component\n * Full-width video selection and preview interface for the composer\n */\n\nimport { AXUploaderService } from '@acorex/cdk/uploader';\nimport type { AXActionSheetRef } from '@acorex/components/action-sheet';\nimport type { AXPopupRef } from '@acorex/components/popup';\nimport { AXProgressBarModule } from '@acorex/components/progress-bar';\nimport { AXToastService } from '@acorex/components/toast';\nimport {\n  AXFileService,\n  AXFileTypeRegistryService,\n  runFileTypeUtility,\n  runFileTypeUtilityForFile,\n  type AXFileType,\n} from '@acorex/core/file';\nimport { AXTranslationModule, AXTranslationService } from '@acorex/core/translation';\nimport { CommonModule } from '@angular/common';\nimport { Component, OnDestroy, PLATFORM_ID, ViewEncapsulation, computed, inject, input, signal, viewChild } from '@angular/core';\nimport { AXConversationComposerService } from '../../../../components/composer/composer.service';\nimport { AXConversation, AXConversationSendMessageCommand } from '../../../../models';\nimport type { AXConversationComposerActionComponent } from '../../../../registries/composer-action.registry';\nimport { AXConversationPickerHeaderComponent } from '../picker-header/picker-header.component';\nimport { AXConversationPickerCaptionComponent } from '../shared/picker-caption.component';\nimport { AXConversationPickerEmptyComponent } from '../shared/picker-empty.component';\nimport { AXConversationPickerShellComponent } from '../shared/picker-shell.component';\nimport {\n  cleanupPickerUploads,\n  createPickerUploadItemId,\n  dismissComposerPickerHost,\n  getPickerCancelUploadLabel,\n  isUploadAborted,\n  limitFilesToCapacity,\n  notifyMaxFilesCapacityExceeded,\n  notifyPickerValidationErrors,\n  pickerItemToUploadResult,\n  uploadPickerFile,\n  type AXConversationComposerPickerUploadItem,\n} from '../shared/picker-upload';\nimport { installComposerPickerAutoRun, runComposerPickerAutoRunBrowse } from '../shared/picker-auto-run';\nimport {\n  AX_CONVERSATION_VIDEO_CATALOG,\n  AX_CONVERSATION_VIDEO_PRESENTATION,\n  createConversationVideoFileType,\n} from './conversation-video.file-type';\nimport { videoItemFromUpload } from './video-composer.payload';\n\ninterface AXConversationVideoFile extends AXConversationComposerPickerUploadItem {\n  preview?: string;\n  duration?: number;\n}\n\n@Component({\n  selector: 'ax-conversation-video-picker',\n  encapsulation: ViewEncapsulation.None,\n  imports: [\n    CommonModule,\n    AXProgressBarModule,\n    AXTranslationModule,\n    AXConversationPickerHeaderComponent,\n    AXConversationPickerEmptyComponent,\n    AXConversationPickerCaptionComponent,\n    AXConversationPickerShellComponent,\n  ],\n  templateUrl: './video-picker.component.html',\n  styleUrls: ['../shared/picker-shared.css'],\n})\nexport class AXConversationVideoPickerComponent implements OnDestroy, AXConversationComposerActionComponent {\n  private uploadsDismissed = false;\n  private retainUploadedOnDismiss = false;\n  readonly service = input<AXConversationComposerService | undefined>();\n  private readonly composerServiceFromInjector = inject(AXConversationComposerService, { optional: true });\n\n  private get composerService(): AXConversationComposerService {\n    const svc = this.service() ?? this.composerServiceFromInjector;\n    if (!svc) {\n      throw new Error('AXConversationComposerService is required for the video picker');\n    }\n    return svc;\n  }\n  private readonly uploader = inject(AXUploaderService);\n  private readonly fileService = inject(AXFileService);\n  private readonly fileTypeRegistry = inject(AXFileTypeRegistryService);\n  private readonly platformId = inject(PLATFORM_ID);\n  private readonly toast = inject(AXToastService);\n  readonly translation = inject(AXTranslationService);\n\n  readonly conversation = input.required<AXConversation>();\n  readonly maxFiles = input<number>(10);\n  readonly initialFiles = input<File[]>([]);\n  readonly autoRun = input(false);\n  readonly __popup__ = input<AXPopupRef | undefined>();\n  readonly __actionSheet__ = input<AXActionSheetRef | undefined>();\n\n  readonly catalogFileType = AX_CONVERSATION_VIDEO_CATALOG;\n\n  readonly videos = signal<AXConversationVideoFile[]>([]);\n  readonly isDragging = signal(false);\n  private readonly pickerShell = viewChild<AXConversationPickerShellComponent>('pickerShell');\n  caption = '';\n\n  readonly allowMultiple = computed(() => this.maxFiles() > 1);\n  readonly typeIconClass = AX_CONVERSATION_VIDEO_PRESENTATION.icon;\n  readonly emptyIconClass = computed(() =>\n    this.isDragging() ? 'fa-light fa-cloud-arrow-up' : AX_CONVERSATION_VIDEO_PRESENTATION.icon,\n  );\n\n  private catalogFileTypeDef?: AXFileType;\n\n  constructor() {\n    this.fileTypeRegistry.registerTypes([createConversationVideoFileType()]);\n    installComposerPickerAutoRun({\n      autoRun: this.autoRun,\n      initialFiles: this.initialFiles,\n      activate: () => this.activate(),\n      seedFiles: (files) => this.handleFiles(files),\n    });\n  }\n\n  activate(): Promise<void> {\n    return runComposerPickerAutoRunBrowse({\n      fileTypeRegistry: this.fileTypeRegistry,\n      uploader: this.uploader,\n      toast: this.toast,\n      translation: this.translation,\n      catalogFileType: this.catalogFileType,\n      maxFiles: this.maxFiles(),\n      hasExistingFiles: () => this.videos().length > 0,\n      handleFiles: (files) => this.handleFiles(files),\n      onCancelled: () => this.cancel(),\n    });\n  }\n\n  private createUtilityContext() {\n    return {\n      readAsDataUrl: (file: File | Blob) => this.fileService.blobToBase64(file),\n      platformId: this.platformId,\n    };\n  }\n\n  private async getCatalogFileTypeDef(): Promise<AXFileType | undefined> {\n    this.catalogFileTypeDef ??= await this.fileService.getFileType(this.catalogFileType);\n    return this.catalogFileTypeDef;\n  }\n\n  private async runUtility(name: string, file: File, ...args: unknown[]): Promise<unknown> {\n    const fileType = await this.getCatalogFileTypeDef();\n    if (!fileType) return undefined;\n    return runFileTypeUtilityForFile(fileType, this.createUtilityContext(), file, name, ...args);\n  }\n\n  async handleFiles(files: File[]): Promise<void> {\n    const max = this.maxFiles();\n    const capacity = limitFilesToCapacity(files, this.videos().length, max);\n    if (capacity.length < files.length) {\n      notifyMaxFilesCapacityExceeded(this.toast, this.translation, max);\n    }\n    if (capacity.length === 0) {\n      return;\n    }\n\n    const { accepted, rejected } = await this.uploader.validateFiles(capacity, this.catalogFileType);\n\n    notifyPickerValidationErrors(this.toast, this.translation, rejected);\n\n    for (const file of accepted) {\n      try {\n        const previewResult = await this.runUtility('preview', file);\n        const durationResult = await this.runUtility('duration', file);\n        const preview = typeof previewResult === 'string' ? previewResult : undefined;\n        const duration = typeof durationResult === 'number' ? durationResult : 0;\n        let index = -1;\n        this.videos.update((videos) => {\n          index = videos.length;\n          return [...videos, { id: createPickerUploadItemId(), file, preview, duration, uploadProgress: 0, uploading: true }];\n        });\n        if (index >= 0) {\n          void this.uploadVideoAt(index, file);\n        }\n      } catch (error) {\n        console.error('Failed to process video:', error);\n      }\n    }\n  }\n\n  private async uploadVideoAt(index: number, file: File): Promise<void> {\n    const abortController = new AbortController();\n    this.patchVideo(index, { abortController });\n\n    try {\n      const result = await uploadPickerFile(\n        this.uploader,\n        this.conversation().id,\n        file,\n        (progress) => this.patchVideo(index, { uploadProgress: progress, uploading: true }),\n        abortController.signal,\n      );\n      this.patchVideo(index, {\n        uploadProgress: 100,\n        uploading: false,\n        uploaded: true,\n        uploadedUrl: result.url,\n        mediaId: result.mediaId,\n      });\n    } catch (err) {\n      if (this.uploadsDismissed || isUploadAborted(err, abortController.signal)) {\n        return;\n      }\n      this.patchVideo(index, {\n        uploading: false,\n        error: this.translation.translateSync('@acorex:chat.errors.upload-failed'),\n      });\n    }\n  }\n\n  private patchVideo(index: number, patch: Partial<AXConversationVideoFile>): void {\n    if (this.uploadsDismissed) {\n      return;\n    }\n    this.videos.update((items) => {\n      const next = [...items];\n      if (next[index]) {\n        next[index] = { ...next[index], ...patch };\n      }\n      return next;\n    });\n  }\n\n  removeVideo(index: number): void {\n    const item = this.videos()[index];\n    if (item) {\n      cleanupPickerUploads(this.uploader, [item]);\n    }\n    this.videos.update((videos) => videos.filter((_, i) => i !== index));\n  }\n\n  async sendVideos(): Promise<void> {\n    const videoList = this.videos();\n    if (!this.canSend()) return;\n\n    const videos = videoList.flatMap((video) => {\n      const result = pickerItemToUploadResult(video);\n      return result ? [videoItemFromUpload(video.file, result, video.duration ?? 0)] : [];\n    });\n\n    if (videos.length === 0) {\n      return;\n    }\n\n    const command: AXConversationSendMessageCommand = {\n      conversationId: this.conversation().id,\n      type: 'video',\n      payload: {\n        type: 'video',\n        videos,\n        caption: this.caption.trim() || undefined,\n      },\n    };\n\n    this.retainUploadedOnDismiss = true;\n    const popup = this.__popup__();\n    this.dismissPicker();\n    dismissComposerPickerHost(this.composerService, popup, this.__actionSheet__());\n\n    void this.composerService.sendMessage(command).catch(() => {\n      this.retainUploadedOnDismiss = false;\n    });\n  }\n\n  canSend(): boolean {\n    const list = this.videos();\n    return list.length > 0 && list.every((v) => v.uploaded && !v.error && !v.uploading);\n  }\n\n  getUploadingLabel(progress: number): string {\n    return this.translation.translateSync('@acorex:chat.pickers.files.uploading-progress', {\n      params: { progress },\n    });\n  }\n\n  getCancelUploadLabel(): string {\n    return getPickerCancelUploadLabel(this.translation);\n  }\n\n  getHeaderTitle(): string {\n    const count = this.videos().length;\n    if (count === 0) {\n      return this.translation.translateSync('@acorex:chat.pickers.videos.title');\n    }\n    return this.translation.translateSync('@acorex:chat.pickers.videos.send-count', {\n      params: { count },\n    });\n  }\n\n  onAddMoreFiles(): void {\n    void this.pickerShell()?.browse();\n  }\n\n  cancel(): void {\n    this.dismissPicker();\n    dismissComposerPickerHost(this.composerService, this.__popup__(), this.__actionSheet__());\n  }\n\n  ngOnDestroy(): void {\n    this.dismissPicker();\n  }\n\n  private dismissPicker(): void {\n    if (this.uploadsDismissed) {\n      return;\n    }\n    this.uploadsDismissed = true;\n    const snapshot = [...this.videos()];\n    cleanupPickerUploads(this.uploader, snapshot, {\n      retainUploaded: this.retainUploadedOnDismiss,\n    });\n    this.retainUploadedOnDismiss = false;\n    this.videos.set([]);\n    this.caption = '';\n  }\n\n  formatFileSize(bytes: number): string {\n    const fileType = this.catalogFileTypeDef;\n    const result = fileType\n      ? runFileTypeUtility(fileType, this.createUtilityContext(), undefined, 'formatSize', bytes)\n      : undefined;\n    return typeof result === 'string' ? result : `${bytes} B`;\n  }\n\n  formatDuration(seconds: number): string {\n    const fileType = this.catalogFileTypeDef;\n    const result = fileType\n      ? runFileTypeUtility(fileType, this.createUtilityContext(), undefined, 'formatDuration', seconds)\n      : undefined;\n    return typeof result === 'string' ? result : '0:00';\n  }\n\n  getEmptyTitle(): string {\n    return this.isDragging()\n      ? this.translation.translateSync('@acorex:chat.pickers.videos.drop-to-attach')\n      : this.translation.translateSync('@acorex:chat.pickers.videos.select');\n  }\n\n  getEmptySubtitle(): string {\n    return this.isDragging()\n      ? this.translation.translateSync('@acorex:chat.pickers.common.release-to-upload')\n      : this.translation.translateSync('@acorex:chat.pickers.common.click-to-browse');\n  }\n\n  getSelectedCountText(): string {\n    return this.translation.translateSync('@acorex:chat.pickers.videos.selected-count', {\n      params: { count: this.videos().length },\n    });\n  }\n\n  getSendText(): string {\n    return this.translation.translateSync('@acorex:chat.pickers.videos.send-count', {\n      params: { count: this.videos().length },\n    });\n  }\n}\n","<ax-conversation-picker-shell\n  #pickerShell\n  [fileType]=\"catalogFileType\"\n  [multiple]=\"allowMultiple()\"\n  (filesSelected)=\"handleFiles($event)\"\n  (dragEnter)=\"isDragging.set(true)\"\n  (dragLeave)=\"isDragging.set(false)\"\n>\n  <ax-conversation-picker-header\n    [title]=\"getHeaderTitle()\"\n    [showMenu]=\"videos().length > 0\"\n    [addMoreLabel]=\"translation.translateSync('@acorex:chat.pickers.common.add-more')\"\n    (onClose)=\"cancel()\"\n    (onAddMore)=\"onAddMoreFiles()\"\n  />\n\n  <div class=\"ax-conversation-picker__scroll\">\n    @if (videos().length === 0) {\n      <ax-conversation-picker-empty\n        [title]=\"getEmptyTitle()\"\n        [hint]=\"getEmptySubtitle()\"\n        [iconClass]=\"emptyIconClass()\"\n        [dragOver]=\"isDragging()\"\n      />\n    } @else {\n      <div class=\"ax-conversation-picker__body\">\n        <div class=\"ax-conversation-picker__list\">\n          @for (video of videos(); track video.id) {\n            <div class=\"ax-conversation-picker__row ax-conversation-picker__row--media\">\n              <div class=\"ax-conversation-picker__media-preview\">\n                @if (video.preview) {\n                  <video [src]=\"video.preview\" muted playsinline preload=\"metadata\"></video>\n                  <!-- <span class=\"ax-conversation-picker__thumb-badge\" aria-hidden=\"true\"\n                    ><i class=\"fa-solid fa-play\"></i\n                  ></span> -->\n                }\n                @if (video.uploading || video.error) {\n                  <div class=\"ax-conversation-picker__media-overlay\">\n                    @if (video.uploading) {\n                      <span class=\"ax-conversation-picker__media-status\">{{\n                        getUploadingLabel(video.uploadProgress ?? 0)\n                      }}</span>\n                      <ax-progress-bar [progress]=\"video.uploadProgress || 0\" [mode]=\"'determinate'\" [height]=\"3\" />\n                    } @else if (video.error) {\n                      <span class=\"ax-conversation-picker__media-status\">{{ video.error }}</span>\n                    }\n                  </div>\n                }\n              </div>\n              <div class=\"ax-conversation-picker__row-main\">\n                <div class=\"ax-conversation-picker__details\">\n                  <div class=\"ax-conversation-picker__name\">{{ video.file.name }}</div>\n                  <div class=\"ax-conversation-picker__status\">\n                    <span>{{ formatFileSize(video.file.size) }}</span>\n                    @if (video.duration) {\n                      <span>{{ formatDuration(video.duration) }}</span>\n                    }\n                  </div>\n                </div>\n                <button\n                  type=\"button\"\n                  class=\"ax-conversation-picker__remove\"\n                  (click)=\"removeVideo($index)\"\n                  [attr.aria-label]=\"\n                    video.uploading\n                      ? getCancelUploadLabel()\n                      : translation.translateSync('@acorex:chat.pickers.common.remove')\n                  \"\n                >\n                  <i class=\"fa-light fa-trash-can\"></i>\n                </button>\n              </div>\n            </div>\n          }\n        </div>\n      </div>\n    }\n  </div>\n\n  @if (videos().length > 0) {\n    <ax-conversation-picker-caption [(caption)]=\"caption\" [sendDisabled]=\"!canSend()\" (onSend)=\"sendVideos()\" />\n  }\n</ax-conversation-picker-shell>\n","import type { AXFileCopyData, AXFileType } from '@acorex/core/file';\nimport { AXFileTypeInfoProvider, createFileTypeMetadata } from '@acorex/core/file';\nimport { isPlatformBrowser } from '@angular/common';\nimport { Injectable } from '@angular/core';\nimport type { AXConversationVoicePayload } from '../../../../models';\nimport { AX_CONVERSATION_VOICE_CATALOG } from '../../../../models/message-file-type-catalog';\nimport { formatDuration } from '../shared/media-formatters';\n\nexport { AX_CONVERSATION_VOICE_CATALOG };\n\nconst MB = 1024 * 1024;\n\nexport const AX_CONVERSATION_VOICE_PRESENTATION = {\n  icon: 'fa-light fa-microphone text-green-500',\n  title: 'Voice message',\n} as const;\n\ntype AXConversationFileTypeUtilityContext = {\n  readAsDataUrl: (file: File | Blob) => Promise<string>;\n  platformId: object;\n};\n\nconst AX_CONVERSATION_VOICE_UTILITY = {\n  duration: 'duration',\n  formatDuration: 'formatDuration',\n  createLocalPreviewUrl: 'createLocalPreviewUrl',\n} as const;\n\nfunction blobUrl(ctx: AXConversationFileTypeUtilityContext, blob: Blob): string {\n  if (!isPlatformBrowser(ctx.platformId)) {\n    return '';\n  }\n  return URL.createObjectURL(blob);\n}\n\nfunction mediaDuration(ctx: AXConversationFileTypeUtilityContext, file: File | Blob): Promise<number> {\n  if (!isPlatformBrowser(ctx.platformId)) {\n    return Promise.resolve(0);\n  }\n  return new Promise((resolve, reject) => {\n    const el = document.createElement('audio');\n    el.preload = 'metadata';\n    el.onloadedmetadata = () => {\n      URL.revokeObjectURL(el.src);\n      resolve(el.duration);\n    };\n    el.onerror = () => {\n      URL.revokeObjectURL(el.src);\n      reject(new Error('Failed to load audio metadata'));\n    };\n    el.src = URL.createObjectURL(file);\n  });\n}\n\nexport function conversationVoiceUtilities(): NonNullable<AXFileType['utilities']> {\n  return {\n    [AX_CONVERSATION_VOICE_UTILITY.duration]: (ctx, file) =>\n      mediaDuration(ctx as AXConversationFileTypeUtilityContext, file as File | Blob),\n    [AX_CONVERSATION_VOICE_UTILITY.formatDuration]: (_ctx, seconds) => formatDuration(seconds as number),\n    [AX_CONVERSATION_VOICE_UTILITY.createLocalPreviewUrl]: (ctx, source) =>\n      blobUrl(ctx as AXConversationFileTypeUtilityContext, source as Blob),\n  };\n}\n\nexport function createConversationVoiceFileType(): AXFileType {\n  const presentation = AX_CONVERSATION_VOICE_PRESENTATION;\n  return {\n    name: AX_CONVERSATION_VOICE_CATALOG,\n    metadata: createFileTypeMetadata('conversation'),\n    title: presentation.title,\n    icon: presentation.icon,\n    validations: {\n      mimeTypes: ['audio/webm', 'audio/ogg', 'audio/mp4', 'audio/*'],\n      minSize: 1,\n      maxSize: 50 * MB,\n    },\n    utilities: conversationVoiceUtilities(),\n    copy: (payload): AXFileCopyData => {\n      const voice = payload as AXConversationVoicePayload;\n      const url = voice.url?.trim() ?? '';\n      return {\n        text: '',\n        meta: {\n          kind: 'voice',\n          url,\n          duration: voice.duration,\n          mimeType: voice.mimeType,\n        },\n      };\n    },\n  };\n}\n\n@Injectable({ providedIn: 'root' })\nexport class AXConversationVoiceFileTypeProvider extends AXFileTypeInfoProvider {\n  items() {\n    return Promise.resolve([createConversationVoiceFileType()]);\n  }\n}\n","import type { AXUploadResult } from '@acorex/cdk/uploader';\nimport type { AXConversationMessagePayload } from '../../../../models';\n\nexport function mergeVoiceUploadResult(\n  payload: AXConversationMessagePayload,\n  result: AXUploadResult,\n): AXConversationMessagePayload {\n  return {\n    ...(payload as Extract<AXConversationMessagePayload, { type: 'voice' }>),\n    type: 'voice',\n    url: result.url,\n    mediaId: result.mediaId,\n    mimeType: result.mimeType,\n    size: result.size,\n    metadata: result.metadata,\n  };\n}\n\nexport function applyVoiceLocalPreview(payload: AXConversationMessagePayload, localUrl: string): AXConversationMessagePayload {\n  return { ...(payload as Extract<AXConversationMessagePayload, { type: 'voice' }>), type: 'voice', url: localUrl };\n}\n","/**\n * Voice Recorder Component\n * Full-width voice recording interface for the composer\n */\n\nimport type { AXActionSheetRef } from '@acorex/components/action-sheet';\nimport type { AXPopupRef } from '@acorex/components/popup';\nimport { AXUploaderService } from '@acorex/cdk/uploader';\nimport { AXFileTypeRegistryService } from '@acorex/core/file';\nimport { AXButtonComponent } from '@acorex/components/button';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXLabelModule } from '@acorex/components/label';\nimport { AXProgressBarModule } from '@acorex/components/progress-bar';\nimport { AXToastService } from '@acorex/components/toast';\nimport { AXTranslationModule, AXTranslationService } from '@acorex/core/translation';\nimport { CommonModule, isPlatformBrowser } from '@angular/common';\nimport { Component, DestroyRef, PLATFORM_ID, ViewEncapsulation, computed, inject, input, output, signal } from '@angular/core';\nimport { AXConversationComposerService } from '../../../../components/composer/composer.service';\nimport type { AXConversation, AXConversationSendMessageCommand } from '../../../../models';\nimport type { AXConversationComposerActionComponent } from '../../../../registries/composer-action.registry';\nimport { ensureConversationFileCatalogRegistered } from '../../composer-actions/conversation-composer-file-types.provider';\nimport { installComposerPickerAutoRun } from '../shared/picker-auto-run';\nimport { dismissComposerPickerHost } from '../shared/picker-upload';\nimport { isUploadAborted, notifyPickerValidationErrors } from '../shared/picker-upload';\nimport { AX_CONVERSATION_VOICE_CATALOG, createConversationVoiceFileType } from './conversation-voice.file-type';\n\n@Component({\n  selector: 'ax-conversation-voice-recorder',\n  encapsulation: ViewEncapsulation.None,\n  imports: [\n    CommonModule,\n    AXButtonComponent,\n    AXDecoratorModule,\n    AXLabelModule,\n    AXProgressBarModule,\n    AXTranslationModule,\n  ],\n  templateUrl: './voice-recorder.component.html',\n  styleUrl: './voice-recorder.component.css',\n})\nexport class AXConversationVoiceRecorderComponent implements AXConversationComposerActionComponent {\n  private readonly platformId = inject(PLATFORM_ID);\n  private readonly destroyRef = inject(DestroyRef);\n  readonly service = input<AXConversationComposerService | undefined>();\n  private readonly composerServiceFromInjector = inject(AXConversationComposerService, { optional: true });\n\n  private get composerService(): AXConversationComposerService {\n    const svc = this.service() ?? this.composerServiceFromInjector;\n    if (!svc) {\n      throw new Error('AXConversationComposerService is required for the voice recorder');\n    }\n    return svc;\n  }\n\n  private readonly uploader = inject(AXUploaderService);\n  private readonly fileTypeRegistry = inject(AXFileTypeRegistryService);\n  private readonly toast = inject(AXToastService);\n  readonly translation = inject(AXTranslationService);\n\n  readonly conversation = input.required<AXConversation>();\n  readonly initialFiles = input<File[]>([]);\n  readonly autoRun = input(false);\n  readonly __popup__ = input<AXPopupRef | undefined>();\n  readonly __actionSheet__ = input<AXActionSheetRef | undefined>();\n  readonly recordingComplete = output<Blob>();\n  readonly recordingCancelled = output<void>();\n\n  readonly isRecording = signal(false);\n  readonly isUploading = signal(false);\n  readonly uploadProgress = signal(0);\n  readonly recordingDuration = signal(0);\n\n  private recordingStartTime = 0;\n  private timerInterval?: number;\n  private mediaRecorder?: MediaRecorder;\n  private audioChunks: Blob[] = [];\n  private activeStream?: MediaStream;\n  private cancelled = false;\n  private uploadAbortController?: AbortController;\n\n  readonly formattedTime = computed(() => {\n    const duration = this.recordingDuration();\n    const minutes = Math.floor(duration / 60);\n    const seconds = duration % 60;\n    return `${minutes}:${seconds.toString().padStart(2, '0')}`;\n  });\n\n  constructor() {\n    this.fileTypeRegistry.registerTypes([createConversationVoiceFileType()]);\n    this.destroyRef.onDestroy(() => this.stopAndCleanup());\n    installComposerPickerAutoRun({\n      autoRun: this.autoRun,\n      initialFiles: this.initialFiles,\n      activate: () => this.activate(),\n      seedFiles: () => undefined,\n    });\n  }\n\n  activate(): Promise<void> {\n    return this.startRecording();\n  }\n\n  async startRecording(): Promise<void> {\n    if (!isPlatformBrowser(this.platformId)) return;\n\n    try {\n      const stream = await navigator.mediaDevices.getUserMedia({ audio: true });\n      this.activeStream = stream;\n      this.mediaRecorder = new MediaRecorder(stream);\n      this.audioChunks = [];\n      this.cancelled = false;\n\n      this.mediaRecorder.ondataavailable = (event) => {\n        if (event.data.size > 0) {\n          this.audioChunks.push(event.data);\n        }\n      };\n\n      this.mediaRecorder.onstop = async () => {\n        stream.getTracks().forEach((track) => track.stop());\n        this.activeStream = undefined;\n\n        if (this.cancelled) {\n          this.cancelled = false;\n          return;\n        }\n\n        const audioBlob = new Blob(this.audioChunks, { type: 'audio/webm' });\n        this.recordingComplete.emit(audioBlob);\n\n        const conv = this.conversation();\n        if (conv && this.audioChunks.length > 0) {\n          await this.sendVoiceMessage(audioBlob, conv);\n        }\n      };\n\n      this.mediaRecorder.start();\n      this.isRecording.set(true);\n      this.recordingStartTime = Date.now();\n      this.recordingDuration.set(0);\n\n      this.timerInterval = window.setInterval(() => {\n        const elapsed = Math.floor((Date.now() - this.recordingStartTime) / 1000);\n        this.recordingDuration.set(elapsed);\n      }, 1000);\n    } catch (error) {\n      console.error('Failed to start recording:', error);\n      if (this.autoRun()) {\n        this.dismissHost();\n      }\n    }\n  }\n\n  private dismissHost(): void {\n    dismissComposerPickerHost(this.composerService, this.__popup__(), this.__actionSheet__());\n  }\n\n  /** Stop recording and send */\n  stopRecording(): void {\n    if (this.mediaRecorder && this.isRecording()) {\n      this.mediaRecorder.stop();\n      this.isRecording.set(false);\n      this.clearTimer();\n      this.dismissHost();\n    }\n  }\n\n  cancelRecording(): void {\n    if (this.mediaRecorder && this.isRecording()) {\n      this.cancelled = true;\n      this.mediaRecorder.stop();\n      this.isRecording.set(false);\n      this.clearTimer();\n      this.audioChunks = [];\n      this.recordingCancelled.emit();\n      this.dismissHost();\n    }\n  }\n\n  /** Close the voice recorder */\n  cancel(): void {\n    if (this.isRecording()) {\n      this.cancelRecording();\n      return;\n    }\n    this.abortInProgressUploads();\n    this.dismissHost();\n  }\n\n  abortInProgressUploads(): void {\n    if (this.uploadAbortController && !this.uploadAbortController.signal.aborted) {\n      this.uploadAbortController.abort();\n    }\n    this.uploadAbortController = undefined;\n    if (this.isUploading()) {\n      this.isUploading.set(false);\n      this.uploadProgress.set(0);\n    }\n  }\n\n  /** Clear timer */\n  private clearTimer(): void {\n    if (this.timerInterval) {\n      clearInterval(this.timerInterval);\n      this.timerInterval = undefined;\n    }\n  }\n\n  getUploadingLabel(): string {\n    return this.translation.translateSync('@acorex:chat.pickers.files.uploading-progress', {\n      params: { progress: this.uploadProgress() },\n    });\n  }\n\n  /** Send voice message */\n  private async sendVoiceMessage(audioBlob: Blob, conversation: AXConversation): Promise<void> {\n    const voiceFile = new File([audioBlob], `voice-${Date.now()}.webm`, { type: 'audio/webm' });\n    await ensureConversationFileCatalogRegistered(this.fileTypeRegistry, AX_CONVERSATION_VOICE_CATALOG);\n    const { rejected } = await this.uploader.validateFiles([voiceFile], AX_CONVERSATION_VOICE_CATALOG);\n\n    if (rejected.length > 0) {\n      notifyPickerValidationErrors(this.toast, this.translation, rejected);\n      return;\n    }\n\n    this.uploadAbortController = new AbortController();\n    const uploadSignal = this.uploadAbortController.signal;\n    this.isUploading.set(true);\n    this.uploadProgress.set(0);\n\n    const command: AXConversationSendMessageCommand = {\n      conversationId: conversation.id,\n      type: 'voice',\n      payload: {\n        type: 'voice',\n        url: '',\n        duration: this.recordingDuration(),\n        size: audioBlob.size,\n        mimeType: 'audio/webm',\n      },\n    };\n\n    this.dismissHost();\n\n    void this.composerService\n      .sendMessage(command, {\n        media: {\n          source: audioBlob,\n          fileName: `voice-${Date.now()}.webm`,\n          mimeType: 'audio/webm',\n          onProgress: (percent) => {\n            if (!uploadSignal.aborted) {\n              this.uploadProgress.set(percent);\n            }\n          },\n          signal: uploadSignal,\n        },\n      })\n      .catch((error) => {\n        if (!isUploadAborted(error, uploadSignal)) {\n          console.error('Failed to send voice message:', error);\n        }\n      })\n      .finally(() => {\n        this.uploadAbortController = undefined;\n        if (!uploadSignal.aborted) {\n          this.isUploading.set(false);\n          this.uploadProgress.set(0);\n        }\n      });\n  }\n\n  private stopAndCleanup(): void {\n    this.abortInProgressUploads();\n    this.clearTimer();\n    if (this.mediaRecorder?.state === 'recording') {\n      this.cancelled = true;\n      this.mediaRecorder.stop();\n    }\n    this.activeStream?.getTracks().forEach((track) => track.stop());\n    this.activeStream = undefined;\n  }\n}\n","<div class=\"voice-recorder\">\n  <!-- Header with Close Button -->\n  <div class=\"recorder-header\">\n    <h3 class=\"recorder-title\">{{ '@acorex:chat.voice-recorder.title' | translate | async }}</h3>\n    <button\n      type=\"button\"\n      class=\"close-button\"\n      (click)=\"cancel()\"\n      [attr.aria-label]=\"'@acorex:chat.actions.close' | translate | async\"\n    >\n      <i class=\"fa-light fa-xmark\"></i>\n    </button>\n  </div>\n\n  <div class=\"recorder-content\">\n    @if (isUploading()) {\n      <div class=\"recorder-upload\">\n        <ax-label>{{ getUploadingLabel() }}</ax-label>\n        <ax-progress-bar [progress]=\"uploadProgress()\" [mode]=\"'determinate'\" [height]=\"6\" />\n      </div>\n    } @else if (!isRecording()) {\n      <!-- Start Recording State -->\n      <div class=\"recorder-idle\">\n        <button class=\"record-button\" (click)=\"startRecording()\">\n          <i class=\"fa-light fa-microphone\"></i>\n        </button>\n        <span class=\"recorder-hint\">{{ '@acorex:chat.voice-recorder.tap-to-start' | translate | async }}</span>\n      </div>\n    } @else {\n      <!-- Recording State -->\n      <div class=\"recorder-active\">\n        <div class=\"recorder-info\">\n          <div class=\"recording-indicator\">\n            <span class=\"pulse-dot\"></span>\n            <span class=\"recording-text\">{{ '@acorex:chat.voice-recorder.recording' | translate | async }}</span>\n          </div>\n          <div class=\"recording-time\">{{ formattedTime() }}</div>\n        </div>\n\n        <div class=\"recorder-actions\">\n          <ax-button\n            [text]=\"translation.translateSync('@acorex:chat.actions.cancel')\"\n            [look]=\"'ghost'\"\n            (onClick)=\"cancelRecording()\"\n          >\n            <ax-prefix>\n              <ax-icon><i class=\"fa-light fa-xmark\"></i></ax-icon>\n            </ax-prefix>\n          </ax-button>\n\n          <ax-button\n            [text]=\"translation.translateSync('@acorex:chat.actions.send')\"\n            [look]=\"'primary'\"\n            (onClick)=\"stopRecording()\"\n          >\n            <ax-prefix>\n              <ax-icon><i class=\"fa-light fa-paper-plane\"></i></ax-icon>\n            </ax-prefix>\n          </ax-button>\n        </div>\n      </div>\n    }\n  </div>\n</div>\n","import type { AXConversationComposerAction } from '../../../registries/composer-action.registry';\n\nexport const AX_CONVERSATION_COMPOSER_EMOJI_ACTION: AXConversationComposerAction = {\n  id: 'emoji',\n  label: '@acorex:chat.actions.emoji-and-stickers',\n  icon: 'fa-light fa-face-smile',\n  position: 'end',\n  priority: 10,\n  visible: () => true,\n  handler: async () => undefined,\n  tooltip: '@acorex:chat.actions.emoji-and-stickers',\n};\n","import type { AXConversationComposerAction } from '../../../registries/composer-action.registry';\nimport { AX_CONVERSATION_IMAGE_CATALOG } from '../../../models/message-file-type-catalog';\n\nexport const AX_CONVERSATION_COMPOSER_IMAGE_ACTION: AXConversationComposerAction = {\n  id: 'image',\n  label: '@acorex:chat.image',\n  icon: 'fa-light fa-image',\n  position: 'start',\n  location: 'menu',\n  priority: 40,\n  componentLoader: () =>\n    import('../components/image-picker/image-picker.component').then((m) => m.AXConversationImagePickerComponent),\n  fileType: AX_CONVERSATION_IMAGE_CATALOG,\n  toggleable: true,\n  autoRun: true,\n  visible: (context) => !context.isEditing,\n  tooltip: '@acorex:chat.tooltips.send-image',\n};\n","import type { AXConversationComposerAction } from '../../../registries/composer-action.registry';\nimport { AX_CONVERSATION_VIDEO_CATALOG } from '../../../models/message-file-type-catalog';\n\nexport const AX_CONVERSATION_COMPOSER_VIDEO_ACTION: AXConversationComposerAction = {\n  id: 'video',\n  label: '@acorex:chat.video',\n  icon: 'fa-light fa-video',\n  position: 'start',\n  location: 'menu',\n  priority: 50,\n  componentLoader: () =>\n    import('../components/video-picker/video-picker.component').then((m) => m.AXConversationVideoPickerComponent),\n  fileType: AX_CONVERSATION_VIDEO_CATALOG,\n  toggleable: true,\n  autoRun: true,\n  visible: (context) => !context.isEditing,\n  tooltip: '@acorex:chat.tooltips.send-video',\n};\n","import { AX_CONVERSATION_FILE_CATALOG } from '../../../models/message-file-type-catalog';\nimport type { AXConversationComposerAction } from '../../../registries/composer-action.registry';\n\nexport const AX_CONVERSATION_COMPOSER_FILE_ACTION: AXConversationComposerAction = {\n  id: 'file',\n  label: '@acorex:chat.file',\n  icon: 'fa-light fa-file',\n  position: 'start',\n  location: 'menu',\n  priority: 20,\n  componentLoader: () =>\n    import('../components/file-picker/file-picker.component').then((m) => m.AXConversationFilePickerComponent),\n  fileType: AX_CONVERSATION_FILE_CATALOG,\n  toggleable: true,\n  autoRun: true,\n  visible: (context) => !context.isEditing,\n  tooltip: '@acorex:chat.tooltips.attach-file',\n};\n","import { AX_CONVERSATION_VOICE_CATALOG } from '../../../models/message-file-type-catalog';\nimport type { AXConversationComposerAction } from '../../../registries/composer-action.registry';\n\nexport const AX_CONVERSATION_COMPOSER_VOICE_RECORDING_ACTION: AXConversationComposerAction = {\n  id: 'voice-recording',\n  label: '@acorex:chat.voice',\n  icon: 'fa-light fa-microphone',\n  position: 'end',\n  priority: 30,\n  default: true,\n  componentLoader: () =>\n    import('../components/voice-recorder/voice-recorder.component').then((m) => m.AXConversationVoiceRecorderComponent),\n  fileType: AX_CONVERSATION_VOICE_CATALOG,\n  toggleable: true,\n  autoRun: true,\n  visible: (context) => !context.isEditing,\n  tooltip: '@acorex:chat.tooltips.record-voice-message',\n};\n","import type { AXConversationComposerAction } from '../../../registries/composer-action.registry';\nimport { AX_CONVERSATION_AUDIO_CATALOG } from '../../../models/message-file-type-catalog';\n\nexport const AX_CONVERSATION_COMPOSER_AUDIO_ACTION: AXConversationComposerAction = {\n  id: 'audio',\n  label: '@acorex:chat.audio',\n  icon: 'fa-light fa-music',\n  position: 'start',\n  location: 'menu',\n  priority: 60,\n  componentLoader: () =>\n    import('../components/audio-picker/audio-picker.component').then((m) => m.AXConversationAudioPickerComponent),\n  fileType: AX_CONVERSATION_AUDIO_CATALOG,\n  toggleable: true,\n  autoRun: true,\n  visible: (context) => !context.isEditing,\n  tooltip: '@acorex:chat.tooltips.send-audio-file',\n};\n","import type { AXConversationComposerAction } from '../../../registries/composer-action.registry';\n\nexport const AX_CONVERSATION_COMPOSER_LOCATION_ACTION: AXConversationComposerAction = {\n  id: 'location',\n  label: '@acorex:chat.location',\n  icon: 'fa-light fa-location-dot',\n  position: 'start',\n  location: 'menu',\n  priority: 70,\n  componentLoader: () =>\n    import('../components/location-picker/location-picker.component').then((m) => m.AXConversationLocationPickerComponent),\n  toggleable: true,\n  visible: (context) => !context.isEditing,\n  tooltip: '@acorex:chat.tooltips.send-location',\n};\n","import type { AXUploadResult } from '@acorex/cdk/uploader';\nimport type { AXFileService } from '@acorex/core/file';\nimport { resolveFileTypeExtension, runFileTypeUtility } from '@acorex/core/file';\nimport { isPlatformBrowser } from '@angular/common';\nimport type { AXConversationImageMediaItem, AXConversationImagePayload, AXConversationMessagePayload, AXConversationMessageType } from '../../../models';\nimport type { AXConversationUploaderReference } from '../../../models/conversation-upload.types';\nimport { AX_CONVERSATION_MESSAGE_TYPE_FILE_TYPE, resolveConversationMessageFileType } from '../../../models/message-file-type-catalog';\n\nexport { resolveConversationMessageFileType, AX_CONVERSATION_MESSAGE_TYPE_FILE_TYPE };\n\nasync function mergeImageUploadResult(\n  payload: AXConversationMessagePayload,\n  result: AXUploadResult,\n): Promise<AXConversationMessagePayload> {\n  const [{ normalizeImagePayload }, { resolvePersistableMediaUrl, resolvePersistedThumbnailUrl }] = await Promise.all([\n    import('../../message-list/components/image-renderer/image.payload'),\n    import('../components/shared/persisted-media-url'),\n  ]);\n  const base = normalizeImagePayload(payload as AXConversationImagePayload);\n  const images = [...base.images];\n  const i = images.findIndex((x) => !x.mediaId && !resolvePersistableMediaUrl(x.url));\n  const slot = i >= 0 ? images[i] : undefined;\n  const url = resolvePersistableMediaUrl(result.url);\n  const next: AXConversationImageMediaItem = {\n    ...(slot ?? { width: 0, height: 0 }),\n    mediaId: result.mediaId,\n    mimeType: result.mimeType,\n    size: result.size,\n    thumbnailUrl: resolvePersistedThumbnailUrl(result.thumbnailUrl ?? slot?.thumbnailUrl, url),\n    metadata: result.metadata,\n  };\n  if (url) {\n    next.url = url;\n  }\n  if (i >= 0) images[i] = next;\n  else images.push(next);\n  return { ...base, type: 'image', images };\n}\n\nasync function applyImageLocalPreview(\n  payload: AXConversationMessagePayload,\n  localUrl: string,\n  mimeType = 'application/octet-stream',\n): Promise<AXConversationMessagePayload> {\n  const [{ normalizeImagePayload }, { resolvePersistableMediaUrl }] = await Promise.all([\n    import('../../message-list/components/image-renderer/image.payload'),\n    import('../components/shared/persisted-media-url'),\n  ]);\n  const base = normalizeImagePayload(payload as AXConversationImagePayload);\n  const images = [...base.images];\n  const slot = images.findIndex((x) => !x.mediaId && !resolvePersistableMediaUrl(x.url));\n  const preview = { url: localUrl, width: 0, height: 0, mimeType };\n  if (slot >= 0) {\n    images[slot] = { ...images[slot], ...preview };\n  } else if (images.length === 0) {\n    images.push(preview);\n  } else {\n    images[0] = { ...images[0], ...preview };\n  }\n  return { ...base, type: 'image', images };\n}\n\nexport async function mergeUploadResult(\n  type: AXConversationMessageType,\n  payload: AXConversationMessagePayload,\n  result: AXUploadResult,\n): Promise<AXConversationMessagePayload> {\n  switch (type) {\n    case 'image':\n      return mergeImageUploadResult(payload, result);\n    case 'video': {\n      const { mergeVideoUploadResult } = await import('../components/video-picker/video-composer.payload');\n      return mergeVideoUploadResult(payload, result);\n    }\n    case 'audio': {\n      const { mergeAudioUploadResult } = await import('../components/audio-picker/audio-composer.payload');\n      return mergeAudioUploadResult(payload, result);\n    }\n    case 'file': {\n      const { mergeFileUploadResult } = await import('../components/file-picker/file-composer.payload');\n      return mergeFileUploadResult(payload, result);\n    }\n    case 'voice': {\n      const { mergeVoiceUploadResult } = await import('../components/voice-recorder/voice-composer.payload');\n      return mergeVoiceUploadResult(payload, result);\n    }\n    case 'sticker':\n      return {\n        ...(payload as Extract<AXConversationMessagePayload, { type: 'sticker' }>),\n        type: 'sticker',\n        url: result.url,\n        mediaId: result.mediaId,\n      };\n    default:\n      return payload;\n  }\n}\n\nexport async function applyLocalPreview(\n  type: AXConversationMessageType,\n  payload: AXConversationMessagePayload,\n  localUrl: string,\n  mimeType = 'application/octet-stream',\n): Promise<AXConversationMessagePayload> {\n  switch (type) {\n    case 'image':\n      return applyImageLocalPreview(payload, localUrl, mimeType);\n    case 'video': {\n      const { applyVideoLocalPreview } = await import('../components/video-picker/video-composer.payload');\n      return applyVideoLocalPreview(payload, localUrl, mimeType);\n    }\n    case 'audio': {\n      const { applyAudioLocalPreview } = await import('../components/audio-picker/audio-composer.payload');\n      return applyAudioLocalPreview(payload, localUrl, mimeType);\n    }\n    case 'file': {\n      const { applyFileLocalPreview } = await import('../components/file-picker/file-composer.payload');\n      return applyFileLocalPreview(payload, localUrl, mimeType);\n    }\n    case 'voice': {\n      const { applyVoiceLocalPreview } = await import('../components/voice-recorder/voice-composer.payload');\n      return applyVoiceLocalPreview(payload, localUrl);\n    }\n    case 'sticker':\n      return { ...(payload as Extract<AXConversationMessagePayload, { type: 'sticker' }>), type: 'sticker', url: localUrl };\n    default:\n      return payload;\n  }\n}\n\nexport function toUploaderReference(payload: AXConversationMessagePayload): AXConversationUploaderReference {\n  switch (payload.type) {\n    case 'image': {\n      const first = payload.images[0];\n      return { url: first?.url, mediaId: first?.mediaId, mimeType: first?.mimeType, size: first?.size };\n    }\n    case 'video': {\n      const first = payload.videos[0];\n      return { url: first?.url, mediaId: first?.mediaId, mimeType: first?.mimeType, size: first?.size };\n    }\n    case 'audio': {\n      const first = payload.audios[0];\n      return { url: first?.url, mediaId: first?.mediaId, mimeType: first?.mimeType, size: first?.size };\n    }\n    case 'file': {\n      const first = payload.files[0];\n      return { url: first?.url, mediaId: first?.mediaId, mimeType: first?.mimeType, size: first?.size };\n    }\n    case 'voice':\n    case 'sticker':\n      return {\n        url: payload.url,\n        mediaId: payload.mediaId,\n        mimeType: payload.mimeType,\n        size: payload.size,\n      };\n    default:\n      return {};\n  }\n}\n\nexport function createObjectUrl(platformId: object, blob: Blob): string {\n  if (!isPlatformBrowser(platformId)) {\n    return '';\n  }\n  return URL.createObjectURL(blob);\n}\n\nexport function revokeObjectUrl(platformId: object, url: string): void {\n  if (isPlatformBrowser(platformId) && url.startsWith('blob:')) {\n    URL.revokeObjectURL(url);\n  }\n}\n\nexport async function createLocalPreviewUrl(\n  fileService: AXFileService,\n  platformId: object,\n  source: File | Blob,\n  messageType: AXConversationMessageType,\n): Promise<string | undefined> {\n  const catalog = AX_CONVERSATION_MESSAGE_TYPE_FILE_TYPE[messageType];\n  if (!catalog) {\n    return undefined;\n  }\n  const fileType = await fileService.getFileType(catalog);\n  if (!fileType) {\n    return undefined;\n  }\n  const ctx = { readAsDataUrl: (f: File | Blob) => fileService.blobToBase64(f), platformId };\n  const extension = resolveFileTypeExtension(fileType, {\n    file: source instanceof File ? source : undefined,\n    mimeType: source.type,\n  });\n  const result = await runFileTypeUtility(fileType, ctx, extension, 'createLocalPreviewUrl', source);\n  return typeof result === 'string' ? result : undefined;\n}\n","/**\n * Search Component for Info Bar\n * Provides search functionality within conversations\n */\n\nimport { AXButtonComponent } from '@acorex/components/button';\nimport { AXLabelComponent } from '@acorex/components/label';\nimport { AXSearchBoxComponent } from '@acorex/components/search-box';\nimport { CommonModule, isPlatformBrowser } from '@angular/common';\nimport { Component, DestroyRef, PLATFORM_ID, ViewEncapsulation, inject, input, signal } from '@angular/core';\nimport { AXConversationInfoBarService } from '../../../components/info-bar/info-bar.service';\nimport type { AXConversation, AXConversationMessage } from '../../../models';\nimport { AXConversationService } from '../../../services/conversation.service';\nimport { AX_CONVERSATION_CONFIG } from '../../../tokens';\n\n@Component({\n  selector: 'ax-conversation-info-bar-search',\n  encapsulation: ViewEncapsulation.None,\n  imports: [CommonModule, AXSearchBoxComponent, AXButtonComponent, AXLabelComponent],\n  templateUrl: './search.component.html',\n  styleUrl: './search.component.css',\n})\nexport class AXConversationInfoBarSearchComponent {\n  private readonly platformId = inject(PLATFORM_ID);\n  private readonly destroyRef = inject(DestroyRef);\n  private readonly infoBarService = inject(AXConversationInfoBarService);\n  private readonly conversationService = inject(AXConversationService);\n  private readonly config = inject(AX_CONVERSATION_CONFIG);\n\n  /** Conversation input */\n  readonly conversation = input.required<AXConversation>();\n\n  /** Service input */\n  readonly service = input<AXConversationInfoBarService>();\n\n  /** Search query from service */\n  readonly searchQuery = this.infoBarService.searchQuery;\n\n  /** Results count from service */\n  readonly resultsCount = this.infoBarService.searchResultsCount;\n\n  /** Current index from service */\n  readonly currentIndex = this.infoBarService.currentSearchIndex;\n\n  private readonly searchResults = signal<AXConversationMessage[]>([]);\n  private searchDebounceTimer?: ReturnType<typeof setTimeout>;\n  private scrollTimer?: ReturnType<typeof setTimeout>;\n  private searchRequestId = 0;\n\n  constructor() {\n    this.destroyRef.onDestroy(() => {\n      if (this.scrollTimer) clearTimeout(this.scrollTimer);\n      if (this.searchDebounceTimer) clearTimeout(this.searchDebounceTimer);\n    });\n  }\n\n  /** Handle search input change */\n  onSearchChange(value: string): void {\n    this.infoBarService.setSearchQuery(value);\n\n    if (this.searchDebounceTimer) {\n      clearTimeout(this.searchDebounceTimer);\n    }\n\n    const trimmed = value.trim();\n    if (!trimmed) {\n      this.searchResults.set([]);\n      this.infoBarService.setSearchResults(0, 0);\n      return;\n    }\n\n    this.searchDebounceTimer = setTimeout(() => {\n      this.searchDebounceTimer = undefined;\n      void this.performSearch(trimmed);\n    }, this.config.debounceSearch);\n  }\n\n  /** Perform server-side search in messages */\n  private async performSearch(query: string): Promise<void> {\n    const requestId = ++this.searchRequestId;\n\n    try {\n      const results = await this.conversationService.searchMessages(this.conversation().id, query);\n      if (requestId !== this.searchRequestId) {\n        return;\n      }\n\n      this.searchResults.set(results);\n      this.infoBarService.setSearchResults(results.length, 0);\n\n      if (results.length > 0) {\n        this.scrollToResult(results[0].id);\n      }\n    } catch (error) {\n      console.error('Failed to search messages:', error);\n      if (requestId === this.searchRequestId) {\n        this.searchResults.set([]);\n        this.infoBarService.setSearchResults(0, 0);\n      }\n    }\n  }\n\n  /** Navigate to next result */\n  onNext(): void {\n    this.infoBarService.nextSearchResult();\n    this.scrollToCurrentResult();\n  }\n\n  /** Navigate to previous result */\n  onPrevious(): void {\n    this.infoBarService.previousSearchResult();\n    this.scrollToCurrentResult();\n  }\n\n  /** Scroll to current search result */\n  private scrollToCurrentResult(): void {\n    const results = this.searchResults();\n    const currentIdx = this.currentIndex();\n    const message = results[currentIdx];\n    if (message) {\n      this.scrollToResult(message.id);\n    }\n  }\n\n  private scrollToResult(messageId: string): void {\n    if (!isPlatformBrowser(this.platformId)) return;\n\n    if (this.scrollTimer) clearTimeout(this.scrollTimer);\n    this.scrollTimer = setTimeout(() => {\n      const element = document.querySelector(`[data-message-id=\"${messageId}\"]`);\n      if (element) {\n        element.scrollIntoView({ behavior: 'smooth', block: 'center' });\n      }\n    }, 100);\n  }\n}\n","<div class=\"search-wrapper\">\n  <ax-search-box\n    class=\"search-input\"\n    [placeholder]=\"'Search in conversation'\"\n    [value]=\"searchQuery()\"\n    (onValueChanged)=\"onSearchChange($event.value)\"\n  ></ax-search-box>\n\n  @if (searchQuery() && resultsCount() > 0) {\n    <div class=\"search-results\">\n      <ax-label class=\"results-text\"> {{ currentIndex() + 1 }} / {{ resultsCount() }} </ax-label>\n      <ax-button\n        class=\"nav-button\"\n        [text]=\"'↑'\"\n        [look]=\"'ghost'\"\n        [size]=\"'sm'\"\n        (onClick)=\"onPrevious()\"\n        [disabled]=\"resultsCount() === 0\"\n      ></ax-button>\n      <ax-button\n        class=\"nav-button\"\n        [text]=\"'↓'\"\n        [look]=\"'ghost'\"\n        [size]=\"'sm'\"\n        (onClick)=\"onNext()\"\n        [disabled]=\"resultsCount() === 0\"\n      ></ax-button>\n    </div>\n  }\n</div>\n","/**\n * Info Bar Actions Plugin\n * Individual info bar action constants\n */\n\nimport { inject } from '@angular/core';\nimport { AXPlatform } from '@acorex/core/platform';\nimport { AXConversationInfoBarAction } from '../../../registries';\nimport { AXConversationService } from '../../../services';\n\n/**\n * Search in conversation action (inline on desktop, menu on mobile)\n */\nexport const AX_CONVERSATION_INFO_BAR_SEARCH_ACTION: AXConversationInfoBarAction = {\n  id: 'search',\n  label: '@acorex:chat.actions.search',\n  icon: 'fa-light fa-magnifying-glass',\n  tooltip: '@acorex:chat.tooltips.search-in-conversation',\n  location: () => (inject(AXPlatform).is('Mobile') ? 'menu' : 'inline'),\n  toggleable: true,\n  componentLoader: () =>\n    import('../components/search.component').then((m) => m.AXConversationInfoBarSearchComponent),\n  priority: 200,\n};\n\n/**\n * Mute/Unmute notifications action (menu)\n */\nexport const AX_CONVERSATION_INFO_BAR_MUTE_ACTION: AXConversationInfoBarAction = {\n  id: 'mute',\n  label: (context) => {\n    const notifications = inject(AXConversationService).getRoomPreferences(context.conversation.id).notifications;\n    return notifications ? '@acorex:chat.actions.mute' : '@acorex:chat.actions.unmute';\n  },\n  icon: (context) => {\n    const notifications = inject(AXConversationService).getRoomPreferences(context.conversation.id).notifications;\n    return notifications ? 'fa-light fa-bell-slash' : 'fa-light fa-bell';\n  },\n  location: 'menu',\n  priority: 90,\n  handler: async (context) => {\n    const service = inject(AXConversationService);\n    const currentNotifications = service.getRoomPreferences(context.conversation.id).notifications;\n    await service.updateConversationSettings(context.conversation.id, {\n      notifications: !currentNotifications,\n    });\n  },\n};\n\n/**\n * Divider separator (menu)\n */\nexport const AX_CONVERSATION_INFO_BAR_DIVIDER: AXConversationInfoBarAction = {\n  id: 'divider-1',\n  label: '',\n  divider: true,\n  location: 'menu',\n  priority: 80,\n};\n\n/**\n * Archive/Unarchive conversation action (menu)\n */\nexport const AX_CONVERSATION_INFO_BAR_ARCHIVE_ACTION: AXConversationInfoBarAction = {\n  id: 'archive',\n  label: (context) =>\n    context.conversation.archived ? '@acorex:chat.actions.unarchive' : '@acorex:chat.actions.archive',\n  icon: (context) => (context.conversation.archived ? 'fa-light fa-box-open' : 'fa-light fa-box'),\n  location: 'menu',\n  priority: 70,\n  handler: async (context) => {\n    await inject(AXConversationService).updateConversation(context.conversation.id, {\n      archived: !context.conversation.archived,\n    });\n  },\n};\n\n/**\n * Delete/Leave conversation action (smart action that adapts based on conversation type)\n * - Private: \"Delete\" - Deletes the conversation\n * - Group/Channel: \"Leave & Delete\" - Leaves the group and removes it from list\n */\nexport const AX_CONVERSATION_INFO_BAR_DELETE_ACTION: AXConversationInfoBarAction = {\n  id: 'delete',\n  label: (context) => {\n    const isGroup = context.conversation.type === 'group' || context.conversation.type === 'channel';\n    return isGroup ? '@acorex:chat.actions.leave-and-delete' : '@acorex:chat.actions.delete';\n  },\n  icon: (context) => {\n    const isGroup = context.conversation.type === 'group' || context.conversation.type === 'channel';\n    return isGroup ? 'fa-light fa-door-open' : 'fa-light fa-trash';\n  },\n  location: 'menu',\n  priority: 60,\n  destructive: true,\n  handler: async (context) => {\n    const conversationService = inject(AXConversationService);\n    // Service handles confirmation dialog\n    const result = await conversationService.deleteConversation(context.conversation.id);\n\n    // Close the active conversation if it's being deleted/left\n    if (conversationService.activeConversation()?.id === context.conversation.id && result) {\n      conversationService.closeActiveConversation();\n    }\n  },\n};\n\n/**\n * Block user action (private chats only, menu)\n */\nexport const AX_CONVERSATION_INFO_BAR_BLOCK_ACTION: AXConversationInfoBarAction = {\n  id: 'block',\n  label: (context) => (context.conversation.blocked ? '@acorex:chat.actions.unblock' : '@acorex:chat.actions.block'),\n  icon: 'fa-light fa-user-slash',\n  location: 'menu',\n  priority: 50,\n  destructive: true,\n  visible: (context) => context.conversation.type === 'private',\n  handler: async (context) => {\n    const currentBlocked = context.conversation.blocked;\n    await inject(AXConversationService).updateConversation(context.conversation.id, {\n      blocked: !currentBlocked,\n    });\n  },\n};\n","import type { AXConversationMediaItemFields } from '../../../../models';\nimport type { AXConversationUploaderReference } from '../../../../models/conversation-upload.types';\n\nexport function toUploaderReference(item: AXConversationMediaItemFields): AXConversationUploaderReference {\n  return {\n    url: item.url,\n    mediaId: item.mediaId,\n    mimeType: item.mimeType,\n    size: item.size,\n  };\n}\n","/** Shared formatting for message renderer UIs. */\n\nexport function formatMediaDuration(seconds: number): string {\n  if (!Number.isFinite(seconds)) {\n    return '0:00';\n  }\n  const m = Math.floor(seconds / 60);\n  const s = Math.floor(seconds % 60);\n  return `${m}:${s.toString().padStart(2, '0')}`;\n}\n\nexport function formatFileByteSize(bytes: number): string {\n  if (bytes === 0) {\n    return '0 B';\n  }\n  const k = 1024;\n  const sizes = ['B', 'KB', 'MB', 'GB'] as const;\n  const i = Math.min(Math.floor(Math.log(bytes) / Math.log(k)), sizes.length - 1);\n  return `${Math.round((bytes / k ** i) * 100) / 100} ${sizes[i]}`;\n}\n","/**\n * Resolves multimedia payload URLs for renderers (direct url or mediaId via uploader).\n */\n\nimport { DestroyRef, effect, inject, signal, type Signal } from '@angular/core';\nimport { AXUploaderService } from '@acorex/cdk/uploader';\nimport { isNonPersistableMediaUrl } from '../../../composer/components/shared/persisted-media-url';\nimport type { AXConversationUploaderReference } from '../../../../models/conversation-upload.types';\n\n/**\n * Creates a signal of the resolved playback URL for a media reference.\n */\nexport function createResolvedMediaUrlSignal(\n  reference: Signal<AXConversationUploaderReference | undefined>,\n): Signal<string | null> {\n  const uploader = inject(AXUploaderService);\n  const destroyRef = inject(DestroyRef);\n  const resolvedUrl = signal<string | null>(null);\n\n  let abortController: AbortController | null = null;\n\n  effect(() => {\n    const ref = reference();\n    abortController?.abort();\n    abortController = new AbortController();\n\n    const trimmedUrl = ref?.url?.trim();\n    if (!trimmedUrl && !ref?.mediaId) {\n      resolvedUrl.set(null);\n      return;\n    }\n\n    const directUrl =\n      trimmedUrl && !isNonPersistableMediaUrl(trimmedUrl) ? trimmedUrl : undefined;\n\n    if (!ref?.mediaId) {\n      resolvedUrl.set(directUrl ?? null);\n      return;\n    }\n\n    resolvedUrl.set(directUrl ?? null);\n\n    void uploader\n      .resolvePlaybackUrl(ref, abortController.signal)\n      .then((url) => {\n        if (!abortController?.signal.aborted) {\n          resolvedUrl.set(url);\n        }\n      })\n      .catch(() => {\n        if (!abortController?.signal.aborted && directUrl) {\n          resolvedUrl.set(directUrl);\n        }\n      });\n  });\n\n  destroyRef.onDestroy(() => abortController?.abort());\n\n  return resolvedUrl.asReadonly();\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, ElementRef, computed, input, output, viewChild, ViewEncapsulation } from '@angular/core';\nimport type { AXConversationAudioMediaItem } from '../../../../models';\nimport { pickDisplayMediaUrl } from '../../../composer/components/shared/persisted-media-url';\nimport { toUploaderReference } from './attachment-uploader-reference';\nimport { formatMediaDuration } from './format-media';\nimport { createResolvedMediaUrlSignal } from './media-url-resolve';\n\n@Component({\n  selector: 'ax-conversation-audio-attachment',\n  imports: [CommonModule],\n\n  templateUrl: './audio-attachment.component.html',\n  styleUrl: './audio-attachment.component.css',\n  encapsulation: ViewEncapsulation.None,\n})\nexport class AXConversationAudioAttachmentComponent {\n  readonly item = input.required<AXConversationAudioMediaItem>();\n\n  readonly playingChange = output<boolean>();\n  readonly timeUpdate = output<number>();\n  readonly durationChange = output<number>();\n  readonly playbackEnded = output<void>();\n  readonly playbackError = output<void>();\n\n  private readonly audioElementRef = viewChild<ElementRef<HTMLAudioElement>>('audioElement');\n\n  private readonly mediaReference = computed(() => toUploaderReference(this.item()));\n  private readonly resolvedUrl = createResolvedMediaUrlSignal(this.mediaReference);\n\n  readonly audioUrl = computed(() => pickDisplayMediaUrl(this.resolvedUrl(), this.item().url));\n  readonly title = computed(() => this.item().title ?? 'Audio');\n  readonly duration = computed(() => this.item().duration ?? 0);\n  readonly durationLabel = computed(() => formatMediaDuration(this.duration()));\n\n  togglePlay(): void {\n    const audioEl = this.audioElementRef()?.nativeElement;\n    if (!audioEl) {\n      return;\n    }\n    if (audioEl.paused) {\n      void audioEl.play();\n    } else {\n      audioEl.pause();\n    }\n  }\n\n  pause(): void {\n    this.audioElementRef()?.nativeElement?.pause();\n  }\n\n  onPlay(): void {\n    this.playingChange.emit(true);\n  }\n\n  onPause(): void {\n    this.playingChange.emit(false);\n  }\n\n  onTimeUpdate(): void {\n    const audioEl = this.audioElementRef()?.nativeElement;\n    if (audioEl) {\n      this.timeUpdate.emit(audioEl.currentTime);\n    }\n  }\n\n  onLoadedMetadata(): void {\n    const audioEl = this.audioElementRef()?.nativeElement;\n    if (audioEl && Number.isFinite(audioEl.duration)) {\n      this.durationChange.emit(audioEl.duration);\n    }\n  }\n\n  onEnded(): void {\n    this.playingChange.emit(false);\n    this.playbackEnded.emit();\n  }\n\n  onError(): void {\n    this.playingChange.emit(false);\n    this.playbackError.emit();\n  }\n}\n","<div class=\"ax-conversation-audio\">\n  <span class=\"ax-conversation-audio__icon\" aria-hidden=\"true\"><i class=\"fa-light fa-music\"></i></span>\n  <div class=\"ax-conversation-audio__main\">\n    <span class=\"ax-conversation-audio__title\">{{ title() }}</span>\n    <audio\n      #audioElement\n      class=\"ax-conversation-audio__el\"\n      [src]=\"audioUrl() || null\"\n      controls\n      preload=\"metadata\"\n      (play)=\"onPlay()\"\n      (pause)=\"onPause()\"\n      (timeupdate)=\"onTimeUpdate()\"\n      (ended)=\"onEnded()\"\n      (loadedmetadata)=\"onLoadedMetadata()\"\n      (error)=\"onError()\"\n    ></audio>\n  </div>\n  <!-- @if (duration() > 0) {\n    <span class=\"ax-conversation-audio__time\">{{ durationLabel() }}</span>\n  } -->\n</div>\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, input, ViewEncapsulation } from '@angular/core';\nimport type { AXConversationFileMediaItem } from '../../../../models';\nimport { pickDisplayMediaUrl } from '../../../composer/components/shared/persisted-media-url';\nimport { toUploaderReference } from './attachment-uploader-reference';\nimport { formatFileByteSize } from './format-media';\nimport { createResolvedMediaUrlSignal } from './media-url-resolve';\n\nconst AX_CONVERSATION_EXT_COLORS: Record<string, string> = {\n  pdf: 'rgb(var(--ax-sys-color-danger-500))',\n  doc: 'rgb(var(--ax-sys-color-primary-500))',\n  docx: 'rgb(var(--ax-sys-color-primary-500))',\n  xls: 'rgb(var(--ax-sys-color-success-500))',\n  xlsx: 'rgb(var(--ax-sys-color-success-500))',\n  ppt: 'rgb(var(--ax-sys-color-warning-500))',\n  pptx: 'rgb(var(--ax-sys-color-warning-500))',\n  zip: 'rgb(var(--ax-sys-color-secondary-600))',\n};\n\n@Component({\n  selector: 'ax-conversation-file-attachment',\n  imports: [CommonModule],\n\n  templateUrl: './file-attachment.component.html',\n  styleUrl: './file-attachment.component.css',\n  encapsulation: ViewEncapsulation.None,\n})\nexport class AXConversationFileAttachmentComponent {\n  readonly item = input.required<AXConversationFileMediaItem>();\n\n  private readonly mediaReference = computed(() => toUploaderReference(this.item()));\n  private readonly resolvedUrl = createResolvedMediaUrlSignal(this.mediaReference);\n\n  readonly fileUrl = computed(() => pickDisplayMediaUrl(this.resolvedUrl(), this.item().url));\n  readonly fileName = computed(() => this.item().name || 'file');\n  readonly fileSize = computed(() => this.item().size ?? 0);\n\n  readonly fileExtension = computed(() => {\n    const name = this.fileName();\n    const parts = name.split('.');\n    return parts.length > 1 ? parts[parts.length - 1]! : 'FILE';\n  });\n\n  readonly swatchColor = computed(() => {\n    const ext = this.fileExtension().toLowerCase();\n    return AX_CONVERSATION_EXT_COLORS[ext] ?? 'rgb(var(--ax-sys-color-secondary-500))';\n  });\n\n  readonly formattedSize = computed(() => formatFileByteSize(this.fileSize()));\n}\n","<a\n  class=\"ax-conversation-file\"\n  [href]=\"fileUrl()\"\n  [download]=\"fileName()\"\n  target=\"_blank\"\n  rel=\"noopener noreferrer\"\n>\n  <span class=\"ax-conversation-file__badge\" [style.background]=\"swatchColor()\">\n    <span class=\"ax-conversation-file__badge-ext\">{{ fileExtension() }}</span>\n    <span class=\"ax-conversation-file__badge-icon\" aria-hidden=\"true\">\n      <i class=\"fa-light fa-arrow-down-to-line\"></i>\n    </span>\n  </span>\n  <span class=\"ax-conversation-file__body\">\n    <span class=\"ax-conversation-file__name\">{{ fileName() }}</span>\n    <span class=\"ax-conversation-file__meta\">{{ formattedSize() }}</span>\n  </span>\n</a>\n","import { DOCUMENT, isPlatformBrowser } from '@angular/common';\nimport { Component, PLATFORM_ID, computed, effect, inject, input, signal, untracked, ViewEncapsulation } from '@angular/core';\nimport type { AXConversationImageMediaItem } from '../../../../models';\nimport { pickDisplayMediaUrl } from '../../../composer/components/shared/persisted-media-url';\nimport { toUploaderReference } from './attachment-uploader-reference';\nimport { createResolvedMediaUrlSignal } from './media-url-resolve';\n\n@Component({\n  selector: 'ax-conversation-image-attachment',\n\n  templateUrl: './image-attachment.component.html',\n  styleUrl: './image-attachment.component.css',\n  encapsulation: ViewEncapsulation.None,\n})\nexport class AXConversationImageAttachmentComponent {\n  private readonly platformId = inject(PLATFORM_ID);\n  private readonly document = inject(DOCUMENT);\n\n  readonly item = input.required<AXConversationImageMediaItem>();\n  readonly alt = input('Image');\n\n  readonly ready = signal(false);\n\n  private readonly mediaReference = computed(() => toUploaderReference(this.item()));\n  private readonly resolvedUrl = createResolvedMediaUrlSignal(this.mediaReference);\n\n  readonly displayUrl = computed(() =>\n    pickDisplayMediaUrl(this.resolvedUrl(), this.item().thumbnailUrl, this.item().url),\n  );\n\n  constructor() {\n    effect(() => {\n      const url = this.displayUrl();\n      const mediaId = this.item().mediaId;\n      untracked(() => {\n        if (!url) {\n          this.ready.set(false);\n        }\n      });\n    });\n  }\n\n  onImageLoad(): void {\n    this.ready.set(true);\n  }\n\n  onImageError(): void {\n    this.ready.set(false);\n  }\n\n  toggleFullscreen(event: MouseEvent): void {\n    if (!isPlatformBrowser(this.platformId)) {\n      return;\n    }\n    const img = (event.currentTarget as HTMLElement).querySelector('img');\n    if (!(img instanceof HTMLImageElement) || !img.requestFullscreen) {\n      return;\n    }\n    if (this.document.fullscreenElement === img) {\n      void this.document.exitFullscreen();\n      return;\n    }\n    void img.requestFullscreen();\n  }\n}\n","<button\n  type=\"button\"\n  class=\"ax-conversation-image-attachment\"\n  [class.ax-conversation-image-attachment--ready]=\"ready()\"\n  [class.ax-conversation-image-attachment--loading]=\"!displayUrl()\"\n  (click)=\"toggleFullscreen($event)\"\n  [attr.aria-label]=\"alt()\"\n>\n  @if (displayUrl(); as src) {\n    <img [src]=\"src\" [alt]=\"alt()\" loading=\"lazy\" (load)=\"onImageLoad()\" (error)=\"onImageError()\" />\n  }\n</button>\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, input, ViewEncapsulation } from '@angular/core';\nimport type { AXConversationMessage } from '../../../../models';\nimport type { AXConversationMessageInfoBarBannerComponent } from '../../../../registries/message-renderer.registry';\nimport { formatMediaDuration } from './format-media';\n\nexport interface AXConversationPlaybackBannerInputs {\n  title?: string;\n  currentTime?: number;\n  duration?: number;\n  isPlaying?: boolean;\n  onTogglePlay?: () => void;\n  onClose?: () => void;\n  playbackSpeed?: number;\n  onCycleSpeed?: () => void;\n  showSpeedControl?: boolean;\n}\n\nconst AX_CONVERSATION_ICON_BY_TYPE: Record<string, string> = {\n  video: 'fa-light fa-video',\n  audio: 'fa-light fa-music',\n  voice: 'fa-light fa-microphone',\n};\n\n@Component({\n  selector: 'ax-conversation-media-playback-info-bar-banner',\n  imports: [CommonModule],\n\n  templateUrl: './media-playback-info-bar-banner.component.html',\n  styleUrl: './media-playback-info-bar-banner.component.css',\n  encapsulation: ViewEncapsulation.None,\n})\nexport class AXConversationMediaPlaybackInfoBarBannerComponent implements AXConversationMessageInfoBarBannerComponent {\n  readonly message = input.required<AXConversationMessage>();\n  readonly title = input<string>('');\n  readonly currentTime = input<number>(0);\n  readonly duration = input<number>(0);\n  readonly isPlaying = input<boolean>(false);\n  readonly onTogglePlay = input<(() => void) | undefined>(undefined);\n  readonly playbackSpeed = input<number>(1);\n  readonly onCycleSpeed = input<(() => void) | undefined>(undefined);\n  readonly showSpeedControl = input<boolean>(false);\n\n  readonly iconClass = computed(() => AX_CONVERSATION_ICON_BY_TYPE[this.message().type] ?? 'fa-light fa-circle-play');\n\n  readonly resolvedTitle = computed(() => this.title()?.trim() || 'Media');\n\n  readonly progressPercent = computed(() => {\n    const dur = this.duration();\n    if (dur <= 0) {\n      return 0;\n    }\n    return Math.min((Math.max(0, this.currentTime()) / dur) * 100, 100);\n  });\n\n  readonly timeLabel = computed(() => {\n    const current = this.currentTime() || 0;\n    const dur = this.duration() || 0;\n    return `${formatMediaDuration(current)} / ${formatMediaDuration(dur)}`;\n  });\n\n  onTogglePlayClick(): void {\n    this.onTogglePlay()?.();\n  }\n\n  onCycleSpeedClick(): void {\n    this.onCycleSpeed()?.();\n  }\n}\n","<div class=\"ax-conversation-playback-banner\">\n  <div class=\"ax-conversation-playback-banner__row\">\n    <button\n      type=\"button\"\n      class=\"ax-conversation-playback-banner__play\"\n      (click)=\"onTogglePlayClick()\"\n      [attr.aria-label]=\"isPlaying() ? 'Pause' : 'Play'\"\n    >\n      <i class=\"fa-solid\" [class.fa-pause]=\"isPlaying()\" [class.fa-play]=\"!isPlaying()\"></i>\n    </button>\n\n    <div class=\"ax-conversation-playback-banner__main\">\n      <div class=\"ax-conversation-playback-banner__meta-row\">\n        <span class=\"ax-conversation-playback-banner__type-icon\" aria-hidden=\"true\">\n          <i [class]=\"iconClass()\"></i>\n        </span>\n        <span class=\"ax-conversation-playback-banner__title\">{{ resolvedTitle() }}</span>\n        <span class=\"ax-conversation-playback-banner__time\">{{ timeLabel() }}</span>\n      </div>\n      <div\n        class=\"ax-conversation-playback-banner__track\"\n        role=\"progressbar\"\n        [attr.aria-valuenow]=\"progressPercent()\"\n        aria-valuemin=\"0\"\n        aria-valuemax=\"100\"\n        [attr.aria-label]=\"timeLabel()\"\n      >\n        <span class=\"ax-conversation-playback-banner__fill\" [style.width.%]=\"progressPercent()\"></span>\n      </div>\n    </div>\n\n    @if (showSpeedControl()) {\n      <button\n        type=\"button\"\n        class=\"ax-conversation-playback-banner__speed\"\n        (click)=\"onCycleSpeedClick()\"\n        [attr.aria-label]=\"'Playback speed ' + playbackSpeed() + 'x'\"\n      >\n        {{ playbackSpeed() }}x\n      </button>\n    }\n  </div>\n</div>\n","import type { AXConversationMessageStatus } from '../../../../models';\nimport type { AXConversationMessageRendererContentState } from '../../../../registries/message-renderer.registry';\n\nexport function isMessageDeliveryPending(status: AXConversationMessageStatus): boolean {\n  return status === 'sending';\n}\n\nexport function canShowRendererContentError(\n  status: AXConversationMessageStatus,\n  contentState: AXConversationMessageRendererContentState,\n): boolean {\n  return contentState === 'error' && !isMessageDeliveryPending(status);\n}\n","import { DestroyRef, effect, inject, type WritableSignal } from '@angular/core';\nimport type { InputSignal } from '@angular/core';\nimport type { AXConversationMessage } from '../../../../models';\nimport type { AXConversationMessageRendererContentState } from '../../../../registries/message-renderer.registry';\nimport { isMessageDeliveryPending } from './message-renderer-state.helpers';\n\n/**\n * Keeps media renderers from showing load errors while a message is still uploading.\n */\nexport function bindMediaRendererContentState(\n  message: InputSignal<AXConversationMessage>,\n  contentState: WritableSignal<AXConversationMessageRendererContentState>,\n  mediaVersion: () => unknown,\n): void {\n  const destroyRef = inject(DestroyRef);\n\n  const stopSendingGuard = effect(() => {\n    if (isMessageDeliveryPending(message().status)) {\n      contentState.set('ready');\n    }\n  });\n\n  const stopMediaReset = effect(() => {\n    message().id;\n    mediaVersion();\n    contentState.set('ready');\n  });\n\n  destroyRef.onDestroy(() => {\n    stopSendingGuard.destroy();\n    stopMediaReset.destroy();\n  });\n}\n\nexport function reportMediaLoadError(\n  message: AXConversationMessage,\n  contentState: WritableSignal<AXConversationMessageRendererContentState>,\n): boolean {\n  if (isMessageDeliveryPending(message.status)) {\n    return false;\n  }\n  contentState.set('error');\n  return true;\n}\n","import { effect, inject, type InputSignal, type Signal } from '@angular/core';\nimport { AXConversationMessageListService } from '../../../../components/message-list/message-list.service';\nimport type { AXConversationMessage } from '../../../../models';\nimport type {\n  AXConversationMessageRendererComponent,\n  AXConversationMessageRendererState,\n} from '../../../../registries/message-renderer.registry';\n\n/** Caption first, else a label with optional extra lines (URLs, names). */\nexport function mediaCopyText(\n  caption: string | undefined,\n  singleLabel: string,\n  pluralLabel: string,\n  count: number,\n  lines: (string | undefined)[],\n): string {\n  const trimmedCaption = caption?.trim();\n  if (trimmedCaption) {\n    return trimmedCaption;\n  }\n  const header = count > 1 ? `${count} ${pluralLabel}` : singleLabel;\n  const extras = lines.map((line) => line?.trim()).filter((line): line is string => !!line);\n  return extras.length ? `${header}\\n${extras.join('\\n')}` : header;\n}\n\n/**\n * Registers the live renderer on {@link AXConversationMessageListService} for message actions.\n */\nexport abstract class AXConversationMessageRendererCopyHostComponent implements AXConversationMessageRendererComponent {\n  abstract readonly message: InputSignal<AXConversationMessage>;\n  abstract readonly rendererState: Signal<AXConversationMessageRendererState>;\n  abstract copy(): string | Promise<string>;\n\n  private readonly messageList = inject(AXConversationMessageListService, { optional: true });\n\n  constructor() {\n    effect((onCleanup) => {\n      const list = this.messageList;\n      if (!list) {\n        return;\n      }\n      const id = this.message().id;\n      list.registerRendererInstance(id, this);\n      onCleanup(() => list.unregisterRendererInstance(id));\n    });\n  }\n}\n","import { AXButtonComponent } from '@acorex/components/button';\nimport { AXTranslationModule, AXTranslationService } from '@acorex/core/translation';\nimport { CommonModule } from '@angular/common';\nimport { Component, computed, inject, input, output, signal, ViewEncapsulation } from '@angular/core';\nimport type { AXConversationMessage } from '../../../../models';\nimport type { AXConversationMessageRendererState } from '../../../../registries/message-renderer.registry';\nimport { AXConversationService } from '../../../../services';\nimport { AXConversationMessageUtilsService } from '../../../../utils/message-utils.service';\nimport { canShowRendererContentError } from './message-renderer-state.helpers';\n\n/**\n * Shared UI for message bubble bodies: failed delivery (with retry) and content load errors.\n * Sending state is shown in the message-list footer only — not here (avoids layout glitch in media bubbles).\n */\n@Component({\n  selector: 'ax-conversation-message-renderer-state',\n  imports: [CommonModule, AXButtonComponent, AXTranslationModule],\n\n  templateUrl: './message-renderer-state.component.html',\n  styleUrl: './message-renderer-state.component.css',\n  encapsulation: ViewEncapsulation.None,\n})\nexport class AXConversationMessageRendererStateComponent {\n  private readonly conversation = inject(AXConversationService, { optional: true });\n  readonly translation = inject(AXTranslationService);\n\n  readonly rendererState = input.required<AXConversationMessageRendererState>();\n  readonly message = input.required<AXConversationMessage>();\n\n  readonly contentErrorLabel = input<string | undefined>(undefined);\n  readonly deliveryFailedLabel = input<string | undefined>(undefined);\n  readonly showContentErrorChrome = input(true);\n  readonly contentErrorStyle = input<'banner' | 'inline'>('banner');\n  readonly contentErrorIconClass = input<string | undefined>(undefined);\n  readonly placement = input<'above' | 'below'>('above');\n\n  readonly contentRetryEnabled = input(false);\n  readonly contentRetry = output<void>();\n\n  readonly retryBusy = signal(false);\n\n  private readonly currentUser = computed(() => this.conversation?.currentUser());\n\n  private readonly isOwn = computed(() => {\n    const msg = this.message();\n    const user = this.currentUser();\n    if (!user) {\n      return false;\n    }\n    return AXConversationMessageUtilsService.isOwnMessage(msg, user.id);\n  });\n\n  readonly showFailed = computed(() => this.rendererState().deliveryStatus === 'failed' && this.isOwn());\n\n  readonly showContentError = computed(() => {\n    const { contentState } = this.rendererState();\n    return this.showContentErrorChrome() && canShowRendererContentError(this.message().status, contentState);\n  });\n\n  readonly hasVisibleChrome = computed(() => this.showFailed() || this.showContentError());\n\n  readonly contentErrorText = computed(\n    () =>\n      this.contentErrorLabel() ?? this.translation.translateSync('@acorex:chat.renderer-state.could-not-load-content'),\n  );\n\n  readonly deliveryFailedText = computed(\n    () =>\n      this.deliveryFailedLabel() ??\n      this.translation.translateSync('@acorex:chat.renderer-state.could-not-send-message'),\n  );\n\n  async onRetry(): Promise<void> {\n    const msg = this.message();\n    if (!this.conversation) {\n      return;\n    }\n    this.retryBusy.set(true);\n    try {\n      await this.conversation.retryFailedMessage(msg.id);\n    } finally {\n      this.retryBusy.set(false);\n    }\n  }\n}\n","@if (hasVisibleChrome()) {\n  <div\n    class=\"ax-conversation-renderer-state\"\n    [class.ax-conversation-renderer-state--below]=\"placement() === 'below'\"\n    role=\"region\"\n    [attr.aria-label]=\"'@acorex:chat.renderer-state.message-status' | translate | async\"\n  >\n    @if (showFailed()) {\n      <div class=\"ax-conversation-renderer-state__row ax-conversation-renderer-state__row--danger\" role=\"alert\">\n        <i class=\"fa-light fa-triangle-exclamation ax-conversation-renderer-state__ico\" aria-hidden=\"true\"></i>\n        <span class=\"ax-conversation-renderer-state__msg\">{{ deliveryFailedText() }}</span>\n        <ax-button\n          class=\"ax-conversation-renderer-state__retry\"\n          [text]=\"translation.translateSync('@acorex:chat.renderer-state.retry')\"\n          [look]=\"'outline'\"\n          [size]=\"'sm'\"\n          [disabled]=\"retryBusy()\"\n          (onClick)=\"onRetry()\"\n        />\n      </div>\n    }\n    @if (showContentError()) {\n      <div\n        class=\"ax-conversation-renderer-state__content-err\"\n        [class.ax-conversation-renderer-state__content-err--inline]=\"contentErrorStyle() === 'inline'\"\n        [class.ax-conversation-renderer-state__row]=\"contentErrorStyle() === 'banner'\"\n        [class.ax-conversation-renderer-state__row--warn]=\"contentErrorStyle() === 'banner'\"\n        role=\"alert\"\n      >\n        @if (contentErrorIconClass(); as iconClass) {\n          <i [class]=\"iconClass + ' ax-conversation-renderer-state__ico'\" aria-hidden=\"true\"></i>\n        }\n        <span class=\"ax-conversation-renderer-state__msg\">{{ contentErrorText() }}</span>\n        @if (contentRetryEnabled()) {\n          <ax-button\n            class=\"ax-conversation-renderer-state__retry\"\n            [text]=\"translation.translateSync('@acorex:chat.renderer-state.try-again')\"\n            [look]=\"'outline'\"\n            [size]=\"'sm'\"\n            (onClick)=\"contentRetry.emit()\"\n          />\n        }\n      </div>\n    }\n  </div>\n}\n","import type { AXConversationMessage } from '../../../../models';\nimport type { AXConversationInfoBarService } from '../../../../components/info-bar/info-bar.service';\nimport type { AXConversationPlaybackBannerInputs } from './media-playback-info-bar-banner.component';\n\nfunction buildPlaybackBannerPayload(inputs: AXConversationPlaybackBannerInputs): Record<string, unknown> {\n  const payload: Record<string, unknown> = {\n    title: inputs.title,\n    currentTime: inputs.currentTime ?? 0,\n    duration: inputs.duration ?? 0,\n    isPlaying: inputs.isPlaying ?? false,\n    onTogglePlay: inputs.onTogglePlay,\n    onClose: inputs.onClose,\n  };\n\n  if (inputs.playbackSpeed !== undefined) {\n    payload['playbackSpeed'] = inputs.playbackSpeed;\n  }\n  if (inputs.onCycleSpeed) {\n    payload['onCycleSpeed'] = inputs.onCycleSpeed;\n  }\n  if (inputs.showSpeedControl !== undefined) {\n    payload['showSpeedControl'] = inputs.showSpeedControl;\n  }\n\n  return payload;\n}\n\n/** Push playback state to the info-bar banner for a message. */\nexport function syncPlaybackInfoBarBanner(\n  infoBar: AXConversationInfoBarService,\n  message: AXConversationMessage,\n  inputs: AXConversationPlaybackBannerInputs,\n  options?: { forceOpen?: boolean },\n): void {\n  const forceOpen = options?.forceOpen ?? false;\n  const shouldOpen =\n    forceOpen || inputs.isPlaying || infoBar.isMessageBannerActive(message.id);\n\n  if (!shouldOpen) {\n    return;\n  }\n\n  const payload = buildPlaybackBannerPayload(inputs);\n\n  if (infoBar.isMessageBannerActive(message.id)) {\n    infoBar.updateMessageBannerInputs(message.id, payload);\n    return;\n  }\n\n  infoBar.showMessageBanner(message, payload);\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, ElementRef, input, output, viewChild, ViewEncapsulation } from '@angular/core';\nimport type { AXConversationVideoMediaItem } from '../../../../models';\nimport { pickDisplayMediaUrl } from '../../../composer/components/shared/persisted-media-url';\nimport { toUploaderReference } from './attachment-uploader-reference';\nimport { formatMediaDuration } from './format-media';\nimport { createResolvedMediaUrlSignal } from './media-url-resolve';\n\n@Component({\n  selector: 'ax-conversation-video-attachment',\n  imports: [CommonModule],\n\n  templateUrl: './video-attachment.component.html',\n  styleUrl: './video-attachment.component.css',\n  encapsulation: ViewEncapsulation.None,\n})\nexport class AXConversationVideoAttachmentComponent {\n  readonly item = input.required<AXConversationVideoMediaItem>();\n\n  readonly playingChange = output<boolean>();\n  readonly timeUpdate = output<number>();\n  readonly durationChange = output<number>();\n  readonly playbackEnded = output<void>();\n\n  readonly playbackError = output<void>();\n\n  private readonly videoElementRef = viewChild<ElementRef<HTMLVideoElement>>('videoEl');\n\n  private readonly playbackReference = computed(() => toUploaderReference(this.item()));\n  private readonly resolvedPlaybackUrl = createResolvedMediaUrlSignal(this.playbackReference);\n\n  readonly playbackUrl = computed(() =>\n    pickDisplayMediaUrl(this.resolvedPlaybackUrl(), this.item().url, this.item().thumbnailUrl),\n  );\n  readonly duration = computed(() => this.item().duration ?? 0);\n  readonly durationLabel = computed(() => formatMediaDuration(this.duration()));\n\n  togglePlay(): void {\n    const el = this.videoElementRef()?.nativeElement;\n    if (!el) {\n      return;\n    }\n    if (el.paused) {\n      void el.play();\n    } else {\n      el.pause();\n    }\n  }\n\n  pause(): void {\n    this.videoElementRef()?.nativeElement?.pause();\n  }\n\n  onLoadedMetadata(): void {\n    const el = this.videoElementRef()?.nativeElement;\n    if (el && Number.isFinite(el.duration)) {\n      this.durationChange.emit(el.duration);\n    }\n  }\n\n  onTimeUpdate(): void {\n    const el = this.videoElementRef()?.nativeElement;\n    if (el) {\n      this.timeUpdate.emit(el.currentTime);\n    }\n  }\n\n  onPlay(): void {\n    this.playingChange.emit(true);\n  }\n\n  onPause(): void {\n    this.playingChange.emit(false);\n  }\n\n  onEnded(): void {\n    this.playingChange.emit(false);\n    this.playbackEnded.emit();\n  }\n\n  onError(): void {\n    this.playbackError.emit();\n  }\n}\n","<div class=\"ax-conversation-video\">\n  <video\n    #videoEl\n    class=\"ax-conversation-video__player\"\n    [src]=\"playbackUrl() || null\"\n    controls\n    playsinline\n    preload=\"metadata\"\n    (loadedmetadata)=\"onLoadedMetadata()\"\n    (timeupdate)=\"onTimeUpdate()\"\n    (play)=\"onPlay()\"\n    (pause)=\"onPause()\"\n    (ended)=\"onEnded()\"\n    (error)=\"onError()\"\n  ></video>\n</div>\n","import { AXFileTypeRegistryService } from '@acorex/core/file';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { CommonModule } from '@angular/common';\nimport { Component, DestroyRef, computed, inject, input, signal, viewChildren, ViewEncapsulation } from '@angular/core';\nimport { AXConversationInfoBarService } from '../../../../components';\nimport type { AXConversationAudioPayload, AXConversationMessage } from '../../../../models';\nimport type { AXConversationMessageRendererContentState } from '../../../../registries/message-renderer.registry';\nimport { copyWithFileTypeFallback } from '../../../../utils/file-type-message.resolve';\nimport { AXConversationAudioAttachmentComponent } from '../shared/audio-attachment.component';\nimport { bindMediaRendererContentState, reportMediaLoadError } from '../shared/media-renderer-content-state';\nimport {\n  AXConversationMessageRendererCopyHostComponent,\n  mediaCopyText,\n} from '../shared/message-renderer-copy-host.component';\nimport { AXConversationMessageRendererStateComponent } from '../shared/message-renderer-state.component';\nimport { syncPlaybackInfoBarBanner } from '../shared/playback-banner-sync';\nimport { normalizeAudioPayload } from './audio.payload';\n\n@Component({\n  selector: 'ax-conversation-audio-renderer',\n  imports: [CommonModule, AXConversationAudioAttachmentComponent, AXConversationMessageRendererStateComponent],\n\n  templateUrl: './audio-renderer.component.html',\n  styleUrls: ['../shared/renderer-shared.css'],\n  encapsulation: ViewEncapsulation.None,\n})\nexport class AXConversationAudioRendererComponent extends AXConversationMessageRendererCopyHostComponent {\n  private readonly fileTypes = inject(AXFileTypeRegistryService);\n  private readonly translation = inject(AXTranslationService);\n  private readonly destroyRef = inject(DestroyRef);\n  private readonly infoBarService = inject(AXConversationInfoBarService, { optional: true });\n  private readonly attachments = viewChildren(AXConversationAudioAttachmentComponent);\n\n  private readonly _contentState = signal<AXConversationMessageRendererContentState>('ready');\n  private readonly activeTrackIndex = signal(0);\n  private readonly isPlaying = signal(false);\n  private readonly currentTime = signal(0);\n  private readonly duration = signal(0);\n\n  readonly message = input.required<AXConversationMessage>();\n  readonly rendererState = computed(() => ({\n    deliveryStatus: this.message().status,\n    contentState: this._contentState(),\n  }));\n\n  readonly payload = computed(() => normalizeAudioPayload(this.message().payload as AXConversationAudioPayload));\n  readonly audios = computed(() => this.payload().audios);\n  readonly caption = computed(() => this.payload().caption?.trim() || '');\n\n  readonly audioLoadErrorLabel = computed(() =>\n    this.translation.translateSync('@acorex:chat.renderer-state.could-not-load-audio'),\n  );\n\n  copy(): Promise<string> {\n    return copyWithFileTypeFallback(this.message(), this.fileTypes, () => {\n      const p = this.payload();\n      return mediaCopyText(\n        p.caption,\n        'Audio',\n        'audio files',\n        p.audios.length,\n        p.audios.map((item) => item.title?.trim() || item.url?.trim()),\n      );\n    });\n  }\n\n  constructor() {\n    super();\n    bindMediaRendererContentState(this.message, this._contentState, () => this.audios());\n\n    this.destroyRef.onDestroy(() => {\n      const messageId = this.message()?.id;\n      if (messageId && this.infoBarService) {\n        this.infoBarService.hideMessageBanner(messageId);\n      }\n    });\n  }\n\n  onPlayingChange(index: number, playing: boolean): void {\n    if (playing) {\n      this.activeTrackIndex.set(index);\n      this.pauseOtherTracks(index);\n      this.isPlaying.set(true);\n      this.syncInfoBarBanner(true);\n      return;\n    }\n\n    if (this.activeTrackIndex() === index) {\n      this.isPlaying.set(false);\n      this.syncInfoBarBanner();\n    }\n  }\n\n  onTimeUpdate(index: number, time: number): void {\n    if (this.activeTrackIndex() !== index) {\n      return;\n    }\n    this.currentTime.set(time);\n    this.syncInfoBarBanner();\n  }\n\n  onDurationChange(index: number, duration: number): void {\n    if (this.activeTrackIndex() !== index) {\n      return;\n    }\n    this.duration.set(duration);\n    this.syncInfoBarBanner();\n  }\n\n  onPlaybackEnded(index: number): void {\n    if (this.activeTrackIndex() !== index) {\n      return;\n    }\n    this.isPlaying.set(false);\n    this.currentTime.set(0);\n    this.syncInfoBarBanner();\n  }\n\n  onPlaybackError(): void {\n    if (!reportMediaLoadError(this.message(), this._contentState)) {\n      return;\n    }\n    this.isPlaying.set(false);\n    this.infoBarService?.hideMessageBanner(this.message().id);\n  }\n\n  togglePlay(): void {\n    this.attachments()[this.activeTrackIndex()]?.togglePlay();\n  }\n\n  private pauseOtherTracks(activeIndex: number): void {\n    this.attachments().forEach((attachment, index) => {\n      if (index !== activeIndex) {\n        attachment.pause();\n      }\n    });\n  }\n\n  private pausePlayback(): void {\n    this.attachments()[this.activeTrackIndex()]?.pause();\n    this.isPlaying.set(false);\n  }\n\n  private syncInfoBarBanner(forceOpen = false): void {\n    if (!this.infoBarService) {\n      return;\n    }\n    const message = this.message();\n    const track = this.audios()[this.activeTrackIndex()];\n    const title = this.payload().caption?.trim() || track?.title?.trim() || 'Audio';\n\n    syncPlaybackInfoBarBanner(\n      this.infoBarService,\n      message,\n      {\n        title,\n        currentTime: this.currentTime(),\n        duration: this.duration() || track?.duration || 0,\n        isPlaying: this.isPlaying(),\n        onTogglePlay: () => this.togglePlay(),\n        onClose: () => this.pausePlayback(),\n      },\n      { forceOpen },\n    );\n  }\n}\n","<div class=\"ax-conversation-msg ax-conversation-msg--wide\">\n  <ax-conversation-message-renderer-state\n    [rendererState]=\"rendererState()\"\n    [message]=\"message()\"\n    [contentErrorLabel]=\"audioLoadErrorLabel()\"\n  />\n  <div class=\"ax-conversation-msg__stack\">\n    @for (audio of audios(); track audio.mediaId ?? audio.url; let i = $index) {\n      <ax-conversation-audio-attachment\n        [item]=\"audio\"\n        (playingChange)=\"onPlayingChange(i, $event)\"\n        (timeUpdate)=\"onTimeUpdate(i, $event)\"\n        (durationChange)=\"onDurationChange(i, $event)\"\n        (playbackEnded)=\"onPlaybackEnded(i)\"\n        (playbackError)=\"onPlaybackError()\"\n      />\n    }\n  </div>\n  @if (caption()) {\n    <p class=\"ax-conversation-msg__caption\">{{ caption() }}</p>\n  }\n</div>\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, input, signal, ViewEncapsulation } from '@angular/core';\nimport type { AXConversationMessage } from '../../../../models';\nimport type {\n  AXConversationMessageRendererComponent,\n  AXConversationMessageRendererContentState,\n} from '../../../../registries/message-renderer.registry';\nimport { AXConversationMessageRendererStateComponent } from '../shared/message-renderer-state.component';\n\n@Component({\n  selector: 'ax-conversation-fallback-renderer',\n  imports: [CommonModule, AXConversationMessageRendererStateComponent],\n\n  templateUrl: './fallback-renderer.component.html',\n  styleUrl: './fallback-renderer.component.css',\n  encapsulation: ViewEncapsulation.None,\n})\nexport class AXConversationFallbackRendererComponent implements AXConversationMessageRendererComponent {\n  private readonly _contentState = signal<AXConversationMessageRendererContentState>('none');\n\n  readonly message = input.required<AXConversationMessage>();\n  readonly rendererState = computed(() => ({\n    deliveryStatus: this.message().status,\n    contentState: this._contentState(),\n  }));\n\n  readonly messageTypeLabel = computed(() => this.message().type.replace(/_/g, ' '));\n\n  /** Same tone as content-error default in {@link AXConversationMessageRendererStateComponent}. */\n  readonly fallbackDescription = computed(() => {\n    const label = this.messageTypeLabel();\n    return `Couldn't load this message (${label}).`;\n  });\n}\n","<div class=\"ax-conversation-fallback\">\n  <ax-conversation-message-renderer-state [rendererState]=\"rendererState()\" [message]=\"message()\" />\n  <div class=\"ax-conversation-renderer-state__row ax-conversation-renderer-state__row--warn\" role=\"alert\">\n    <span class=\"ax-conversation-renderer-state__msg\">{{ fallbackDescription() }}</span>\n  </div>\n</div>\n","import { AXFileTypeRegistryService } from '@acorex/core/file';\nimport { CommonModule } from '@angular/common';\nimport { Component, computed, inject, input, ViewEncapsulation } from '@angular/core';\nimport type { AXConversationFilePayload, AXConversationMessage } from '../../../../models';\nimport { copyWithFileTypeFallback } from '../../../../utils/file-type-message.resolve';\nimport { AXConversationFileAttachmentComponent } from '../shared/file-attachment.component';\nimport {\n  AXConversationMessageRendererCopyHostComponent,\n  mediaCopyText,\n} from '../shared/message-renderer-copy-host.component';\nimport { AXConversationMessageRendererStateComponent } from '../shared/message-renderer-state.component';\nimport { normalizeFilePayload } from './file.payload';\n\n@Component({\n  selector: 'ax-conversation-file-renderer',\n  imports: [CommonModule, AXConversationFileAttachmentComponent, AXConversationMessageRendererStateComponent],\n\n  templateUrl: './file-renderer.component.html',\n  styleUrls: ['../shared/renderer-shared.css'],\n  encapsulation: ViewEncapsulation.None,\n})\nexport class AXConversationFileRendererComponent extends AXConversationMessageRendererCopyHostComponent {\n  private readonly fileTypes = inject(AXFileTypeRegistryService);\n\n  readonly message = input.required<AXConversationMessage>();\n  readonly rendererState = computed(() => ({\n    deliveryStatus: this.message().status,\n    contentState: 'ready' as const,\n  }));\n\n  readonly payload = computed(() => normalizeFilePayload(this.message().payload as AXConversationFilePayload));\n  readonly files = computed(() => this.payload().files);\n  readonly caption = computed(() => this.payload().caption?.trim() || '');\n\n  copy(): Promise<string> {\n    return copyWithFileTypeFallback(this.message(), this.fileTypes, () => {\n      const p = this.payload();\n      if (p.files.length === 1) {\n        const file = p.files[0];\n        const name = file.name?.trim() || 'File';\n        const url = file.url?.trim();\n        return url ? `${name}\\n${url}` : name;\n      }\n      return mediaCopyText(\n        p.caption,\n        'File',\n        'files',\n        p.files.length,\n        p.files.map((file) => file.name?.trim() || file.url?.trim()),\n      );\n    });\n  }\n}\n","<div class=\"ax-conversation-msg ax-conversation-msg--wide\">\n  <ax-conversation-message-renderer-state [rendererState]=\"rendererState()\" [message]=\"message()\" />\n  <div class=\"ax-conversation-msg__stack\">\n    @for (file of files(); track file.mediaId ?? file.url) {\n      <ax-conversation-file-attachment [item]=\"file\" />\n    }\n  </div>\n  @if (caption()) {\n    <p class=\"ax-conversation-msg__caption\">{{ caption() }}</p>\n  }\n</div>\n","import { AXFileTypeRegistryService } from '@acorex/core/file';\nimport { CommonModule } from '@angular/common';\nimport { Component, computed, inject, input, ViewEncapsulation } from '@angular/core';\nimport type { AXConversationImagePayload, AXConversationMessage } from '../../../../models';\nimport { copyWithFileTypeFallback } from '../../../../utils/file-type-message.resolve';\nimport { AXConversationImageAttachmentComponent } from '../shared/image-attachment.component';\nimport {\n  AXConversationMessageRendererCopyHostComponent,\n  mediaCopyText,\n} from '../shared/message-renderer-copy-host.component';\nimport { AXConversationMessageRendererStateComponent } from '../shared/message-renderer-state.component';\nimport { normalizeImagePayload } from './image.payload';\n\n@Component({\n  selector: 'ax-conversation-image-renderer',\n  imports: [CommonModule, AXConversationImageAttachmentComponent, AXConversationMessageRendererStateComponent],\n\n  templateUrl: './image-renderer.component.html',\n  styleUrls: ['../shared/renderer-shared.css'],\n  encapsulation: ViewEncapsulation.None,\n})\nexport class AXConversationImageRendererComponent extends AXConversationMessageRendererCopyHostComponent {\n  private readonly fileTypes = inject(AXFileTypeRegistryService);\n\n  readonly message = input.required<AXConversationMessage>();\n  readonly rendererState = computed(() => ({\n    deliveryStatus: this.message().status,\n    contentState: 'ready' as const,\n  }));\n\n  readonly payload = computed(() => normalizeImagePayload(this.message().payload as AXConversationImagePayload));\n  readonly images = computed(() => this.payload().images);\n  readonly caption = computed(() => this.payload().caption?.trim() || '');\n\n  copy(): Promise<string> {\n    return copyWithFileTypeFallback(this.message(), this.fileTypes, () => {\n      const p = this.payload();\n      return mediaCopyText(\n        p.caption,\n        'Image',\n        'images',\n        p.images.length,\n        p.images.map((item) => item.url?.trim() || item.thumbnailUrl?.trim()),\n      );\n    });\n  }\n\n  readonly gridModeClass = computed(() => {\n    const n = this.images().length;\n    if (n <= 1) return 'ax-conversation-msg__grid--single';\n    if (n === 2) return 'ax-conversation-msg__grid--dual';\n    return 'ax-conversation-msg__grid--multi';\n  });\n}\n","<div class=\"ax-conversation-msg ax-conversation-msg--flush\">\n  <div class=\"ax-conversation-msg__grid\" [class]=\"gridModeClass()\">\n    @for (image of images(); track image.mediaId ?? image.url) {\n      <ax-conversation-image-attachment [item]=\"image\" [alt]=\"caption() || 'Image'\" />\n    }\n  </div>\n  @if (caption()) {\n    <p class=\"ax-conversation-msg__caption\">{{ caption() }}</p>\n  }\n  <ax-conversation-message-renderer-state\n    [rendererState]=\"rendererState()\"\n    [message]=\"message()\"\n    contentErrorLabel=\"Couldn't load image\"\n    contentErrorStyle=\"inline\"\n    placement=\"below\"\n  />\n</div>\n","import { AXMapModule } from '@acorex/components/map';\nimport { CommonModule } from '@angular/common';\nimport { Component, computed, input, signal, ViewEncapsulation } from '@angular/core';\nimport type { AXConversationLocationPayload, AXConversationMessage } from '../../../../models';\nimport type { AXConversationMessageRendererContentState } from '../../../../registries/message-renderer.registry';\nimport { AXConversationMessageRendererCopyHostComponent } from '../shared/message-renderer-copy-host.component';\nimport { AXConversationMessageRendererStateComponent } from '../shared/message-renderer-state.component';\n\n@Component({\n  selector: 'ax-conversation-location-renderer',\n  imports: [CommonModule, AXMapModule, AXConversationMessageRendererStateComponent],\n\n  templateUrl: './location-renderer.component.html',\n  styleUrl: './location-renderer.component.css',\n  encapsulation: ViewEncapsulation.None,\n})\nexport class AXConversationLocationRendererComponent extends AXConversationMessageRendererCopyHostComponent {\n  private readonly _contentState = signal<AXConversationMessageRendererContentState>('none');\n\n  readonly message = input.required<AXConversationMessage>();\n  readonly rendererState = computed(() => ({\n    deliveryStatus: this.message().status,\n    contentState: this._contentState(),\n  }));\n  readonly payload = computed(() => this.message().payload as AXConversationLocationPayload);\n\n  readonly latitude = computed(() => this.payload().latitude);\n  readonly longitude = computed(() => this.payload().longitude);\n  readonly locationName = computed(() => this.payload().name || 'Location');\n  readonly address = computed(() => this.payload().address);\n\n  readonly coordinatesText = computed(() => {\n    const lat = this.latitude().toFixed(5);\n    const lng = this.longitude().toFixed(5);\n    return `${lat}, ${lng}`;\n  });\n\n  readonly mapsUrl = computed(() => {\n    const lat = this.latitude();\n    const lng = this.longitude();\n    return `https://www.google.com/maps?q=${lat},${lng}`;\n  });\n\n  copy(): string {\n    const name = this.locationName();\n    const addr = this.address()?.trim();\n    const coords = this.coordinatesText();\n    const maps = this.mapsUrl();\n    const lines = [addr, coords, maps].filter(Boolean);\n    return lines.length ? `${name}\\n${lines.join('\\n')}` : name;\n  }\n\n  readonly markers = computed(() => [\n    {\n      latitude: this.latitude(),\n      longitude: this.longitude(),\n      popup: this.locationName(),\n      popupOpen: false,\n      popupCloseButton: true,\n    },\n  ]);\n}\n","<div class=\"ax-conversation-loc\">\n  <ax-conversation-message-renderer-state [rendererState]=\"rendererState()\" [message]=\"message()\" />\n  <div class=\"ax-conversation-loc__map\">\n    <ax-map\n      [latitude]=\"latitude()\"\n      [longitude]=\"longitude()\"\n      [zoomLevel]=\"15\"\n      [markers]=\"markers()\"\n      [hasLocator]=\"false\"\n      [hasDraw]=\"false\"\n    ></ax-map>\n  </div>\n  <div class=\"ax-conversation-loc__body\">\n    <div class=\"ax-conversation-loc__title\">\n      <span class=\"ax-conversation-loc__title-text\">{{ locationName() }}</span>\n    </div>\n    @if (address()) {\n      <div class=\"ax-conversation-loc__addr\">{{ address() }}</div>\n    }\n    <div class=\"ax-conversation-loc__meta\">\n      <span class=\"ax-conversation-loc__coords\">{{ coordinatesText() }}</span>\n    </div>\n  </div>\n  <a class=\"ax-conversation-loc__action\" [href]=\"mapsUrl()\" target=\"_blank\" rel=\"noopener noreferrer\">\n    <span>Open in Maps</span>\n    <i class=\"fa-light fa-arrow-up-right-from-square\" aria-hidden=\"true\"></i>\n  </a>\n</div>\n","import { AXLabelComponent } from '@acorex/components/label';\nimport { AXLoadingComponent } from '@acorex/components/loading';\nimport { CommonModule } from '@angular/common';\nimport { Component, computed, effect, input, signal, ViewEncapsulation } from '@angular/core';\nimport type { AXConversationMessage, AXConversationStickerPayload } from '../../../../models';\nimport type {\n  AXConversationMessageRendererComponent,\n  AXConversationMessageRendererContentState,\n} from '../../../../registries/message-renderer.registry';\nimport { createResolvedMediaUrlSignal } from '../shared/media-url-resolve';\nimport { AXConversationMessageRendererStateComponent } from '../shared/message-renderer-state.component';\n\n@Component({\n  selector: 'ax-conversation-sticker-renderer',\n  imports: [CommonModule, AXLabelComponent, AXLoadingComponent, AXConversationMessageRendererStateComponent],\n\n  templateUrl: './sticker-renderer.component.html',\n  styleUrl: './sticker-renderer.component.css',\n  encapsulation: ViewEncapsulation.None,\n})\nexport class AXConversationStickerRendererComponent implements AXConversationMessageRendererComponent {\n  private readonly _contentState = signal<AXConversationMessageRendererContentState>('loading');\n\n  readonly message = input.required<AXConversationMessage>();\n  readonly rendererState = computed(() => ({\n    deliveryStatus: this.message().status,\n    contentState: this._contentState(),\n  }));\n\n  readonly payload = computed(() => this.message().payload as AXConversationStickerPayload);\n  private readonly mediaReference = computed(() => ({\n    url: this.payload().url,\n    mediaId: this.payload().mediaId,\n    mimeType: this.payload().mimeType,\n  }));\n  private readonly resolvedUrl = createResolvedMediaUrlSignal(this.mediaReference);\n  readonly stickerUrl = computed(() => this.resolvedUrl() ?? this.payload().url ?? '');\n  readonly alt = computed(() => this.payload().emoji || 'Sticker');\n\n  constructor() {\n    effect(() => {\n      this.message().id;\n      this.stickerUrl();\n      this._contentState.set('loading');\n    });\n  }\n\n  onLoad(): void {\n    this._contentState.set('ready');\n  }\n\n  onError(): void {\n    this._contentState.set('error');\n  }\n}\n","<div class=\"ax-conversation-sticker\">\n  @if (rendererState().contentState === 'loading') {\n    <div class=\"ax-conversation-sticker__state\" aria-busy=\"true\">\n      <ax-loading></ax-loading>\n      <ax-label class=\"ax-conversation-sticker__loading-label\">Loading sticker...</ax-label>\n    </div>\n  }\n  <img\n    class=\"ax-conversation-sticker__img\"\n    [src]=\"stickerUrl()\"\n    [alt]=\"alt()\"\n    [class.ax-conversation-sticker__img--loading]=\"rendererState().contentState === 'loading'\"\n    [class.ax-conversation-sticker__img--ready]=\"rendererState().contentState === 'ready'\"\n    [class.ax-conversation-sticker__img--hidden]=\"rendererState().contentState === 'error'\"\n    loading=\"lazy\"\n    (load)=\"onLoad()\"\n    (error)=\"onError()\"\n  />\n  <ax-conversation-message-renderer-state\n    [rendererState]=\"rendererState()\"\n    [message]=\"message()\"\n    contentErrorLabel=\"Sticker unavailable\"\n    contentErrorStyle=\"inline\"\n    contentErrorIconClass=\"fa-light fa-face-smile\"\n    placement=\"below\"\n  />\n</div>\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, input, signal, ViewEncapsulation } from '@angular/core';\nimport type { AXConversationMessage, AXConversationSystemPayload } from '../../../../models';\nimport type {\n  AXConversationMessageRendererComponent,\n  AXConversationMessageRendererContentState,\n} from '../../../../registries/message-renderer.registry';\nimport { AXConversationMessageRendererStateComponent } from '../shared/message-renderer-state.component';\n\nconst AX_CONVERSATION_EVENT_ICONS: Record<string, string> = {\n  user_joined: 'fa-light fa-user-plus',\n  user_left: 'fa-light fa-user-minus',\n  title_changed: 'fa-light fa-pen',\n  avatar_changed: 'fa-light fa-image',\n};\n\n@Component({\n  selector: 'ax-conversation-system-renderer',\n  imports: [CommonModule, AXConversationMessageRendererStateComponent],\n\n  templateUrl: './system-renderer.component.html',\n  styleUrl: './system-renderer.component.css',\n  encapsulation: ViewEncapsulation.None,\n})\nexport class AXConversationSystemRendererComponent implements AXConversationMessageRendererComponent {\n  private readonly _contentState = signal<AXConversationMessageRendererContentState>('none');\n\n  readonly message = input.required<AXConversationMessage>();\n  readonly rendererState = computed(() => ({\n    deliveryStatus: this.message().status,\n    contentState: this._contentState(),\n  }));\n  readonly payload = computed(() => this.message().payload as AXConversationSystemPayload);\n\n  readonly iconClass = computed(() => {\n    const type = this.payload().eventType;\n    return AX_CONVERSATION_EVENT_ICONS[type] ?? 'fa-light fa-info-circle';\n  });\n}\n","<div class=\"ax-conversation-system-stack\">\n  <ax-conversation-message-renderer-state [rendererState]=\"rendererState()\" [message]=\"message()\" />\n  <div class=\"ax-conversation-system\" role=\"status\">\n    <span class=\"ax-conversation-system__icon\" aria-hidden=\"true\">\n      <i [class]=\"iconClass()\"></i>\n    </span>\n    <span class=\"ax-conversation-system__label\">{{ payload().text }}</span>\n  </div>\n</div>\n","/**\n * Sanitizer Utility Service\n * Centralized DOM sanitization helpers for user-generated content\n */\n\nimport { Injectable, SecurityContext, inject } from '@angular/core';\nimport { DomSanitizer, SafeHtml, SafeUrl } from '@angular/platform-browser';\n\n@Injectable({ providedIn: 'root' })\nexport class AXConversationSanitizerService {\n  private readonly dom = inject(DomSanitizer);\n\n  /** Sanitize HTML string, returns empty string when unsafe */\n  sanitizeHtml(html: string): string {\n    return this.dom.sanitize(SecurityContext.HTML, html) || '';\n  }\n\n  /** Sanitize and return SafeHtml for bindings expecting SafeHtml */\n  safeHtml(html: string): SafeHtml {\n    // We first sanitize to strip dangerous content, then bypass to mark as safe\n    const sanitized = this.sanitizeHtml(html);\n    return this.dom.bypassSecurityTrustHtml(sanitized);\n  }\n\n  /** Escape plain text into safe HTML text */\n  escapeHtml(text: string): string {\n    return this.dom.sanitize(SecurityContext.HTML, text) || '';\n  }\n\n  /** Sanitize URL for href/src usage; returns null if unsafe */\n  sanitizeUrl(url: string): string | null {\n    return this.dom.sanitize(SecurityContext.URL, url);\n  }\n\n  /** Sanitize and return SafeUrl for bindings expecting SafeUrl */\n  safeUrl(url: string): SafeUrl {\n    const clean = this.sanitizeUrl(url) || '';\n    return this.dom.bypassSecurityTrustUrl(clean);\n  }\n}\n","import { Component, computed, inject, input, signal, ViewEncapsulation } from '@angular/core';\nimport { SafeHtml } from '@angular/platform-browser';\nimport { AXConversationInfoBarService } from '../../../../components';\nimport type { AXConversationMessage, AXConversationTextPayload } from '../../../../models';\nimport type { AXConversationMessageRendererContentState } from '../../../../registries/message-renderer.registry';\nimport { AXConversationSanitizerService } from '../../../../utils/sanitizer.service';\nimport { AXConversationMessageRendererCopyHostComponent } from '../shared/message-renderer-copy-host.component';\nimport { AXConversationMessageRendererStateComponent } from '../shared/message-renderer-state.component';\n\n@Component({\n  selector: 'ax-conversation-text-renderer',\n  imports: [AXConversationMessageRendererStateComponent],\n\n  templateUrl: './text-renderer.component.html',\n  styleUrl: './text-renderer.component.css',\n  encapsulation: ViewEncapsulation.None,\n})\nexport class AXConversationTextRendererComponent extends AXConversationMessageRendererCopyHostComponent {\n  private readonly infoBarService = inject(AXConversationInfoBarService);\n  private readonly sanitizer = inject(AXConversationSanitizerService);\n\n  private readonly _contentState = signal<AXConversationMessageRendererContentState>('none');\n\n  readonly message = input.required<AXConversationMessage>();\n  readonly rendererState = computed(() => ({\n    deliveryStatus: this.message().status,\n    contentState: this._contentState(),\n  }));\n  readonly searchQuery = this.infoBarService.searchQuery;\n\n  copy(): string {\n    return (this.message().payload as AXConversationTextPayload).text?.trim() ?? '';\n  }\n\n  readonly formattedText = computed((): SafeHtml => {\n    const msg = this.message();\n    const payload = msg.payload as AXConversationTextPayload;\n    const text = payload.text ?? '';\n    const query = this.searchQuery();\n    let escaped = this.sanitizer.escapeHtml(text);\n    if (query?.trim()) {\n      escaped = this.highlightSearch(escaped, query);\n    }\n    return this.sanitizer.safeHtml(this.linkify(escaped));\n  });\n\n  private linkify(text: string): string {\n    const urlRegex = /(https?:\\/\\/[^\\s]+)/g;\n    return text.replace(urlRegex, (url) => {\n      const safeUrl = this.sanitizer.sanitizeUrl(url) || '#';\n      return `<a href=\"${safeUrl}\" target=\"_blank\" rel=\"noopener noreferrer\">${url}</a>`;\n    });\n  }\n\n  private highlightSearch(text: string, query: string): string {\n    const trimmed = query.trim();\n    if (!trimmed) {\n      return text;\n    }\n    const escapedQuery = trimmed.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n    const regex = new RegExp(`(${escapedQuery})`, 'gi');\n    return text.replace(regex, '<mark>$1</mark>');\n  }\n}\n","<div class=\"ax-conversation-text\">\n  <ax-conversation-message-renderer-state [rendererState]=\"rendererState()\" [message]=\"message()\" />\n  <div class=\"ax-conversation-text__body\" [innerHTML]=\"formattedText()\"></div>\n</div>\n","import { AXFileTypeRegistryService } from '@acorex/core/file';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { CommonModule, isPlatformBrowser } from '@angular/common';\nimport { Component, DestroyRef, PLATFORM_ID, computed, inject, input, signal, viewChildren, ViewEncapsulation } from '@angular/core';\nimport { AXConversationInfoBarService } from '../../../../components';\nimport type { AXConversationMessage, AXConversationVideoPayload } from '../../../../models';\nimport type { AXConversationMessageRendererContentState } from '../../../../registries/message-renderer.registry';\nimport { copyWithFileTypeFallback } from '../../../../utils/file-type-message.resolve';\nimport { bindMediaRendererContentState, reportMediaLoadError } from '../shared/media-renderer-content-state';\nimport {\n  AXConversationMessageRendererCopyHostComponent,\n  mediaCopyText,\n} from '../shared/message-renderer-copy-host.component';\nimport { AXConversationMessageRendererStateComponent } from '../shared/message-renderer-state.component';\nimport { syncPlaybackInfoBarBanner } from '../shared/playback-banner-sync';\nimport { AXConversationVideoAttachmentComponent } from '../shared/video-attachment.component';\nimport { normalizeVideoPayload } from './video.payload';\n\n@Component({\n  selector: 'ax-conversation-video-renderer',\n  imports: [CommonModule, AXConversationVideoAttachmentComponent, AXConversationMessageRendererStateComponent],\n\n  templateUrl: './video-renderer.component.html',\n  styleUrls: ['../shared/renderer-shared.css'],\n  encapsulation: ViewEncapsulation.None,\n})\nexport class AXConversationVideoRendererComponent extends AXConversationMessageRendererCopyHostComponent {\n  private readonly fileTypes = inject(AXFileTypeRegistryService);\n  private readonly translation = inject(AXTranslationService);\n  private readonly platformId = inject(PLATFORM_ID);\n  private readonly destroyRef = inject(DestroyRef);\n  private readonly infoBarService = inject(AXConversationInfoBarService, { optional: true });\n  private readonly attachments = viewChildren(AXConversationVideoAttachmentComponent);\n\n  private readonly _contentState = signal<AXConversationMessageRendererContentState>('ready');\n  private readonly activeVideoIndex = signal(0);\n\n  readonly message = input.required<AXConversationMessage>();\n  readonly rendererState = computed(() => ({\n    deliveryStatus: this.message().status,\n    contentState: this._contentState(),\n  }));\n\n  readonly isPlaying = signal(false);\n  readonly currentTime = signal(0);\n  readonly duration = signal(0);\n\n  readonly payload = computed(() => normalizeVideoPayload(this.message().payload as AXConversationVideoPayload));\n  readonly videos = computed(() => this.payload().videos);\n  readonly caption = computed(() => this.payload().caption?.trim() || '');\n\n  readonly videoLoadErrorLabel = computed(() =>\n    this.translation.translateSync('@acorex:chat.renderer-state.could-not-load-video'),\n  );\n\n  copy(): Promise<string> {\n    return copyWithFileTypeFallback(this.message(), this.fileTypes, () => {\n      const p = this.payload();\n      return mediaCopyText(\n        p.caption,\n        'Video',\n        'videos',\n        p.videos.length,\n        p.videos.map((item) => item.url?.trim()),\n      );\n    });\n  }\n\n  constructor() {\n    super();\n    bindMediaRendererContentState(this.message, this._contentState, () => this.videos());\n\n    this.destroyRef.onDestroy(() => {\n      const messageId = this.message()?.id;\n      if (messageId && this.infoBarService) {\n        this.infoBarService.hideMessageBanner(messageId);\n      }\n    });\n  }\n\n  onPlayingChange(index: number, playing: boolean): void {\n    if (playing) {\n      this.activeVideoIndex.set(index);\n      this.pauseOtherVideos(index);\n      this.isPlaying.set(true);\n      this.syncInfoBarBanner(true);\n      return;\n    }\n\n    if (this.activeVideoIndex() === index) {\n      this.isPlaying.set(false);\n      this.syncInfoBarBanner();\n    }\n  }\n\n  onTimeUpdate(index: number, time: number): void {\n    if (this.activeVideoIndex() !== index) {\n      return;\n    }\n    this.currentTime.set(time);\n    this.syncInfoBarBanner();\n  }\n\n  onDurationChange(index: number, duration: number): void {\n    if (this.activeVideoIndex() !== index) {\n      return;\n    }\n    this.duration.set(duration);\n    this.syncInfoBarBanner();\n  }\n\n  onPlaybackEnded(index: number): void {\n    if (this.activeVideoIndex() !== index) {\n      return;\n    }\n    this.isPlaying.set(false);\n    this.currentTime.set(0);\n    this.syncInfoBarBanner();\n  }\n\n  onPlaybackError(): void {\n    if (!reportMediaLoadError(this.message(), this._contentState)) {\n      return;\n    }\n    this.isPlaying.set(false);\n    this.infoBarService?.hideMessageBanner(this.message().id);\n  }\n\n  togglePlay(): void {\n    if (!isPlatformBrowser(this.platformId)) {\n      return;\n    }\n    this.attachments()[this.activeVideoIndex()]?.togglePlay();\n  }\n\n  private pauseOtherVideos(activeIndex: number): void {\n    this.attachments().forEach((attachment, index) => {\n      if (index !== activeIndex) {\n        attachment.pause();\n      }\n    });\n  }\n\n  private pausePlayback(): void {\n    this.attachments()[this.activeVideoIndex()]?.pause();\n    this.isPlaying.set(false);\n  }\n\n  private syncInfoBarBanner(forceOpen = false): void {\n    if (!this.infoBarService) {\n      return;\n    }\n    const message = this.message();\n    const index = this.activeVideoIndex();\n    const title = this.payload().caption?.trim() || (this.videos().length > 1 ? `Video ${index + 1}` : 'Video');\n\n    syncPlaybackInfoBarBanner(\n      this.infoBarService,\n      message,\n      {\n        title,\n        currentTime: this.currentTime(),\n        duration: this.duration() || this.videos()[index]?.duration || 0,\n        isPlaying: this.isPlaying(),\n        onTogglePlay: () => this.togglePlay(),\n        onClose: () => this.pausePlayback(),\n      },\n      { forceOpen },\n    );\n  }\n}\n","<div class=\"ax-conversation-msg\">\n  <ax-conversation-message-renderer-state\n    [rendererState]=\"rendererState()\"\n    [message]=\"message()\"\n    [contentErrorLabel]=\"videoLoadErrorLabel()\"\n  />\n  <div class=\"ax-conversation-msg__stack\">\n    @for (video of videos(); track video.mediaId ?? video.url; let i = $index) {\n      <ax-conversation-video-attachment\n        [item]=\"video\"\n        (playingChange)=\"onPlayingChange(i, $event)\"\n        (timeUpdate)=\"onTimeUpdate(i, $event)\"\n        (durationChange)=\"onDurationChange(i, $event)\"\n        (playbackEnded)=\"onPlaybackEnded(i)\"\n        (playbackError)=\"onPlaybackError()\"\n      />\n    }\n  </div>\n  @if (caption()) {\n    <p class=\"ax-conversation-msg__caption\">{{ caption() }}</p>\n  }\n</div>\n","import { AXFileTypeRegistryService } from '@acorex/core/file';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { CommonModule, isPlatformBrowser } from '@angular/common';\nimport {\n  Component,\n  DestroyRef,\n  ElementRef,\n  PLATFORM_ID,\n  computed,\n  effect,\n  inject,\n  input,\n  signal,\n  viewChild,\n  ViewEncapsulation,\n} from '@angular/core';\nimport { AXConversationInfoBarService } from '../../../../components';\nimport type { AXConversationMessage, AXConversationVoicePayload } from '../../../../models';\nimport type { AXConversationMessageRendererContentState } from '../../../../registries/message-renderer.registry';\nimport { copyWithFileTypeFallback } from '../../../../utils/file-type-message.resolve';\nimport { pickDisplayMediaUrl } from '../../../composer/components/shared/persisted-media-url';\nimport { formatMediaDuration } from '../shared/format-media';\nimport { bindMediaRendererContentState, reportMediaLoadError } from '../shared/media-renderer-content-state';\nimport { createResolvedMediaUrlSignal } from '../shared/media-url-resolve';\nimport {\n  AXConversationMessageRendererCopyHostComponent,\n  mediaCopyText,\n} from '../shared/message-renderer-copy-host.component';\nimport { AXConversationMessageRendererStateComponent } from '../shared/message-renderer-state.component';\nimport { syncPlaybackInfoBarBanner } from '../shared/playback-banner-sync';\n\n/** Decorative bars when payload has no waveform (deterministic, no random). */\nconst AX_CONVERSATION_FALLBACK_WAVEFORM: readonly number[] = [\n  38, 58, 44, 72, 48, 64, 40, 68, 52, 60, 42, 56, 46, 70, 50, 62, 36, 54, 48, 66,\n];\n\n@Component({\n  selector: 'ax-conversation-voice-renderer',\n  imports: [CommonModule, AXConversationMessageRendererStateComponent],\n\n  templateUrl: './voice-renderer.component.html',\n  styleUrl: './voice-renderer.component.css',\n  encapsulation: ViewEncapsulation.None,\n})\nexport class AXConversationVoiceRendererComponent extends AXConversationMessageRendererCopyHostComponent {\n  private readonly fileTypes = inject(AXFileTypeRegistryService);\n  private readonly translation = inject(AXTranslationService);\n  private readonly platformId = inject(PLATFORM_ID);\n  private readonly destroyRef = inject(DestroyRef);\n  private readonly infoBarService = inject(AXConversationInfoBarService, { optional: true });\n  private readonly audioElementRef = viewChild<ElementRef<HTMLAudioElement>>('audioElement');\n\n  private readonly _contentState = signal<AXConversationMessageRendererContentState>('ready');\n\n  readonly message = input.required<AXConversationMessage>();\n  readonly rendererState = computed(() => ({\n    deliveryStatus: this.message().status,\n    contentState: this._contentState(),\n  }));\n\n  readonly isPlaying = signal(false);\n  readonly currentTime = signal(0);\n  readonly duration = signal(0);\n  readonly playbackSpeed = signal(1.0);\n\n  private readonly speeds = [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2] as const;\n\n  readonly payload = computed(() => this.message().payload as AXConversationVoicePayload);\n  private readonly mediaReference = computed(() => ({\n    url: this.payload().url,\n    mediaId: this.payload().mediaId,\n    mimeType: this.payload().mimeType,\n    size: this.payload().size,\n  }));\n  private readonly resolvedUrl = createResolvedMediaUrlSignal(this.mediaReference);\n  readonly voiceUrl = computed(() => pickDisplayMediaUrl(this.resolvedUrl(), this.payload().url));\n\n  readonly waveformBars = computed(() => {\n    const w = this.payload().waveform;\n    return w?.length ? w : [...AX_CONVERSATION_FALLBACK_WAVEFORM];\n  });\n\n  readonly activeBarIndex = computed(() => {\n    const dur = this.duration();\n    const n = this.waveformBars().length;\n    return dur > 0 ? Math.floor((this.currentTime() / dur) * n) : 0;\n  });\n\n  readonly timeLabel = computed(() => formatMediaDuration(this.isPlaying() ? this.currentTime() : this.duration()));\n\n  readonly voiceLoadErrorLabel = computed(() =>\n    this.translation.translateSync('@acorex:chat.renderer-state.could-not-load-voice'),\n  );\n\n  copy(): Promise<string> {\n    return copyWithFileTypeFallback(this.message(), this.fileTypes, () => {\n      const url = this.voiceUrl()?.trim();\n      return mediaCopyText(undefined, 'Voice message', 'voice messages', 1, [url]);\n    });\n  }\n\n  constructor() {\n    super();\n    bindMediaRendererContentState(this.message, this._contentState, () => this.voiceUrl());\n\n    effect((onCleanup) => {\n      const audioEl = this.audioElementRef()?.nativeElement;\n      if (!audioEl || !isPlatformBrowser(this.platformId)) {\n        return;\n      }\n      const onMeta = (): void => {\n        this.duration.set(audioEl.duration);\n      };\n      audioEl.addEventListener('loadedmetadata', onMeta);\n      onCleanup(() => audioEl.removeEventListener('loadedmetadata', onMeta));\n    });\n\n    this.destroyRef.onDestroy(() => {\n      const messageId = this.message()?.id;\n      if (!messageId || !this.infoBarService) {\n        return;\n      }\n      this.infoBarService.hideMessageBanner(messageId);\n    });\n  }\n\n  togglePlay(): void {\n    if (!isPlatformBrowser(this.platformId)) {\n      return;\n    }\n    const audioEl = this.audioElementRef()?.nativeElement;\n    if (!audioEl) {\n      return;\n    }\n    if (this.isPlaying()) {\n      audioEl.pause();\n      this.isPlaying.set(false);\n      this.syncInfoBarBanner();\n    } else {\n      void audioEl.play();\n      this.isPlaying.set(true);\n      this.syncInfoBarBanner(true);\n    }\n  }\n\n  cyclePlaybackSpeed(): void {\n    const current = this.playbackSpeed();\n    const i = this.speeds.findIndex((s) => s === current);\n    const nextIndex = (i < 0 ? 2 : i + 1) % this.speeds.length;\n    const next = this.speeds[nextIndex] ?? 1;\n    this.playbackSpeed.set(next);\n    const audioEl = this.audioElementRef()?.nativeElement;\n    if (audioEl) {\n      audioEl.playbackRate = next;\n      this.syncInfoBarBanner();\n    }\n  }\n\n  onTimeUpdate(): void {\n    const audioEl = this.audioElementRef()?.nativeElement;\n    if (audioEl) {\n      this.currentTime.set(audioEl.currentTime);\n      this.syncInfoBarBanner();\n    }\n  }\n\n  onEnded(): void {\n    this.isPlaying.set(false);\n    this.currentTime.set(0);\n    this.syncInfoBarBanner();\n  }\n\n  onError(): void {\n    if (!reportMediaLoadError(this.message(), this._contentState)) {\n      return;\n    }\n    this.isPlaying.set(false);\n    this.infoBarService?.hideMessageBanner(this.message().id);\n  }\n\n  private pausePlayback(): void {\n    const audioEl = this.audioElementRef()?.nativeElement;\n    if (!audioEl) {\n      this.isPlaying.set(false);\n      return;\n    }\n    audioEl.pause();\n    this.isPlaying.set(false);\n  }\n\n  private syncInfoBarBanner(forceOpen = false): void {\n    if (!this.infoBarService) {\n      return;\n    }\n    const message = this.message();\n    const payload = this.payload();\n\n    syncPlaybackInfoBarBanner(\n      this.infoBarService,\n      message,\n      {\n        title: 'Voice message',\n        currentTime: this.currentTime(),\n        duration: this.duration() || payload.duration || 0,\n        isPlaying: this.isPlaying(),\n        onTogglePlay: () => this.togglePlay(),\n        onClose: () => this.pausePlayback(),\n        playbackSpeed: this.playbackSpeed(),\n        onCycleSpeed: () => this.cyclePlaybackSpeed(),\n        showSpeedControl: true,\n      },\n      { forceOpen },\n    );\n  }\n}\n","<div class=\"ax-conversation-voice\">\n  <div class=\"ax-conversation-voice__bar\">\n    <button\n      type=\"button\"\n      class=\"ax-conversation-voice__fab\"\n      (click)=\"togglePlay()\"\n      [attr.aria-label]=\"isPlaying() ? 'Pause' : 'Play voice message'\"\n    >\n      <i class=\"fa-solid\" [class.fa-pause]=\"isPlaying()\" [class.fa-play]=\"!isPlaying()\"></i>\n    </button>\n    <div class=\"ax-conversation-voice__wave\" aria-hidden=\"true\">\n      <div class=\"ax-conversation-voice__cols\">\n        @for (bar of waveformBars(); track $index) {\n          <div\n            class=\"ax-conversation-voice__col\"\n            [style.height.%]=\"bar\"\n            [class.ax-conversation-voice__col--on]=\"$index < activeBarIndex()\"\n          ></div>\n        }\n      </div>\n    </div>\n    <div class=\"ax-conversation-voice__side\">\n      <button\n        type=\"button\"\n        class=\"ax-conversation-voice__speed\"\n        (click)=\"cyclePlaybackSpeed()\"\n        [attr.aria-label]=\"'Playback speed: ' + playbackSpeed() + 'x'\"\n      >\n        {{ playbackSpeed() }}x\n      </button>\n      <span class=\"ax-conversation-voice__time\">{{ timeLabel() }}</span>\n    </div>\n  </div>\n  <audio\n    #audioElement\n    class=\"ax-conversation-voice__el\"\n    [src]=\"voiceUrl() || null\"\n    (error)=\"onError()\"\n    (timeupdate)=\"onTimeUpdate()\"\n    (ended)=\"onEnded()\"\n  ></audio>\n  <ax-conversation-message-renderer-state\n    [rendererState]=\"rendererState()\"\n    [message]=\"message()\"\n    [contentErrorLabel]=\"voiceLoadErrorLabel()\"\n    contentErrorStyle=\"inline\"\n    contentErrorIconClass=\"fa-light fa-microphone\"\n    placement=\"below\"\n  />\n</div>\n","/**\n * Default Message Actions Plugin\n * Individual message action constants\n */\n\nimport { translateSync } from '@acorex/core/translation';\nimport { inject } from '@angular/core';\nimport { AXConversationComposerService } from '../../../components/composer/composer.service';\nimport { AXConversationMessageAction } from '../../../registries';\nimport { AXConversationService } from '../../../services';\n\n/**\n * Reply to message\n */\nexport const AX_CONVERSATION_MESSAGE_REPLY_ACTION: AXConversationMessageAction = {\n  id: 'reply',\n  label: '@acorex:chat.actions.reply',\n  icon: 'fa-light fa-reply',\n  priority: 90,\n  visible: () => true,\n  enabled: () => true,\n  handler: async (context) => {\n    inject(AXConversationComposerService).startReply(context.message);\n  },\n};\n\n/**\n * Edit own message (text only)\n */\nexport const AX_CONVERSATION_MESSAGE_EDIT_ACTION: AXConversationMessageAction = {\n  id: 'edit',\n  label: '@acorex:chat.actions.edit',\n  icon: 'fa-light fa-pen',\n  priority: 80,\n  visible: (message, currentUser) => message.type === 'text' && message.senderId === currentUser.id,\n  enabled: (message, currentUser) => message.senderId === currentUser.id,\n  handler: async (context) => {\n    inject(AXConversationComposerService).startEdit(context.message);\n  },\n};\n\n/**\n * Delete own message\n */\nexport const AX_CONVERSATION_MESSAGE_DELETE_ACTION: AXConversationMessageAction = {\n  id: 'delete',\n  label: '@acorex:chat.actions.delete',\n  icon: 'fa-light fa-trash',\n  priority: 70,\n  destructive: true,\n  visible: (message, currentUser) => message.senderId === currentUser.id,\n  enabled: (message, currentUser) => message.senderId === currentUser.id,\n  handler: async (context) => {\n    await inject(AXConversationService).deleteMessage(context.message.id, false);\n  },\n};\n\n/**\n * Forward message to another conversation\n */\nexport const AX_CONVERSATION_MESSAGE_FORWARD_ACTION: AXConversationMessageAction = {\n  id: 'forward',\n  label: '@acorex:chat.actions.forward',\n  icon: 'fa-light fa-share',\n  priority: 75,\n  visible: () => true,\n  enabled: () => !inject(AXConversationService).isForwardingMessage(),\n  handler: async (context) => {\n    const conversationService = inject(AXConversationService);\n    if (conversationService.isForwardingMessage()) {\n      return;\n    }\n    const { AXConversationForwardMessageDialogComponent } = await import(\n      '../../../components/message-list/forward-message-dialog.component'\n    );\n    await conversationService.popupService.open(AXConversationForwardMessageDialogComponent, {\n      title: translateSync('@acorex:chat.dialog.forward-message.title'),\n      size: 'sm',\n      closeButton: true,\n      data: {\n        conversationService,\n        message: context.message,\n      },\n    });\n  },\n};\n","import type { AXConversationMessageRenderer } from '../../../registries/message-renderer.registry';\nimport { AX_CONVERSATION_COMPOSER_EMOJI_ACTION } from '../../composer/composer-actions/emoji-action.plugin';\n\nexport const AX_CONVERSATION_TEXT_RENDERER: AXConversationMessageRenderer = {\n  type: 'text',\n  componentLoader: () =>\n    import('../components/text-renderer/text-renderer.component').then((m) => m.AXConversationTextRendererComponent),\n  canHandle: (message) => message.type === 'text',\n  capabilities: {\n    supportsReactions: true,\n    supportsReplies: true,\n    supportsEdit: true,\n    supportsForward: true,\n    supportsSelection: true,\n  },\n  displayName: 'Text',\n  icon: 'fa-light fa-font',\n  composerActions: [AX_CONVERSATION_COMPOSER_EMOJI_ACTION],\n};\n","import type { AXConversationMessageRenderer } from '../../../registries/message-renderer.registry';\nimport { AX_CONVERSATION_COMPOSER_IMAGE_ACTION } from '../../composer/composer-actions/image-action.plugin';\nimport { AX_CONVERSATION_IMAGE_CATALOG } from '../../../models/message-file-type-catalog';\n\nexport const AX_CONVERSATION_IMAGE_RENDERER: AXConversationMessageRenderer = {\n  type: 'image',\n  componentLoader: () =>\n    import('../components/image-renderer/image-renderer.component').then((m) => m.AXConversationImageRendererComponent),\n  canHandle: (message) => message.type === 'image',\n  capabilities: {\n    supportsReactions: true,\n    supportsReplies: true,\n    supportsEdit: false,\n    supportsForward: true,\n    supportsSelection: true,\n  },\n  displayName: 'Image',\n  icon: 'fa-light fa-image',\n  fileType: AX_CONVERSATION_IMAGE_CATALOG,\n  composerActions: [AX_CONVERSATION_COMPOSER_IMAGE_ACTION],\n};\n","import type { AXConversationMessageRenderer } from '../../../registries/message-renderer.registry';\nimport { AX_CONVERSATION_COMPOSER_VIDEO_ACTION } from '../../composer/composer-actions/video-action.plugin';\nimport { AX_CONVERSATION_VIDEO_CATALOG } from '../../../models/message-file-type-catalog';\n\nexport const AX_CONVERSATION_VIDEO_RENDERER: AXConversationMessageRenderer = {\n  type: 'video',\n  componentLoader: () =>\n    import('../components/video-renderer/video-renderer.component').then((m) => m.AXConversationVideoRendererComponent),\n  infoBarBannerLoader: () =>\n    import('../components/shared/media-playback-info-bar-banner.component').then(\n      (m) => m.AXConversationMediaPlaybackInfoBarBannerComponent,\n    ),\n  canHandle: (message) => message.type === 'video',\n  capabilities: {\n    supportsReactions: true,\n    supportsReplies: true,\n    supportsEdit: false,\n    supportsForward: true,\n    supportsSelection: true,\n  },\n  displayName: 'Video',\n  icon: 'fa-light fa-video',\n  fileType: AX_CONVERSATION_VIDEO_CATALOG,\n  composerActions: [AX_CONVERSATION_COMPOSER_VIDEO_ACTION],\n};\n","import type { AXConversationMessageRenderer } from '../../../registries/message-renderer.registry';\nimport { AX_CONVERSATION_COMPOSER_AUDIO_ACTION } from '../../composer/composer-actions/audio-action.plugin';\nimport { AX_CONVERSATION_AUDIO_CATALOG } from '../../../models/message-file-type-catalog';\n\nexport const AX_CONVERSATION_AUDIO_RENDERER: AXConversationMessageRenderer = {\n  type: 'audio',\n  componentLoader: () =>\n    import('../components/audio-renderer/audio-renderer.component').then((m) => m.AXConversationAudioRendererComponent),\n  infoBarBannerLoader: () =>\n    import('../components/shared/media-playback-info-bar-banner.component').then(\n      (m) => m.AXConversationMediaPlaybackInfoBarBannerComponent,\n    ),\n  canHandle: (message) => message.type === 'audio',\n  capabilities: {\n    supportsReactions: true,\n    supportsReplies: true,\n    supportsEdit: false,\n    supportsForward: true,\n    supportsSelection: true,\n  },\n  displayName: 'Audio',\n  icon: 'fa-light fa-music',\n  fileType: AX_CONVERSATION_AUDIO_CATALOG,\n  composerActions: [AX_CONVERSATION_COMPOSER_AUDIO_ACTION],\n};\n","import type { AXConversationMessageRenderer } from '../../../registries/message-renderer.registry';\nimport { AX_CONVERSATION_COMPOSER_VOICE_RECORDING_ACTION } from '../../composer/composer-actions/voice-action.plugin';\nimport { AX_CONVERSATION_VOICE_CATALOG } from '../../../models/message-file-type-catalog';\n\nexport const AX_CONVERSATION_VOICE_RENDERER: AXConversationMessageRenderer = {\n  type: 'voice',\n  componentLoader: () =>\n    import('../components/voice-renderer/voice-renderer.component').then((m) => m.AXConversationVoiceRendererComponent),\n  infoBarBannerLoader: () =>\n    import('../components/shared/media-playback-info-bar-banner.component').then(\n      (m) => m.AXConversationMediaPlaybackInfoBarBannerComponent,\n    ),\n  canHandle: (message) => message.type === 'voice',\n  capabilities: {\n    supportsReactions: true,\n    supportsReplies: true,\n    supportsEdit: false,\n    supportsForward: true,\n    supportsSelection: true,\n  },\n  displayName: 'Voice',\n  icon: 'fa-light fa-microphone',\n  fileType: AX_CONVERSATION_VOICE_CATALOG,\n  composerActions: [AX_CONVERSATION_COMPOSER_VOICE_RECORDING_ACTION],\n};\n","import type { AXConversationMessageRenderer } from '../../../registries/message-renderer.registry';\nimport { AX_CONVERSATION_COMPOSER_FILE_ACTION } from '../../composer/composer-actions/file-action.plugin';\nimport { AX_CONVERSATION_FILE_CATALOG } from '../../../models/message-file-type-catalog';\n\nexport const AX_CONVERSATION_FILE_RENDERER: AXConversationMessageRenderer = {\n  type: 'file',\n  componentLoader: () =>\n    import('../components/file-renderer/file-renderer.component').then((m) => m.AXConversationFileRendererComponent),\n  canHandle: (message) => message.type === 'file',\n  capabilities: {\n    supportsReactions: true,\n    supportsReplies: true,\n    supportsEdit: false,\n    supportsForward: true,\n    supportsSelection: true,\n  },\n  displayName: 'File',\n  icon: 'fa-light fa-file',\n  fileType: AX_CONVERSATION_FILE_CATALOG,\n  composerActions: [AX_CONVERSATION_COMPOSER_FILE_ACTION],\n};\n","import type { AXConversationMessageRenderer } from '../../../registries/message-renderer.registry';\nimport { AX_CONVERSATION_COMPOSER_LOCATION_ACTION } from '../../composer/composer-actions/location-action.plugin';\n\nexport const AX_CONVERSATION_LOCATION_RENDERER: AXConversationMessageRenderer = {\n  type: 'location',\n  componentLoader: () =>\n    import('../components/location-renderer/location-renderer.component').then((m) => m.AXConversationLocationRendererComponent),\n  canHandle: (message) => message.type === 'location',\n  capabilities: {\n    supportsReactions: true,\n    supportsReplies: true,\n    supportsEdit: false,\n    supportsForward: true,\n    supportsSelection: true,\n  },\n  displayName: 'Location',\n  icon: 'fa-light fa-location-dot',\n  composerActions: [AX_CONVERSATION_COMPOSER_LOCATION_ACTION],\n};\n","import type { AXConversationMessageRenderer } from '../../../registries/message-renderer.registry';\n\nexport const AX_CONVERSATION_STICKER_RENDERER: AXConversationMessageRenderer = {\n  type: 'sticker',\n  componentLoader: () =>\n    import('../components/sticker-renderer/sticker-renderer.component').then((m) => m.AXConversationStickerRendererComponent),\n  canHandle: (message) => message.type === 'sticker',\n  capabilities: {\n    supportsReactions: true,\n    supportsReplies: true,\n    supportsEdit: false,\n    supportsForward: true,\n    supportsSelection: true,\n  },\n  displayName: 'Sticker',\n  icon: 'fa-light fa-note-sticky',\n};\n","import type { AXConversationMessageRenderer } from '../../../registries/message-renderer.registry';\n\nexport const AX_CONVERSATION_SYSTEM_RENDERER: AXConversationMessageRenderer = {\n  type: 'system',\n  componentLoader: () =>\n    import('../components/system-renderer/system-renderer.component').then((m) => m.AXConversationSystemRendererComponent),\n  canHandle: (message) => message.type === 'system',\n  capabilities: {\n    supportsReactions: false,\n    supportsReplies: false,\n    supportsEdit: false,\n    supportsForward: false,\n    supportsSelection: false,\n  },\n  displayName: 'System',\n  icon: 'fa-light fa-info-circle',\n};\n","import type { AXConversationMessageRenderer } from '../../../registries/message-renderer.registry';\n\nexport const AX_CONVERSATION_FALLBACK_RENDERER: AXConversationMessageRenderer = {\n  type: 'fallback',\n  componentLoader: () =>\n    import('../components/fallback-renderer/fallback-renderer.component').then((m) => m.AXConversationFallbackRendererComponent),\n  canHandle: () => true,\n  capabilities: {\n    supportsReactions: false,\n    supportsReplies: false,\n    supportsEdit: false,\n    supportsForward: false,\n    supportsSelection: false,\n  },\n  displayName: 'Unknown',\n  icon: 'fa-light fa-question-circle',\n};\n","/**\n * Default Conversation Item Actions Plugin\n * Individual action constants with AX_ prefix naming convention\n */\n\nimport { inject } from '@angular/core';\nimport { AXConversationItemAction } from '../../../registries';\nimport { AXConversationService } from '../../../services';\n\n/**\n * Mute/Unmute conversation notifications\n */\nexport const AX_CONVERSATION_ITEM_MUTE_ACTION: AXConversationItemAction = {\n  id: 'mute',\n  label: (context) => {\n    const notifications = inject(AXConversationService).getRoomPreferences(context.conversation.id).notifications;\n    return notifications === false ? '@acorex:chat.actions.unmute' : '@acorex:chat.actions.mute';\n  },\n  icon: (context) => {\n    const notifications = inject(AXConversationService).getRoomPreferences(context.conversation.id).notifications;\n    return notifications === false ? 'fa-light fa-bell-slash' : 'fa-light fa-bell';\n  },\n  tooltip: '@acorex:chat.tooltips.toggle-notifications',\n  priority: 100,\n  handler: async (context) => {\n    const service = inject(AXConversationService);\n    const currentNotifications = service.getRoomPreferences(context.conversation.id).notifications;\n    await service.updateConversationSettings(context.conversation.id, {\n      notifications: !currentNotifications,\n    });\n  },\n};\n\n/**\n * Pin/Unpin conversation to top\n */\nexport const AX_CONVERSATION_ITEM_PIN_ACTION: AXConversationItemAction = {\n  id: 'pin',\n  label: (context) => (context.conversation.pinned ? '@acorex:chat.actions.unpin' : '@acorex:chat.actions.pin'),\n  icon: (context) => (context.conversation.pinned ? 'fa-light fa-thumbtack' : 'fa-regular fa-thumbtack'),\n  tooltip: '@acorex:chat.tooltips.pin-conversation',\n  priority: 90,\n  handler: async (context) => {\n    const currentPinned = context.conversation.pinned;\n    await inject(AXConversationService).updateConversation(context.conversation.id, {\n      pinned: !currentPinned,\n    });\n  },\n};\n\n/**\n * Mark conversation as read\n */\nexport const AX_CONVERSATION_ITEM_MARK_READ_ACTION: AXConversationItemAction = {\n  id: 'mark-read',\n  label: '@acorex:chat.actions.mark-as-read',\n  icon: 'fa-light fa-envelope-open',\n  tooltip: '@acorex:chat.tooltips.mark-conversation-as-read',\n  priority: 80,\n  visible: (context) => (context.conversation.unreadCount ?? 0) > 0,\n  handler: async (context) => {\n    await inject(AXConversationService).markConversationAsRead(context.conversation.id);\n  },\n};\n\n/**\n * Divider separator before destructive actions\n */\nexport const AX_CONVERSATION_ITEM_DIVIDER: AXConversationItemAction = {\n  id: 'divider-1',\n  label: '',\n  divider: true,\n  priority: 60,\n};\n\n/**\n * Delete/Leave conversation action (smart action that adapts based on conversation type)\n * - Private: \"Delete\" - Deletes the conversation\n * - Group/Channel: \"Leave & Delete\" - Leaves the group and removes it from list\n */\nexport const AX_CONVERSATION_ITEM_DELETE_ACTION: AXConversationItemAction = {\n  id: 'delete',\n  label: (context) => {\n    const isGroup = context.conversation.type === 'group' || context.conversation.type === 'channel';\n    return isGroup ? '@acorex:chat.actions.leave-and-delete' : '@acorex:chat.actions.delete';\n  },\n  icon: (context) => {\n    const isGroup = context.conversation.type === 'group' || context.conversation.type === 'channel';\n    return isGroup ? 'fa-light fa-door-open' : 'fa-light fa-trash';\n  },\n  tooltip: (context) => {\n    const isGroup = context.conversation.type === 'group' || context.conversation.type === 'channel';\n    return isGroup ? '@acorex:chat.tooltips.leave-and-delete-group' : '@acorex:chat.tooltips.delete-conversation';\n  },\n  destructive: true,\n  priority: 50,\n  handler: async (context) => {\n    // Service handles confirmation dialog\n    await inject(AXConversationService).deleteConversation(context.conversation.id);\n  },\n};\n\n/**\n * Block/Unblock user (private conversations only)\n */\nexport const AX_CONVERSATION_ITEM_BLOCK_ACTION: AXConversationItemAction = {\n  id: 'block',\n  label: (context) => (context.conversation.blocked ? '@acorex:chat.actions.unblock' : '@acorex:chat.actions.block'),\n  icon: 'fa-light fa-ban',\n  tooltip: '@acorex:chat.tooltips.block-conversation',\n  destructive: true,\n  priority: 40,\n  visible: (context) => context.conversation.type === 'private',\n  handler: async (context) => {\n    const currentBlocked = context.conversation.blocked;\n    await inject(AXConversationService).updateConversation(context.conversation.id, {\n      blocked: !currentBlocked,\n    });\n  },\n};\n","/**\n * Default Conversation Tabs Plugin\n * Provides sidebar conversation filter tabs (all, private, groups, etc.)\n */\n\nimport type { AXConversation } from '../../../models';\nimport { AXConversationTab } from '../../../registries';\n\nfunction conversationHasUnread(c: AXConversation): boolean {\n  return (c.unreadCount ?? 0) > 0;\n}\n\nfunction isConversationArchived(c: AXConversation): boolean {\n  return !!c.archived;\n}\n\n/** Active (non-archived) conversations — archived chats only appear on the Archived tab. */\nfunction activeConversations(conversations: AXConversation[]): AXConversation[] {\n  return conversations.filter((c) => !isConversationArchived(c));\n}\n\n/** Number of conversations (in the same scope as each tab's `filter`) that have any unread messages — not sum of unread counts. */\nfunction countConversationsWithUnreadInScope(\n  conversations: AXConversation[],\n  scope: (items: AXConversation[]) => AXConversation[],\n): number | undefined {\n  const n = scope(conversations).filter(conversationHasUnread).length;\n  return n || undefined;\n}\n\n// Individual conversation tab constants (no aggregate arrays)\nexport const AX_CONVERSATION_TAB_ALL: AXConversationTab = {\n  id: 'all',\n  label: '@acorex:chat.tabs.all',\n  icon: 'fa-light fa-comments',\n  priority: 100,\n  filter: (conversations) => activeConversations(conversations),\n  badge: (conversations) => countConversationsWithUnreadInScope(conversations, activeConversations),\n  default: true,\n};\n\nexport const AX_CONVERSATION_TAB_PRIVATE: AXConversationTab = {\n  id: 'private',\n  label: '@acorex:chat.tabs.private',\n  icon: 'fa-light fa-user',\n  priority: 90,\n  filter: (conversations) => activeConversations(conversations).filter((c) => c.type === 'private'),\n  badge: (conversations) =>\n    countConversationsWithUnreadInScope(conversations, (c) =>\n      activeConversations(c).filter((x) => x.type === 'private'),\n    ),\n};\n\nexport const AX_CONVERSATION_TAB_GROUPS: AXConversationTab = {\n  id: 'groups',\n  label: '@acorex:chat.tabs.groups',\n  icon: 'fa-light fa-users',\n  priority: 80,\n  filter: (conversations) => activeConversations(conversations).filter((c) => c.type === 'group'),\n  badge: (conversations) =>\n    countConversationsWithUnreadInScope(conversations, (c) =>\n      activeConversations(c).filter((x) => x.type === 'group'),\n    ),\n};\n\nexport const AX_CONVERSATION_TAB_CHANNELS: AXConversationTab = {\n  id: 'channels',\n  label: '@acorex:chat.tabs.channels',\n  icon: 'fa-light fa-hashtag',\n  priority: 70,\n  filter: (conversations) => activeConversations(conversations).filter((c) => c.type === 'channel'),\n  badge: (conversations) =>\n    countConversationsWithUnreadInScope(conversations, (c) =>\n      activeConversations(c).filter((x) => x.type === 'channel'),\n    ),\n};\n\nexport const AX_CONVERSATION_TAB_BOT: AXConversationTab = {\n  id: 'bot',\n  label: '@acorex:chat.tabs.bots',\n  icon: 'fa-light fa-robot',\n  priority: 65,\n  filter: (conversations) => activeConversations(conversations).filter((c) => c.type === 'bot'),\n  badge: (conversations) =>\n    countConversationsWithUnreadInScope(conversations, (c) =>\n      activeConversations(c).filter((x) => x.type === 'bot'),\n    ),\n};\n\nexport const AX_CONVERSATION_TAB_UNREAD: AXConversationTab = {\n  id: 'unread',\n  label: '@acorex:chat.tabs.unread',\n  icon: 'fa-light fa-envelope',\n  priority: 60,\n  filter: (conversations) => activeConversations(conversations).filter((c) => c.unreadCount > 0),\n  badge: (conversations) =>\n    countConversationsWithUnreadInScope(conversations, (c) =>\n      activeConversations(c).filter((x) => x.unreadCount > 0),\n    ),\n};\n\nexport const AX_CONVERSATION_TAB_ARCHIVED: AXConversationTab = {\n  id: 'archived',\n  label: '@acorex:chat.tabs.archived',\n  icon: 'fa-light fa-archive',\n  priority: 50,\n  filter: (conversations) => conversations.filter(isConversationArchived),\n  badge: (conversations) =>\n    countConversationsWithUnreadInScope(conversations, (c) => c.filter(isConversationArchived)),\n};\n","/**\n * Conversation Tabs Plugins\n */\n\nexport * from './default-tabs.plugin';\n","/**\n * Default conversation avatar host when apps register only a user avatar component.\n * Routes private 1:1 chats through the user avatar; other types use built-in fallback display.\n */\n\nimport { AXAvatarComponent } from '@acorex/components/avatar';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXImageComponent } from '@acorex/components/image';\nimport { AXLabelComponent } from '@acorex/components/label';\nimport { NgComponentOutlet } from '@angular/common';\nimport { Component, ViewEncapsulation, computed, inject, input } from '@angular/core';\nimport { AXConversationService } from '../../services';\nimport { AX_CONVERSATION_USER_AVATAR_COMPONENT } from '../../tokens/conversation-avatar.tokens';\nimport {\n  resolveConversationAvatarDisplay,\n  resolveConversationPeerUserId,\n  resolveUserAvatarDisplay,\n} from '../../utils/avatar-context.utils';\nimport { pickComponentInputs } from '../../utils/component-inputs.utils';\nimport { AXConversationMessageUtilsService } from '../../utils/message-utils.service';\n\n@Component({\n  selector: 'ax-conversation-default-conversation-avatar',\n  encapsulation: ViewEncapsulation.None,\n  imports: [NgComponentOutlet, AXAvatarComponent, AXDecoratorModule, AXImageComponent, AXLabelComponent],\n  templateUrl: './conversation-default-conversation-avatar.component.html',\n  host: {\n    '[style.--ax-conversation-avatar-size.px]': 'size()',\n  },\n})\nexport class AXConversationDefaultConversationAvatarComponent {\n  private readonly conversationService = inject(AXConversationService, { optional: true });\n  private readonly userAvatarComponent = inject(AX_CONVERSATION_USER_AVATAR_COMPONENT, { optional: true });\n\n  readonly conversationId = input.required<string>();\n  readonly size = input<number>(40);\n\n  private readonly currentUserId = computed(() => this.conversationService?.currentUser()?.id);\n\n  private readonly conversation = computed(() => {\n    const conversationId = this.conversationId();\n    if (!conversationId) {\n      return undefined;\n    }\n\n    return this.conversationService?.getConversation(conversationId) ?? undefined;\n  });\n\n  readonly peerUserId = computed(() => {\n    const conversation = this.conversation();\n    if (!conversation || conversation.type !== 'private') {\n      return undefined;\n    }\n\n    return resolveConversationPeerUserId(conversation, this.currentUserId());\n  });\n\n  readonly useUserAvatar = computed(() => this.userAvatarComponent ?? null);\n\n  readonly userAvatarInputs = computed(() => {\n    const conversation = this.conversation();\n    const peerId = this.peerUserId();\n    const userId = peerId ?? conversation?.id ?? '';\n    const resolved =\n      peerId && conversation\n        ? resolveUserAvatarDisplay(peerId, conversation)\n        : conversation\n          ? resolveConversationAvatarDisplay(conversation, this.currentUserId())\n          : { name: '?', avatar: undefined, icon: undefined };\n\n    return {\n      userId,\n      size: this.size(),\n      displayName: resolved.name,\n      displayAvatar: resolved.avatar,\n      displayIcon: resolved.icon,\n    };\n  });\n\n  readonly filteredUserAvatarInputs = computed(() => {\n    const component = this.useUserAvatar();\n    if (!component) {\n      return {};\n    }\n\n    return pickComponentInputs(component, this.userAvatarInputs());\n  });\n\n  readonly fallbackDisplay = computed(() => {\n    const conversation = this.conversation();\n    if (!conversation) {\n      return { name: '?', avatar: undefined, icon: undefined };\n    }\n\n    return resolveConversationAvatarDisplay(conversation, this.currentUserId());\n  });\n\n  readonly fallbackInitials = computed(() =>\n    AXConversationMessageUtilsService.getInitials(this.fallbackDisplay().name),\n  );\n}\n","@if (useUserAvatar(); as userAvatar) {\n  <ng-container *ngComponentOutlet=\"userAvatar; inputs: filteredUserAvatarInputs()\" />\n} @else {\n  <ax-avatar [size]=\"size()\">\n    @if (fallbackDisplay().avatar; as avatarSrc) {\n      <ax-image [src]=\"avatarSrc\" [alt]=\"fallbackDisplay().name\"></ax-image>\n    } @else if (fallbackDisplay().icon; as iconClass) {\n      <ax-icon><i [class]=\"iconClass\" aria-hidden=\"true\"></i></ax-icon>\n    } @else {\n      <ax-label>{{ fallbackInitials() }}</ax-label>\n    }\n  </ax-avatar>\n}\n","/**\n * AXConversationModule\n * Legacy NgModule wrapper for backward compatibility.\n * For new applications, prefer standalone components with provideConversation().\n */\n\nimport { CommonModule } from '@angular/common';\nimport { ModuleWithProviders, NgModule, Provider, Type } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport {\n  AXConversationComposerComponent,\n  AXConversationComposerService,\n  AXConversationContainerComponent,\n  AXConversationInfoBarComponent,\n  AXConversationInfoBarService,\n  AXConversationMessageListComponent,\n  AXConversationMessageListService,\n  AXConversationSidebarComponent,\n  AXConversationSidebarService,\n} from './components';\nimport { AXConversationDefaultConversationAvatarComponent } from './components/shared/conversation-default-conversation-avatar.component';\nimport { AXConversationInfiniteScrollDirective } from './directives';\nimport { provideConversationComposerFileTypes } from './plugins/composer/composer-actions/composer-file-types.plugin';\nimport {\n  AXConversationComposerActionRegistry,\n  AXConversationComposerTabRegistry,\n  AXConversationInfoBarActionRegistry,\n  AXConversationItemActionRegistry,\n  AXConversationMessageActionRegistry,\n  AXConversationMessageRendererRegistry,\n  AXConversationTabRegistry,\n} from './registries';\nimport { AXConversationComposerGenerationStateService, AXConversationRegistryService, AXConversationService } from './services';\nimport {\n  AXConversationApi,\n  AXConversationApiLoggerService,\n  AXConversationMessageApi,\n  AXConversationRealtimeApi,\n  AXConversationUserApi,\n} from './services/api';\nimport {\n  AXConversationAvatarComponents,\n  AXConversationConfig,\n  AXConversationRegistryConfiguration,\n  AX_CONVERSATION_CONFIG,\n  AX_CONVERSATION_CONVERSATION_AVATAR_COMPONENT,\n  AX_CONVERSATION_REGISTRY_CONFIG,\n  AX_CONVERSATION_USER_AVATAR_COMPONENT,\n  mergeWithDefaults,\n} from './tokens';\n\n/**\n * Configuration options for conversation module\n */\nexport interface AXConversationOptions {\n  /** User API implementation (required) */\n  userApi: Type<AXConversationUserApi>;\n  /** Conversation Management API implementation (required) */\n  conversationApi: Type<AXConversationApi>;\n  /** Message API implementation (required) */\n  messageApi: Type<AXConversationMessageApi>;\n  /** Realtime API implementation (optional) */\n  realtimeApi?: Type<AXConversationRealtimeApi>;\n  /** Configuration overrides */\n  config?: Partial<AXConversationConfig>;\n  /** Registry configuration */\n  registry?: Partial<AXConversationRegistryConfiguration>;\n  /** Optional custom avatar components for the entire conversation UI */\n  avatarComponents?: AXConversationAvatarComponents;\n}\n\nconst DECLARATIONS = [\n  AXConversationContainerComponent,\n  AXConversationSidebarComponent,\n  AXConversationInfoBarComponent,\n  AXConversationMessageListComponent,\n  AXConversationComposerComponent,\n  AXConversationInfiniteScrollDirective,\n];\n\n/** Internal default conversation avatar host; not part of the public module API. */\nconst INTERNAL_IMPORTS = [AXConversationDefaultConversationAvatarComponent];\n\n/**\n * Creates providers array for conversation module\n */\nfunction createProviders(options: Partial<AXConversationOptions>, includeServices: boolean): Provider[] {\n  const { userApi, conversationApi, messageApi, realtimeApi, config, registry, avatarComponents } = options;\n  const providers: Provider[] = [];\n\n  if (includeServices) {\n    if (!userApi || !conversationApi || !messageApi) {\n      throw new Error(\n        `Missing required API implementations: userApi, conversationApi, messageApi.\n          Example: provideConversation({\n            userApi: AXConversationIndexedDbUserApi,\n            conversationApi: AXConversationIndexedDbConversationApi,\n            messageApi: AXConversationIndexedDbMessageApi,\n          })\n          Import from @acorex/components/conversation`,\n      );\n    }\n    providers.push(\n      { provide: AXConversationUserApi, useClass: userApi },\n      { provide: AXConversationApi, useClass: conversationApi },\n      { provide: AXConversationMessageApi, useClass: messageApi },\n    );\n\n    const mergedConfig = mergeWithDefaults(config);\n    providers.push({ provide: AX_CONVERSATION_CONFIG, useValue: mergedConfig });\n\n    // Built-in conversation file-type plugins (image, video, audio, file, voice) + validation rules\n    providers.push(...provideConversationComposerFileTypes());\n\n    if (realtimeApi) {\n      providers.push({ provide: AXConversationRealtimeApi, useClass: realtimeApi });\n    }\n\n    providers.push(\n      AXConversationService,\n      AXConversationComposerGenerationStateService,\n      AXConversationApiLoggerService,\n      AXConversationComposerService,\n      AXConversationInfoBarService,\n      AXConversationMessageListService,\n      AXConversationSidebarService,\n    );\n  }\n\n  if (registry) {\n    providers.push({ provide: AX_CONVERSATION_REGISTRY_CONFIG, useValue: registry });\n  }\n\n  if (avatarComponents?.user) {\n    providers.push({\n      provide: AX_CONVERSATION_USER_AVATAR_COMPONENT,\n      useValue: avatarComponents.user,\n    });\n  }\n\n  if (avatarComponents?.conversation) {\n    providers.push({\n      provide: AX_CONVERSATION_CONVERSATION_AVATAR_COMPONENT,\n      useValue: avatarComponents.conversation,\n    });\n  } else if (avatarComponents?.user) {\n    providers.push({\n      provide: AX_CONVERSATION_CONVERSATION_AVATAR_COMPONENT,\n      useValue: AXConversationDefaultConversationAvatarComponent,\n    });\n  }\n\n  if (includeServices) {\n    providers.push(\n      AXConversationMessageRendererRegistry,\n      AXConversationMessageActionRegistry,\n      AXConversationComposerActionRegistry,\n      AXConversationComposerTabRegistry,\n      AXConversationTabRegistry,\n      AXConversationInfoBarActionRegistry,\n      AXConversationItemActionRegistry,\n      AXConversationRegistryService,\n    );\n  }\n\n  return providers;\n}\n\n@NgModule({\n  imports: [CommonModule, FormsModule, ...DECLARATIONS, ...INTERNAL_IMPORTS],\n  exports: [...DECLARATIONS],\n  providers: [],\n})\nexport class AXConversationModule {\n  /**\n   * Configure module for root module with singleton services.\n   * @deprecated Use standalone components with provideConversation()\n   */\n  static forRoot(options: AXConversationOptions): ModuleWithProviders<AXConversationModule> {\n    return {\n      ngModule: AXConversationModule,\n      providers: createProviders(options, true),\n    };\n  }\n\n  /**\n   * Configure module for lazy-loaded feature modules.\n   * Reuses singleton services from root, optionally overrides config/registry.\n   */\n  static forChild(\n    options: Omit<AXConversationOptions, 'userApi' | 'conversationApi' | 'messageApi' | 'realtimeApi'> = {},\n  ): ModuleWithProviders<AXConversationModule> {\n    return {\n      ngModule: AXConversationModule,\n      providers: createProviders(options, false),\n    };\n  }\n}\n\n/**\n * Provides conversation functionality for standalone applications.\n * Use in app config or route providers.\n *\n * @example\n * ```typescript\n * import {\n *   AXConversationIndexedDbUserApi,\n *   AXConversationIndexedDbConversationApi,\n *   AXConversationIndexedDbMessageApi,\n *   AXConversationIndexedDbRealtimeApi\n * } from '@acorex/components/conversation';\n *\n * export const appConfig: ApplicationConfig = {\n *   providers: [\n *     provideConversation({\n *       userApi: AXConversationIndexedDbUserApi,\n *       conversationApi: AXConversationIndexedDbConversationApi,\n *       messageApi: AXConversationIndexedDbMessageApi,\n *       realtimeApi: AXConversationIndexedDbRealtimeApi,\n *       config: { },\n *       registry: { messageActions: [myCustomAction] }\n *     })\n *   ]\n * };\n * ```\n */\nexport function provideConversation(options: AXConversationOptions): Provider[] {\n  return createProviders(options, true);\n}\n","/**\n * Error Message Constants\n * Centralized error messages with i18n support structure\n * \n * This file provides a foundation for internationalization.\n * Each error has a code and default English message.\n * Future i18n implementation can use these codes to look up translated messages.\n */\n\n/**\n * Error message interface\n */\nexport interface AXConversationErrorMessage {\n  /** Error code for programmatic handling and i18n lookup */\n  code: string;\n  /** Default English message */\n  message: string;\n  /** Optional message template with placeholders */\n  template?: string;\n}\n\n/**\n * Message validation errors\n */\nexport const AX_CONVERSATION_MESSAGE_ERRORS = {\n  EMPTY_MESSAGE: {\n    code: 'MESSAGE.EMPTY',\n    message: 'Message text cannot be empty',\n  },\n  MESSAGE_TOO_SHORT: {\n    code: 'MESSAGE.TOO_SHORT',\n    message: 'Message is too short',\n    template: 'Message must be at least {minLength} character(s)',\n  },\n  MESSAGE_TOO_LONG: {\n    code: 'MESSAGE.TOO_LONG',\n    message: 'Message is too long',\n    template: 'Message exceeds {maxLength} character limit',\n  },\n  MISSING_CONVERSATION_ID: {\n    code: 'MESSAGE.MISSING_CONVERSATION_ID',\n    message: 'Conversation ID is required',\n  },\n  MISSING_MESSAGE_TYPE: {\n    code: 'MESSAGE.MISSING_TYPE',\n    message: 'Message type is required',\n  },\n  MISSING_PAYLOAD: {\n    code: 'MESSAGE.MISSING_PAYLOAD',\n    message: 'Message payload is required',\n  },\n  INVALID_TEXT_PAYLOAD: {\n    code: 'MESSAGE.INVALID_TEXT_PAYLOAD',\n    message: 'Text message must have a text property',\n  },\n  INVALID_MEDIA_PAYLOAD: {\n    code: 'MESSAGE.INVALID_MEDIA_PAYLOAD',\n    message: 'Media message must have a url property',\n  },\n  INVALID_LOCATION_PAYLOAD: {\n    code: 'MESSAGE.INVALID_LOCATION_PAYLOAD',\n    message: 'Location message must have latitude and longitude properties',\n  },\n} as const;\n\n/**\n * File upload errors\n */\nexport const AX_CONVERSATION_FILE_ERRORS = {\n  FILE_TOO_LARGE: {\n    code: 'FILE.TOO_LARGE',\n    message: 'File is too large',\n    template: 'File size exceeds {maxSize} limit',\n  },\n  FILE_TYPE_NOT_ALLOWED: {\n    code: 'FILE.TYPE_NOT_ALLOWED',\n    message: 'File type is not allowed',\n    template: 'File type \"{fileType}\" is not allowed',\n  },\n  UPLOAD_FAILED: {\n    code: 'FILE.UPLOAD_FAILED',\n    message: 'File upload failed',\n  },\n} as const;\n\n/**\n * User validation errors\n */\nexport const AX_CONVERSATION_USER_ERRORS = {\n  MISSING_USER_ID: {\n    code: 'USER.MISSING_ID',\n    message: 'User ID is required',\n  },\n  INVALID_USER_IDS: {\n    code: 'USER.INVALID_IDS',\n    message: 'User IDs must be an array',\n  },\n  TOO_FEW_USERS: {\n    code: 'USER.TOO_FEW',\n    message: 'Not enough users',\n    template: 'At least {minCount} user(s) required',\n  },\n  TOO_MANY_USERS: {\n    code: 'USER.TOO_MANY',\n    message: 'Too many users',\n    template: 'Maximum {maxCount} user(s) allowed',\n  },\n  INVALID_USER_ID: {\n    code: 'USER.INVALID_ID',\n    message: 'All user IDs must be non-empty strings',\n  },\n  MISSING_EMAIL: {\n    code: 'USER.MISSING_EMAIL',\n    message: 'Email is required',\n  },\n  INVALID_EMAIL: {\n    code: 'USER.INVALID_EMAIL',\n    message: 'Invalid email format',\n  },\n} as const;\n\n/**\n * Conversation errors\n */\nexport const AX_CONVERSATION_ERRORS = {\n  NOT_FOUND: {\n    code: 'CONVERSATION.NOT_FOUND',\n    message: 'Conversation not found',\n  },\n  ALREADY_EXISTS: {\n    code: 'CONVERSATION.ALREADY_EXISTS',\n    message: 'Conversation already exists',\n  },\n  CREATE_FAILED: {\n    code: 'CONVERSATION.CREATE_FAILED',\n    message: 'Failed to create conversation',\n  },\n  DELETE_FAILED: {\n    code: 'CONVERSATION.DELETE_FAILED',\n    message: 'Failed to delete conversation',\n  },\n  UPDATE_FAILED: {\n    code: 'CONVERSATION.UPDATE_FAILED',\n    message: 'Failed to update conversation',\n  },\n  LOAD_FAILED: {\n    code: 'CONVERSATION.LOAD_FAILED',\n    message: 'Failed to load conversations',\n  },\n} as const;\n\n/**\n * Connection errors\n */\nexport const AX_CONVERSATION_CONNECTION_ERRORS = {\n  DISCONNECTED: {\n    code: 'CONNECTION.DISCONNECTED',\n    message: 'Connection lost',\n  },\n  FAILED_TO_CONNECT: {\n    code: 'CONNECTION.FAILED',\n    message: 'Failed to connect to server',\n  },\n  TIMEOUT: {\n    code: 'CONNECTION.TIMEOUT',\n    message: 'Connection timeout',\n  },\n  UNAUTHORIZED: {\n    code: 'CONNECTION.UNAUTHORIZED',\n    message: 'Unauthorized access',\n  },\n} as const;\n\n/**\n * Location validation errors\n */\nexport const AX_CONVERSATION_LOCATION_ERRORS = {\n  MISSING_LATITUDE: {\n    code: 'LOCATION.MISSING_LATITUDE',\n    message: 'Latitude is required',\n  },\n  MISSING_LONGITUDE: {\n    code: 'LOCATION.MISSING_LONGITUDE',\n    message: 'Longitude is required',\n  },\n  INVALID_LATITUDE: {\n    code: 'LOCATION.INVALID_LATITUDE',\n    message: 'Latitude must be between -90 and 90',\n  },\n  INVALID_LONGITUDE: {\n    code: 'LOCATION.INVALID_LONGITUDE',\n    message: 'Longitude must be between -180 and 180',\n  },\n} as const;\n\n/**\n * URL validation errors\n */\nexport const AX_CONVERSATION_URL_ERRORS = {\n  MISSING_URL: {\n    code: 'URL.MISSING',\n    message: 'URL is required',\n  },\n  INVALID_URL: {\n    code: 'URL.INVALID',\n    message: 'Invalid URL format',\n  },\n} as const;\n\n/**\n * All error messages combined\n */\nexport const AX_CONVERSATION_ERROR_MESSAGES = {\n  MESSAGE: AX_CONVERSATION_MESSAGE_ERRORS,\n  FILE: AX_CONVERSATION_FILE_ERRORS,\n  USER: AX_CONVERSATION_USER_ERRORS,\n  CONVERSATION: AX_CONVERSATION_ERRORS,\n  CONNECTION: AX_CONVERSATION_CONNECTION_ERRORS,\n  LOCATION: AX_CONVERSATION_LOCATION_ERRORS,\n  URL: AX_CONVERSATION_URL_ERRORS,\n} as const;\n\n/**\n * Helper function to format error message with parameters\n * Optimized to avoid creating regex objects in loop\n * @param template - Message template with placeholders\n * @param params - Parameters to replace in template\n * @returns Formatted message\n * \n * @example\n * formatErrorMessage('Message exceeds {maxLength} character limit', { maxLength: 1000 })\n * // Returns: 'Message exceeds 1000 character limit'\n */\nexport function formatErrorMessage(template: string, params: Record<string, string | number>): string {\n  if (!template || !params) {\n    return template || '';\n  }\n\n  return template.replace(/\\{(\\w+)\\}/g, (match, key) => {\n    const value = params[key];\n    return value !== undefined ? String(value) : match;\n  });\n}\n\n/**\n * Error message lookup cache for performance\n * Built once on first access\n */\nlet errorLookupCache: Map<string, AXConversationErrorMessage> | null = null;\n\n/**\n * Build error lookup cache\n * @returns Map of error codes to error messages\n */\nfunction buildErrorLookupCache(): Map<string, AXConversationErrorMessage> {\n  if (errorLookupCache) {\n    return errorLookupCache;\n  }\n\n  errorLookupCache = new Map();\n  \n  for (const category of Object.values(AX_CONVERSATION_ERROR_MESSAGES)) {\n    for (const error of Object.values(category)) {\n      errorLookupCache.set(error.code, error);\n    }\n  }\n  \n  return errorLookupCache;\n}\n\n/**\n * Get error message by code\n * This function can be extended to support i18n by looking up translations\n * Uses caching for better performance\n * @param code - Error code\n * @param params - Optional parameters for message template\n * @returns Error message\n */\nexport function getErrorMessage(code: string, params?: Record<string, string | number>): string {\n  const cache = buildErrorLookupCache();\n  const error = cache.get(code);\n  \n  if (!error) {\n    return `Unknown error: ${code}`;\n  }\n  \n  // Use template if available and params provided\n  if (error.template && params) {\n    return formatErrorMessage(error.template, params);\n  }\n  \n  return error.message;\n}\n\n/**\n * Type for error codes\n * Useful for type-safe error handling\n */\nexport type AXConversationErrorCode = \n  | typeof AX_CONVERSATION_MESSAGE_ERRORS[keyof typeof AX_CONVERSATION_MESSAGE_ERRORS]['code']\n  | typeof AX_CONVERSATION_FILE_ERRORS[keyof typeof AX_CONVERSATION_FILE_ERRORS]['code']\n  | typeof AX_CONVERSATION_USER_ERRORS[keyof typeof AX_CONVERSATION_USER_ERRORS]['code']\n  | typeof AX_CONVERSATION_ERRORS[keyof typeof AX_CONVERSATION_ERRORS]['code']\n  | typeof AX_CONVERSATION_CONNECTION_ERRORS[keyof typeof AX_CONVERSATION_CONNECTION_ERRORS]['code']\n  | typeof AX_CONVERSATION_LOCATION_ERRORS[keyof typeof AX_CONVERSATION_LOCATION_ERRORS]['code']\n  | typeof AX_CONVERSATION_URL_ERRORS[keyof typeof AX_CONVERSATION_URL_ERRORS]['code'];\n","/**\n * Constants\n * Export all constant values\n */\n\nexport * from './error-messages.constants';\n","// Components\nexport * from './components';\n\n// Models\nexport * from './models';\n\n// Services\nexport * from './services';\n\n// Registries\nexport * from './registries';\n\n// Directives\nexport * from './directives';\n\n// Tokens\nexport * from './tokens';\n\n// Plugins\nexport * from './plugins';\n\n// Module & Providers\nexport * from './conversation.module';\n\n// Utils\nexport * from './utils';\n\n// Constants\nexport * from './constants';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["applyLocalPreview","createLocalPreviewUrl","mergeUploadResult","revokeObjectUrl","toUploaderReference","loose","str","num","i1","i2","i3","i4","MB","blobUrl","mediaDuration","i5"],"mappings":"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"}